py2ls 0.1.10.0__tar.gz → 0.1.10.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/PKG-INFO +1 -1
- py2ls-0.1.10.1/py2ls/.git/COMMIT_EDITMSG +1 -0
- py2ls-0.1.10.1/py2ls/.git/FETCH_HEAD +1 -0
- py2ls-0.1.10.1/py2ls/.git/index +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/logs/HEAD +1 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/logs/refs/heads/main +1 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/logs/refs/remotes/origin/HEAD +1 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/logs/refs/remotes/origin/main +1 -0
- py2ls-0.1.10.1/py2ls/.git/objects/27/aa6074f652bc6f7078f8647489d9ee8e24f0e2 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/28/c2969d785c1b892c2a96b3f00eba63a59811b3 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/2a/fdf45791a26d42ccead35ace76a8f0b2a56561 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/34/b6f3a2ee84f39bed4eee57f2c0e0afb994feb1 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/35/1a5f491ab97eee9d1ee699478d75a8bb5d3dc2 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/39/b13be65125556784e44c7a1d9821703c7ab67e +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/3b/507acc7f23391644cc0b824b1e79fd2677a362 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/3d/9d10d27724657a436c65a6254bfd213d4b3562 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/47/6cbd5a7c5e35cddef2f8a38bdc4896d403b095 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/78/063f4c863fc371ec0313303c0a81283b35d9b6 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/82/70b319ce4046854fbe7dc41054b6c2d112dab2 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/85/aee46f478e9afdb84d50a05242c53b04ed2e21 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/86/e288b46f8fe179907e4413f665aeb5053fddb1 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/94/f7dbe88e80c4205a901b71eb8f181974376bba +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/9b/ec5ee2236ee2d5532c36bfd132e23c58fdb69c +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/b3/4f7f271c6d6105e35a6556ffda71d03afe8c96 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/b3/69579064bde9de9a19d114fc33e4e48cc8c0e4 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/bf/b54d65922ce1dfda1aaa014913a54e7172d0bc +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/c1/397c6ed72c4e20ef6b9ab83163e9a6baba5b45 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/cc/45df1d317a2eb63ff1ff3a5f3b4a9f98fd92b5 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/d6/39e8af592cd75a318d8affddd1bcc70c2095f2 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/db/3f2cd643292057936230b95cf7ec3046affe11 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/de/214c626ac2dd2685bfaa0bc0fc20f528d014d7 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/e4/6c715352db9fe3c887a635f1916df4ca1f4ff9 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/e5/0580a0bd1e1b3d29f834382b80fceb61d5cf0c +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/ec/d980279432b13f0374b90ca439a6329cdece0f +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/ee/cee64eacaff022dcdc509c0c2b1da492f21060 +0 -0
- py2ls-0.1.10.1/py2ls/.git/objects/f5/61c3c1bf1c9ea9c9d1f556a7be2869f71f3bdf +0 -0
- py2ls-0.1.10.1/py2ls/.git/refs/heads/main +1 -0
- py2ls-0.1.10.1/py2ls/.git/refs/remotes/origin/main +1 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/batman.py +62 -47
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/ips.py +1 -1
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/netfinder.py +100 -1
- py2ls-0.1.10.1/py2ls/ocr.py +557 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/plot.py +24 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/pyproject.toml +1 -1
- py2ls-0.1.10.0/py2ls/.git/COMMIT_EDITMSG +0 -1
- py2ls-0.1.10.0/py2ls/.git/FETCH_HEAD +0 -1
- py2ls-0.1.10.0/py2ls/.git/index +0 -0
- py2ls-0.1.10.0/py2ls/.git/refs/heads/main +0 -1
- py2ls-0.1.10.0/py2ls/.git/refs/remotes/origin/main +0 -1
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/README.md +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.DS_Store +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/HEAD +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/config +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/description +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/applypatch-msg.sample +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/commit-msg.sample +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/fsmonitor-watchman.sample +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/post-update.sample +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/pre-applypatch.sample +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/pre-commit.sample +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/pre-merge-commit.sample +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/pre-push.sample +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/pre-rebase.sample +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/pre-receive.sample +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/prepare-commit-msg.sample +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/push-to-checkout.sample +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/update.sample +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/info/exclude +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/01/d5bd8065e6860c0bd23ff9fa57161806a099e1 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/09/08da26de58c114225ad81f484b80bf5d351b34 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/0b/409e1bc918277010f5679b402d1d1dda53e15c +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/12/c2808a1b3a4d0892a4154dfba1e2ae3770fa73 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/14/449a0e6ba4ea2f1a73acf63ef91c9c6193f9ed +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/15/a8e468aacfcb440e090020f36d0b985d45da23 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/1a/b4585881a6a42889f01aa0cfe25fd5acfaf46f +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/1c/3f92adda34344bcbbbf9d409c79855ae2aaea8 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/1c/9314c5f69b9390068a2a8616875d974849d71f +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/1d/fe9d9633b24ea560354f4f93d39c6e5f163ea0 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/20/72c28e83f4347959d29f7b3a6c1fc3e4ee6b59 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/24/6b368b986f758630c46dc02b7fa512b53422f7 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/25/b796accd261b9135fd32a2c00785f68edf6c46 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/2a/ae95d517d213b660bf4f65a4e0cfae7bb893eb +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/30/a2f8da47ee947811dc8d993f5a06a45de374f4 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/32/fd627b62fad7cf3b2f9e34ab9777126a0987ad +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/34/9e31b6a3634cea102ce5588b98c11cc1738605 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/36/b4a1b7403abc6c360f8fe2cb656ab945254971 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/36/e56a361f526eafa59c5235a5c990bf288b5f9c +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/36/ef43e50009e59db11812c258846d9e38718173 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/39/7ead045fbbcfb17c62019eb18fe21ed05dbee5 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/3b/bd972aa7ad680858f8dfbd0f7fcd97756f0d6f +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/3c/bbe5f4173d165127b9ad96119f1ec24c306ffc +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/3f/d6561300938afbb3d11976cf9c8f29549280d9 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/41/dcf4b3bf0460946b2da93776cf9e836d62178f +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/43/dbd49b2ee367c5434dd545e3b5795434f2ef0b +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/45/b1b6178bacbfc997811a998b5cc60c1ea7fac8 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/48/a88fc5806305d0bb0755ee6801161b79696972 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/4f/7afb40dff2153d857fc85748c2eecb85125042 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/50/08ddfcf53c02e82d7eee2e57c38e5672ef89f6 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/53/e0deb1cb4c2c606bced6e7f9a66b0fda60980d +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/56/e4e8b2d5545e0256090f45aa8fc42c5fe067d0 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/57/63d0c52f5c9c69e89d514a1f96034947abe21a +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/57/bd1c0199483ab316235b094543b85edec6c35e +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/58/20a729045d4dc7e37ccaf8aa8eec126850afe2 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/59/380c4c26bdcd4d9b71ae3e2e35f05b3f26c5ab +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/5a/192565abf89c9d765af846ce6d53a92b1ce7ad +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/60/f273eb1c412d916fa3f11318a7da7a9911b52a +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/61/570cec8c061abe74121f27f5face6c69b98f99 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/62/4488173ed2c8936fa5cea3cf5dd3f26a30b86e +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/62/7c81b23b4e56e87b042b650b0103653cc9e34a +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/62/d90ccf8cbefdc2e4fd475e7c6f4f76e9fdf801 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/63/100154b27846e8010e55b6bf4b3d7762c14c5f +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/64/27a4edff08f93d98f511418423f09f2ab90bcd +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/66/6227eeeba24073e63811e89f1449f3d958f183 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/66/c998778721d424bd0aae80602dabbffa93af2e +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/68/6df3072c8b025fb18106ed2df505994ad062a9 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/69/13c452ca319f7cbf6a0836dc10a5bb033c84e4 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/6a/52e747a2b349b128d1490d9e896d2323818eb7 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/6b/7fde264d93a7a0986d394c46c7650d0ce2ab92 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/6c/cebb29b7f3f5b0c889f6dadbf9ff066554587d +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/6d/c2cdf4a84e538e5d4777486aeff87e42f41799 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/6d/ee29dbdcc84edeeacede105110446f3ccac963 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/71/36b2074a2754be8b58127d82250e5b37e3c373 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/72/245a05b0966011cb381e6b32b0465000e969ab +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/72/e4179337639859678ddaecf38b16f33aaec8e1 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/78/3d4167bc95c9d2175e0df03ef1c1c880ba75ab +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/79/7ae089b2212a937840e215276005ce76881307 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/7e/5956c806b5edc344d46dab599dec337891ba1f +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/81/8f26b7bf042269729020cf944fc362d66ba27e +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/84/59071b722a255b774a80b27746033f8141ab39 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/87/ef1fc3f7f1ddc4d0ab9b3e65381ce9f3388621 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/8b/84f56978e1de8f2ae82abce5f8b3e182d365cd +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/8e/55a7d2b96184030211f20c9b9af201eefcac82 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/91/c69ad88fe0ba94aa7859fb5f7edac5e6f1a3f7 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/94/74152b4b463d70ae5ad07f0c658be3e296026b +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/97/1aef09ea939f46b60b9646f8d524c78a9220f4 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/9d/0df52899fe95279059286d9c0ec42287edc168 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/a1/5389729850729fc7bd78a54f26fce77f30be12 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/a1/906da89d1174f74867800c74c43af36253bd5e +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/a4/63fdd23e5efd713db8a71f316f3a1c7bd60916 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/a5/ec8f74642fbba27f7ea78c53b372ae0c7dedce +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/a7/3e13eafee65c5b8d73ad2d3ea46d0eee82f0d3 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/b0/56be4be89ba6b76949dd641df45bb7036050c8 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/b0/9cd7856d58590578ee1a4f3ad45d1310a97f87 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/b2/18e6a0f0f1c4df8cdefa9852058348abc713b7 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/b5/61831c7dce8ea51e7ee6b6fa35745f14d8242d +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/b7/2c9e75ab7d0afe594664650aa8f6c772f5ac64 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/bb/81ccc0513f18fc160b54a82861e9a80d23f4f6 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/bb/934eb33bc1a8b85630bf680caffd99560c1b8f +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/bf/67907e337021ebff434e02b19b30a741c144af +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/c1/20fc812b9ad311c34a3608512d6a9d976bb48e +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/c4/cba65f1163661999ee4b8ed23342b63bc1300c +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/c6/7f17e5707313600efcb85e9a3fedea35dba591 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/c6/f32aced880bd165a251cb52b26b0c1107e2141 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/cd/822b3574a88ebdd1ed82fd6983f37e626d52b4 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/cf/0c0d9c6fb09473aaeb7f7e2edbd770c3f2ef3d +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/d2/992df305f4b56a466a2f221aeb182ddd20f418 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/d6/9ab1c4aadf279936dd778e8346ba60f74705b6 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/d8/4688b54c0040a30976b3a6540bc47adf7ce680 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/d9/005f2cc7fc4e65f14ed5518276007c08cf2fd0 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/d9/c2403fd166ce791b4e9d0c6792ed8342c71fcd +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/d9/dfa5aee51e92a541b707e8e7baea6f06deff98 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/db/141dbaa93594df2a8156182f361ee4db829359 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/db/ffa8ea7bda721d0cee7b9e4ce5b2ef927733ff +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/dc/c2bdbafb3296e09d9ee4955cfa55d275825f94 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/dc/cdbd4266765d840be2ae35ab1752a0fa312c16 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/dd/87fb5f606fe380d81e6fe3a2c98f9f99e3e09b +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/df/e0770424b2a19faf507a501ebfc23be8f54e7b +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/e2/f2f8f4c25e62a297fc55f36acc6b01cfbab76f +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/e3/1356f90ea6dd0577b5e0b40b206319adcbf085 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/e3/5a4dafc50850cacac7bf76c56db2715cbda2c4 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/e9/391ffe371f1cc43b42ef09b705d9c767c2e14f +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/ea/3a18cc75e53792744ef754e05d3f4481768c13 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/ec/40fd8bf8e4c342534a9fc020289e402ba6bc9d +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/f1/e50757fddc28b445545dc7e2759b54cdd0f42e +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/f4/b64d3107b39e3ad6f540c6607004ea34e6c024 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/f4/ba7f815b886797b73fede071d86e0c134d2bc7 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/f6/44a8ff56fa035105fc517cbb1ac46c3d8e349a +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/f7/c98ba5c2f903e603b1f5e63d49fbc8a43815cc +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/f9/045a08e96eb76848fc4d68e3e3e687cca39a2d +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/fa/147e6bb78a2e8db241d231295fd7f1ed061af8 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/fc/292e793ecfd42240ac43be407023bd731fa9e7 +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/refs/remotes/origin/HEAD +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.gitattributes +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.gitignore +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/LICENSE +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/README.md +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/__init__.py +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/brain_atlas.py +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/chat.py +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/correlators.py +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/.DS_Store +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/db2ls_sql_chtsht.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/docs_links.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/lang_code_iso639.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style1.pdf +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style2.pdf +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style3.pdf +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style4.pdf +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style5.pdf +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style6.pdf +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style7.pdf +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style8.pdf +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style9.pdf +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style1.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style10.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style11.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style12.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style2.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style3.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style4.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style5.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style6.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style7.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style8.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style9.json +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/db2ls.py +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/doc.py +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/export_requirements.py +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/freqanalysis.py +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/ich2ls.py +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/setuptools-70.1.0-py3-none-any.whl +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/sleep_events_detectors.py +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/stats.py +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/translator.py +0 -0
- {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/wb_detector.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
reg_update
|
@@ -0,0 +1 @@
|
|
1
|
+
86e288b46f8fe179907e4413f665aeb5053fddb1 branch 'main' of https://github.com/Jianfengliu0413/py2ls
|
Binary file
|
@@ -19,3 +19,4 @@ d84688b54c0040a30976b3a6540bc47adf7ce680 32fd627b62fad7cf3b2f9e34ab9777126a0987a
|
|
19
19
|
1c3f92adda34344bcbbbf9d409c79855ae2aaea8 bf67907e337021ebff434e02b19b30a741c144af Jianfeng <Jianfeng.Liu0413@gmail.com> 1720948339 +0200 commit: update
|
20
20
|
bf67907e337021ebff434e02b19b30a741c144af a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng <Jianfeng.Liu0413@gmail.com> 1721137352 +0200 commit: update ips
|
21
21
|
a15389729850729fc7bd78a54f26fce77f30be12 6dc2cdf4a84e538e5d4777486aeff87e42f41799 Jianfeng <Jianfeng.Liu0413@gmail.com> 1723527985 +0200 commit: update
|
22
|
+
6dc2cdf4a84e538e5d4777486aeff87e42f41799 86e288b46f8fe179907e4413f665aeb5053fddb1 Jianfeng <Jianfeng.Liu0413@gmail.com> 1725537214 +0200 commit: reg_update
|
@@ -19,3 +19,4 @@ d84688b54c0040a30976b3a6540bc47adf7ce680 32fd627b62fad7cf3b2f9e34ab9777126a0987a
|
|
19
19
|
1c3f92adda34344bcbbbf9d409c79855ae2aaea8 bf67907e337021ebff434e02b19b30a741c144af Jianfeng <Jianfeng.Liu0413@gmail.com> 1720948339 +0200 commit: update
|
20
20
|
bf67907e337021ebff434e02b19b30a741c144af a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng <Jianfeng.Liu0413@gmail.com> 1721137352 +0200 commit: update ips
|
21
21
|
a15389729850729fc7bd78a54f26fce77f30be12 6dc2cdf4a84e538e5d4777486aeff87e42f41799 Jianfeng <Jianfeng.Liu0413@gmail.com> 1723527985 +0200 commit: update
|
22
|
+
6dc2cdf4a84e538e5d4777486aeff87e42f41799 86e288b46f8fe179907e4413f665aeb5053fddb1 Jianfeng <Jianfeng.Liu0413@gmail.com> 1725537214 +0200 commit: reg_update
|
@@ -137,3 +137,4 @@ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be1
|
|
137
137
|
a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721326072 +0200 remote set-head
|
138
138
|
a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@jflmbp.speedport.ip> 1723527981 +0200 remote set-head
|
139
139
|
6dc2cdf4a84e538e5d4777486aeff87e42f41799 6dc2cdf4a84e538e5d4777486aeff87e42f41799 Jianfeng Liu <macjianfeng@jflmbp.speedport.ip> 1723527990 +0200 remote set-head
|
140
|
+
86e288b46f8fe179907e4413f665aeb5053fddb1 86e288b46f8fe179907e4413f665aeb5053fddb1 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1725537218 +0200 remote set-head
|
@@ -18,3 +18,4 @@ d84688b54c0040a30976b3a6540bc47adf7ce680 32fd627b62fad7cf3b2f9e34ab9777126a0987a
|
|
18
18
|
1c3f92adda34344bcbbbf9d409c79855ae2aaea8 bf67907e337021ebff434e02b19b30a741c144af Jianfeng <Jianfeng.Liu0413@gmail.com> 1720948342 +0200 update by push
|
19
19
|
bf67907e337021ebff434e02b19b30a741c144af a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng <Jianfeng.Liu0413@gmail.com> 1721137354 +0200 update by push
|
20
20
|
a15389729850729fc7bd78a54f26fce77f30be12 6dc2cdf4a84e538e5d4777486aeff87e42f41799 Jianfeng <Jianfeng.Liu0413@gmail.com> 1723527989 +0200 update by push
|
21
|
+
6dc2cdf4a84e538e5d4777486aeff87e42f41799 86e288b46f8fe179907e4413f665aeb5053fddb1 Jianfeng <Jianfeng.Liu0413@gmail.com> 1725537218 +0200 update by push
|
@@ -0,0 +1 @@
|
|
1
|
+
86e288b46f8fe179907e4413f665aeb5053fddb1
|
@@ -0,0 +1 @@
|
|
1
|
+
86e288b46f8fe179907e4413f665aeb5053fddb1
|
@@ -7,20 +7,19 @@ import schedule
|
|
7
7
|
import time
|
8
8
|
from datetime import datetime
|
9
9
|
import os
|
10
|
+
from pprint import pp
|
11
|
+
import json
|
10
12
|
|
11
13
|
|
12
|
-
|
13
|
-
"",
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
),
|
22
|
-
f"Pappelweg 8\n72076 Tübingen\n\n",
|
23
|
-
]
|
14
|
+
def extract_kv(
|
15
|
+
dir_data="/Users/macjianfeng/Dropbox/github/python/py2ls/confidential_data/gmail_login.json",
|
16
|
+
idx=0,
|
17
|
+
): # select the index
|
18
|
+
with open(dir_data, "r") as file:
|
19
|
+
email_login = json.load(file)
|
20
|
+
for i, (user, pd) in enumerate(email_login.items()):
|
21
|
+
if i == idx:
|
22
|
+
return user, pd
|
24
23
|
|
25
24
|
|
26
25
|
def email_to(**kwargs):
|
@@ -40,7 +39,10 @@ def email_to(**kwargs):
|
|
40
39
|
who, what, subject = None, None, None
|
41
40
|
attachments = False
|
42
41
|
pause_sec = False # default 10 seconds pause
|
43
|
-
|
42
|
+
|
43
|
+
signature_styles = extract_kv(idx=1)[1] # signature list
|
44
|
+
signature = signature_styles[0] # default signature,None
|
45
|
+
verbose = True
|
44
46
|
|
45
47
|
# params config
|
46
48
|
for k, v in kwargs.items():
|
@@ -67,15 +69,14 @@ def email_to(**kwargs):
|
|
67
69
|
if any(["sig" in k.lower()]): # 'attachments', 'file'
|
68
70
|
signature = v # optional
|
69
71
|
if not isinstance(v, str):
|
72
|
+
print(signature_styles)
|
70
73
|
signature = signature_styles[v]
|
71
|
-
|
72
|
-
|
73
|
-
email_address = "andyandhope@gmail.com"
|
74
|
-
email_password = "myff ltls sfym wehe" # this is fake info
|
74
|
+
if any(["verb" in k.lower(), "show" in k.lower()]): # 'verbose', 'show'
|
75
|
+
verbose = v # verbose
|
75
76
|
|
76
77
|
# Create email message
|
77
78
|
message = MIMEMultipart()
|
78
|
-
message["From"] =
|
79
|
+
message["From"] = extract_kv()[0]
|
79
80
|
message["To"] = who
|
80
81
|
message["Subject"] = subject
|
81
82
|
|
@@ -97,10 +98,9 @@ def email_to(**kwargs):
|
|
97
98
|
part.set_payload(attachment.read())
|
98
99
|
encoders.encode_base64(part)
|
99
100
|
|
100
|
-
fname = os.path.basename(file)
|
101
|
-
print(fname)
|
102
101
|
part.add_header(
|
103
|
-
"Content-Disposition",
|
102
|
+
"Content-Disposition",
|
103
|
+
f'attachment; filename= "{os.path.basename(file)}"',
|
104
104
|
)
|
105
105
|
message.attach(part)
|
106
106
|
except FileNotFoundError:
|
@@ -109,13 +109,21 @@ def email_to(**kwargs):
|
|
109
109
|
print(f"Error attaching file {file}: {e}")
|
110
110
|
if pause_sec:
|
111
111
|
time.sleep(pause_sec)
|
112
|
+
|
112
113
|
# Send the email
|
113
114
|
try:
|
114
115
|
with smtplib.SMTP("smtp.gmail.com", 587) as server:
|
115
116
|
server.starttls()
|
116
|
-
server.login(
|
117
|
-
server.sendmail(
|
118
|
-
|
117
|
+
server.login(extract_kv()[0], extract_kv()[1])
|
118
|
+
server.sendmail(extract_kv()[0], who, message.as_string())
|
119
|
+
if verbose:
|
120
|
+
if attachments:
|
121
|
+
print(
|
122
|
+
f'\nEmail successfully sent to:\nto:"{who}"\nsubject:{subject}\nattached:'
|
123
|
+
)
|
124
|
+
pp(attachments)
|
125
|
+
else:
|
126
|
+
print(f'\nEmail successfully sent to:\nto:"{who}"\nsubject:{subject}')
|
119
127
|
except Exception as e:
|
120
128
|
print(f"Failed to send email: {e}")
|
121
129
|
|
@@ -158,26 +166,33 @@ def example_job():
|
|
158
166
|
|
159
167
|
|
160
168
|
if __name__ == "__main__":
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
#
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
169
|
+
pass
|
170
|
+
# # Schedule the job to run every minute
|
171
|
+
# schedule.every(1).minutes.do(example_job)
|
172
|
+
|
173
|
+
# while True:
|
174
|
+
# schedule.run_pending()
|
175
|
+
# time.sleep(1)
|
176
|
+
|
177
|
+
# # example2:
|
178
|
+
# email_to(
|
179
|
+
# who="Jianfeng.Liu@medizin.uni-tuebingen.de",
|
180
|
+
# subj="test",
|
181
|
+
# wha="this is the body",
|
182
|
+
# signat="\n\n Best, Jianfeng\n",
|
183
|
+
# att="/Users/macjianfeng/Dropbox/Downloads/_*_doc-xlsx/20240822-preprints_full_20190101_20201031-2.xlsx",
|
184
|
+
# )
|
185
|
+
|
186
|
+
# # example3:
|
187
|
+
# email_to(
|
188
|
+
# who="Jianfeng.Liu@medizin.uni-tuebingen.de",
|
189
|
+
# subj="test",
|
190
|
+
# wha="this is the test",
|
191
|
+
# signat=2,
|
192
|
+
# # att="/Users/macjianfeng/Dropbox/Downloads/_*_doc-xlsx/20240822-preprints_full_20190101_20201031-2.xlsx",
|
193
|
+
# )
|
194
|
+
|
195
|
+
# # example_4
|
196
|
+
# print(extract_kv(idx=0))
|
197
|
+
# print(extract_kv(idx=0)[0])
|
198
|
+
# print(extract_kv(idx=1))
|
@@ -295,7 +295,7 @@ def is_text(s):
|
|
295
295
|
return has_alpha and has_non_alpha
|
296
296
|
|
297
297
|
|
298
|
-
def strcmp(search_term, candidates, ignore_case=True, verbose=
|
298
|
+
def strcmp(search_term, candidates, ignore_case=True, verbose=False, scorer="WR"):
|
299
299
|
"""
|
300
300
|
Compares a search term with a list of candidate strings and finds the best match based on similarity score.
|
301
301
|
|
@@ -63,6 +63,36 @@ def user_agent(
|
|
63
63
|
return output_ua
|
64
64
|
|
65
65
|
|
66
|
+
def get_tags(content, ascending=True):
|
67
|
+
tag_names = set()
|
68
|
+
|
69
|
+
# Iterate through all tags in the parsed HTML
|
70
|
+
for tag in content.find_all(True): # `True` finds all tags
|
71
|
+
tag_names.add(tag.name) # Add the tag name to the set
|
72
|
+
|
73
|
+
# Convert set to a sorted list for easier reading (optional)
|
74
|
+
if ascending is None:
|
75
|
+
return tag_names
|
76
|
+
else:
|
77
|
+
if ascending:
|
78
|
+
return sorted(tag_names)
|
79
|
+
else:
|
80
|
+
return tag_names
|
81
|
+
|
82
|
+
|
83
|
+
def get_attr(content, where, attr):
|
84
|
+
all_tags = get_tags(content)
|
85
|
+
if all([where, attr]):
|
86
|
+
if where in all_tags:
|
87
|
+
element_ = content.find_all(where)
|
88
|
+
return [i[attr] for i in element_]
|
89
|
+
else:
|
90
|
+
print(
|
91
|
+
f"cannot find attr {attr} in tag_name{where}\n or possibly cannot find the tag_names:"
|
92
|
+
)
|
93
|
+
pp(all_tags)
|
94
|
+
|
95
|
+
|
66
96
|
def extract_text_from_content(
|
67
97
|
content, content_type="text/html", where=None, what=None, extend=True, **kwargs
|
68
98
|
):
|
@@ -128,7 +158,9 @@ def extract_text_from_content(
|
|
128
158
|
result_set = content.find_all(where, **search_kwargs)
|
129
159
|
else:
|
130
160
|
result_set = content.find_all(where, attrs=dict(**search_kwargs))
|
131
|
-
|
161
|
+
if "get" in kwargs:
|
162
|
+
attr = kwargs["get"]
|
163
|
+
return get_attr(content, where, attr)
|
132
164
|
if not result_set:
|
133
165
|
print("Failed: check the 'attrs' setting: attrs={'id':'xample'}")
|
134
166
|
if extend:
|
@@ -216,6 +248,60 @@ def get_cookies(url, login={"username": "your_username", "password": "your_passw
|
|
216
248
|
return cookies_dict
|
217
249
|
|
218
250
|
|
251
|
+
### 更加平滑地移动鼠标, 这样更容易反爬
|
252
|
+
def scroll_smth_steps(driver, scroll_pause=0.5, min_step=200, max_step=600):
|
253
|
+
"""Smoothly scrolls down the page to trigger lazy loading."""
|
254
|
+
current_scroll_position = 0
|
255
|
+
end_of_page = driver.execute_script("return document.body.scrollHeight")
|
256
|
+
|
257
|
+
while current_scroll_position < end_of_page:
|
258
|
+
step = random.randint(min_step, max_step)
|
259
|
+
driver.execute_script(f"window.scrollBy(0, {step});")
|
260
|
+
time.sleep(scroll_pause)
|
261
|
+
|
262
|
+
# Update the current scroll position
|
263
|
+
current_scroll_position += step
|
264
|
+
end_of_page = driver.execute_script("return document.body.scrollHeight")
|
265
|
+
|
266
|
+
|
267
|
+
def scroll_inf2end(driver, scroll_pause=1):
|
268
|
+
"""Continuously scrolls until the end of the page is reached."""
|
269
|
+
last_height = driver.execute_script("return document.body.scrollHeight")
|
270
|
+
|
271
|
+
while True:
|
272
|
+
# Scroll to the bottom
|
273
|
+
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
|
274
|
+
time.sleep(scroll_pause)
|
275
|
+
|
276
|
+
# Get the new height after scrolling
|
277
|
+
new_height = driver.execute_script("return document.body.scrollHeight")
|
278
|
+
if new_height == last_height:
|
279
|
+
break # Exit if no new content is loaded
|
280
|
+
last_height = new_height
|
281
|
+
|
282
|
+
|
283
|
+
def corr_by_kind(wait_until_kind):
|
284
|
+
"""
|
285
|
+
Map the 'wait_until_kind' string to the appropriate Selenium By strategy.
|
286
|
+
"""
|
287
|
+
if "tag" in wait_until_kind:
|
288
|
+
return By.TAG_NAME
|
289
|
+
elif "css" in wait_until_kind:
|
290
|
+
return By.CSS_SELECTOR
|
291
|
+
elif "id" in wait_until_kind:
|
292
|
+
return By.ID
|
293
|
+
elif "name" in wait_until_kind:
|
294
|
+
return By.NAME
|
295
|
+
elif "class" in wait_until_kind:
|
296
|
+
return By.CLASS_NAME
|
297
|
+
elif "path" in wait_until_kind:
|
298
|
+
return By.XPATH
|
299
|
+
elif "link" in wait_until_kind or "text" in wait_until_kind:
|
300
|
+
return By.LINK_TEXT
|
301
|
+
else:
|
302
|
+
raise ValueError(f"Unsupported wait_until_kind: {wait_until_kind}")
|
303
|
+
|
304
|
+
|
219
305
|
def fetch_all(
|
220
306
|
url,
|
221
307
|
parser="lxml",
|
@@ -224,6 +310,8 @@ def fetch_all(
|
|
224
310
|
timeout=10,
|
225
311
|
retry=2,
|
226
312
|
wait=0,
|
313
|
+
wait_until=None,
|
314
|
+
wait_until_kind=None,
|
227
315
|
scroll_try=3,
|
228
316
|
login_url=None,
|
229
317
|
username=None,
|
@@ -308,7 +396,10 @@ def fetch_all(
|
|
308
396
|
prefs = {"profile.managed_default_content_settings.images": 2}
|
309
397
|
chrome_options.add_experimental_option("prefs", prefs)
|
310
398
|
# chrome_options.page_load_strategy = capability
|
399
|
+
|
311
400
|
service = Service(ChromeDriverManager().install())
|
401
|
+
# driver_path='/Users/macjianfeng/.wdm/drivers/chromedriver/mac64/127.0.6533.119/chromedriver-mac-arm64/chromedriver'
|
402
|
+
# service=Service(executable_path=driver_path)
|
312
403
|
|
313
404
|
driver_ = webdriver.Chrome(service=service, options=chrome_options)
|
314
405
|
|
@@ -323,6 +414,11 @@ def fetch_all(
|
|
323
414
|
wait_ = 0
|
324
415
|
driver_.implicitly_wait(wait_)
|
325
416
|
|
417
|
+
if wait_until is not None and wait_until_kind is not None:
|
418
|
+
strategy = corr_by_kind(wait_until_kind)
|
419
|
+
WebDriverWait(driver_, timeout).until(
|
420
|
+
EC.presence_of_element_located((strategy, wait_until))
|
421
|
+
)
|
326
422
|
if login_url and login_dict:
|
327
423
|
cookies = get_cookies(url=login_url, login=login_dict)
|
328
424
|
driver_.get(url)
|
@@ -358,6 +454,9 @@ def fetch_all(
|
|
358
454
|
# EC.presence_of_element_located((by, where))
|
359
455
|
# )
|
360
456
|
|
457
|
+
# # scroll down the page by a certain number of pixels
|
458
|
+
scroll_smth_steps(driver_)
|
459
|
+
|
361
460
|
# 设置轮询
|
362
461
|
for attempt in range(scroll_try):
|
363
462
|
page_source = driver_.page_source
|