From ef0acf838bd22383a17c05cc4f1cb83d861695a3 Mon Sep 17 00:00:00 2001 From: naibo Date: Tue, 11 Jul 2023 23:07:39 +0800 Subject: [PATCH] Add Payment QR Code --- .temp_to_pub/.gitignore | 2 +- .../EasySpider.bat | 0 .../EasySpider.exe | Bin .../execution_instances/0.json | 0 .../execution_instances/1.json | 0 .../execution_instances/2.json | 0 .../execution_instances/3.json | 0 .../execution_instances/4.json | 0 .../execution_instances/5.json | 0 .../readme.txt | 0 .../tasks/0.json | 0 .../tasks/1.json | 0 .../tasks/10.json | 0 .../tasks/106.json | 0 .../tasks/107.json | 0 .../tasks/108.json | 0 .../tasks/109.json | 0 .../tasks/11.json | 0 .../tasks/110.json | 0 .../tasks/111.json | 0 .../tasks/112.json | 0 .../tasks/113.json | 0 .../tasks/114.json | 0 .../tasks/115.json | 0 .../tasks/116.json | 0 .../tasks/117.json | 0 .../tasks/118.json | 0 .../tasks/12.json | 0 .../tasks/13.json | 0 .../tasks/14.json | 0 .../tasks/15.json | 0 .../tasks/16.json | 0 .../tasks/17.json | 0 .../tasks/18.json | 0 .../tasks/19.json | 0 .../tasks/2.json | 0 .../tasks/20.json | 0 .../tasks/21.json | 0 .../tasks/22.json | 0 .../tasks/23.json | 0 .../tasks/24.json | 0 .../tasks/25.json | 0 .../tasks/26.json | 0 .../tasks/27.json | 0 .../tasks/28.json | 0 .../tasks/29.json | 0 .../tasks/3.json | 0 .../tasks/30.json | 0 .../tasks/31.json | 0 .../tasks/32.json | 0 .../tasks/33.json | 0 .../tasks/34.json | 0 .../tasks/35.json | 0 .../tasks/36.json | 0 .../tasks/37.json | 0 .../tasks/38.json | 0 .../tasks/39.json | 0 .../tasks/4.json | 0 .../tasks/40.json | 0 .../tasks/41.json | 0 .../tasks/42.json | 0 .../tasks/43.json | 0 .../tasks/44.json | 0 .../tasks/45.json | 0 .../tasks/46.json | 0 .../tasks/47.json | 0 .../tasks/48.json | 0 .../tasks/49.json | 0 .../tasks/5.json | 0 .../tasks/50.json | 0 .../tasks/6.json | 0 .../tasks/7.json | 0 .../tasks/8.json | 0 .../tasks/9.json | 0 .../软件使用说明.txt | 0 .../EasySpider_windows_x64/Readme.txt | 2 +- .../EasySpider_windows_x64/软件使用说明.txt | 2 +- .../Code/easyspider_executestage.py | 1546 ----------------- .../EasySpider_windows_x86/Code/myChrome.py | 165 -- .../EasySpider_windows_x86/Code/utils.py | 348 ---- .temp_to_pub/compress.py | 30 +- ElectronJS/README.md | 8 +- ElectronJS/clean_and_release_win32.cmd | 28 +- Readme.md | 14 + media/QRCODES.png | Bin 0 -> 225510 bytes 85 files changed, 50 insertions(+), 2095 deletions(-) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/EasySpider.bat (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/EasySpider.exe (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/execution_instances/0.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/execution_instances/1.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/execution_instances/2.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/execution_instances/3.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/execution_instances/4.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/execution_instances/5.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/readme.txt (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/0.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/1.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/10.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/106.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/107.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/108.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/109.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/11.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/110.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/111.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/112.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/113.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/114.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/115.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/116.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/117.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/118.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/12.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/13.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/14.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/15.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/16.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/17.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/18.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/19.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/2.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/20.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/21.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/22.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/23.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/24.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/25.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/26.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/27.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/28.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/29.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/3.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/30.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/31.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/32.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/33.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/34.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/35.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/36.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/37.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/38.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/39.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/4.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/40.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/41.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/42.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/43.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/44.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/45.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/46.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/47.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/48.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/49.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/5.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/50.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/6.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/7.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/8.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/tasks/9.json (100%) rename .temp_to_pub/{EasySpider_windows_x86 => EasySpider_windows_x32}/软件使用说明.txt (100%) delete mode 100644 .temp_to_pub/EasySpider_windows_x86/Code/easyspider_executestage.py delete mode 100644 .temp_to_pub/EasySpider_windows_x86/Code/myChrome.py delete mode 100644 .temp_to_pub/EasySpider_windows_x86/Code/utils.py create mode 100644 media/QRCODES.png diff --git a/.temp_to_pub/.gitignore b/.temp_to_pub/.gitignore index f703a93..5bab86b 100644 --- a/.temp_to_pub/.gitignore +++ b/.temp_to_pub/.gitignore @@ -1,6 +1,6 @@ EasySpider_MacOS_all_arch/easyspider_executestage EasySpider_Linux64_x64/user_data -EasySpider_windows_x86/user_data +EasySpider_windows_x32/user_data EasySpider EasySpider.app/ EasySpider_windows_x64/user_data diff --git a/.temp_to_pub/EasySpider_windows_x86/EasySpider.bat b/.temp_to_pub/EasySpider_windows_x32/EasySpider.bat similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/EasySpider.bat rename to .temp_to_pub/EasySpider_windows_x32/EasySpider.bat diff --git a/.temp_to_pub/EasySpider_windows_x86/EasySpider.exe b/.temp_to_pub/EasySpider_windows_x32/EasySpider.exe similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/EasySpider.exe rename to .temp_to_pub/EasySpider_windows_x32/EasySpider.exe diff --git a/.temp_to_pub/EasySpider_windows_x86/execution_instances/0.json b/.temp_to_pub/EasySpider_windows_x32/execution_instances/0.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/execution_instances/0.json rename to .temp_to_pub/EasySpider_windows_x32/execution_instances/0.json diff --git a/.temp_to_pub/EasySpider_windows_x86/execution_instances/1.json b/.temp_to_pub/EasySpider_windows_x32/execution_instances/1.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/execution_instances/1.json rename to .temp_to_pub/EasySpider_windows_x32/execution_instances/1.json diff --git a/.temp_to_pub/EasySpider_windows_x86/execution_instances/2.json b/.temp_to_pub/EasySpider_windows_x32/execution_instances/2.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/execution_instances/2.json rename to .temp_to_pub/EasySpider_windows_x32/execution_instances/2.json diff --git a/.temp_to_pub/EasySpider_windows_x86/execution_instances/3.json b/.temp_to_pub/EasySpider_windows_x32/execution_instances/3.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/execution_instances/3.json rename to .temp_to_pub/EasySpider_windows_x32/execution_instances/3.json diff --git a/.temp_to_pub/EasySpider_windows_x86/execution_instances/4.json b/.temp_to_pub/EasySpider_windows_x32/execution_instances/4.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/execution_instances/4.json rename to .temp_to_pub/EasySpider_windows_x32/execution_instances/4.json diff --git a/.temp_to_pub/EasySpider_windows_x86/execution_instances/5.json b/.temp_to_pub/EasySpider_windows_x32/execution_instances/5.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/execution_instances/5.json rename to .temp_to_pub/EasySpider_windows_x32/execution_instances/5.json diff --git a/.temp_to_pub/EasySpider_windows_x86/readme.txt b/.temp_to_pub/EasySpider_windows_x32/readme.txt similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/readme.txt rename to .temp_to_pub/EasySpider_windows_x32/readme.txt diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/0.json b/.temp_to_pub/EasySpider_windows_x32/tasks/0.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/0.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/0.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/1.json b/.temp_to_pub/EasySpider_windows_x32/tasks/1.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/1.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/1.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/10.json b/.temp_to_pub/EasySpider_windows_x32/tasks/10.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/10.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/10.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/106.json b/.temp_to_pub/EasySpider_windows_x32/tasks/106.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/106.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/106.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/107.json b/.temp_to_pub/EasySpider_windows_x32/tasks/107.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/107.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/107.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/108.json b/.temp_to_pub/EasySpider_windows_x32/tasks/108.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/108.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/108.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/109.json b/.temp_to_pub/EasySpider_windows_x32/tasks/109.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/109.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/109.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/11.json b/.temp_to_pub/EasySpider_windows_x32/tasks/11.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/11.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/11.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/110.json b/.temp_to_pub/EasySpider_windows_x32/tasks/110.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/110.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/110.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/111.json b/.temp_to_pub/EasySpider_windows_x32/tasks/111.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/111.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/111.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/112.json b/.temp_to_pub/EasySpider_windows_x32/tasks/112.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/112.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/112.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/113.json b/.temp_to_pub/EasySpider_windows_x32/tasks/113.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/113.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/113.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/114.json b/.temp_to_pub/EasySpider_windows_x32/tasks/114.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/114.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/114.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/115.json b/.temp_to_pub/EasySpider_windows_x32/tasks/115.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/115.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/115.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/116.json b/.temp_to_pub/EasySpider_windows_x32/tasks/116.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/116.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/116.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/117.json b/.temp_to_pub/EasySpider_windows_x32/tasks/117.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/117.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/117.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/118.json b/.temp_to_pub/EasySpider_windows_x32/tasks/118.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/118.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/118.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/12.json b/.temp_to_pub/EasySpider_windows_x32/tasks/12.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/12.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/12.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/13.json b/.temp_to_pub/EasySpider_windows_x32/tasks/13.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/13.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/13.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/14.json b/.temp_to_pub/EasySpider_windows_x32/tasks/14.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/14.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/14.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/15.json b/.temp_to_pub/EasySpider_windows_x32/tasks/15.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/15.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/15.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/16.json b/.temp_to_pub/EasySpider_windows_x32/tasks/16.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/16.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/16.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/17.json b/.temp_to_pub/EasySpider_windows_x32/tasks/17.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/17.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/17.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/18.json b/.temp_to_pub/EasySpider_windows_x32/tasks/18.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/18.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/18.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/19.json b/.temp_to_pub/EasySpider_windows_x32/tasks/19.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/19.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/19.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/2.json b/.temp_to_pub/EasySpider_windows_x32/tasks/2.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/2.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/2.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/20.json b/.temp_to_pub/EasySpider_windows_x32/tasks/20.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/20.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/20.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/21.json b/.temp_to_pub/EasySpider_windows_x32/tasks/21.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/21.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/21.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/22.json b/.temp_to_pub/EasySpider_windows_x32/tasks/22.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/22.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/22.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/23.json b/.temp_to_pub/EasySpider_windows_x32/tasks/23.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/23.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/23.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/24.json b/.temp_to_pub/EasySpider_windows_x32/tasks/24.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/24.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/24.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/25.json b/.temp_to_pub/EasySpider_windows_x32/tasks/25.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/25.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/25.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/26.json b/.temp_to_pub/EasySpider_windows_x32/tasks/26.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/26.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/26.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/27.json b/.temp_to_pub/EasySpider_windows_x32/tasks/27.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/27.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/27.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/28.json b/.temp_to_pub/EasySpider_windows_x32/tasks/28.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/28.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/28.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/29.json b/.temp_to_pub/EasySpider_windows_x32/tasks/29.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/29.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/29.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/3.json b/.temp_to_pub/EasySpider_windows_x32/tasks/3.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/3.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/3.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/30.json b/.temp_to_pub/EasySpider_windows_x32/tasks/30.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/30.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/30.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/31.json b/.temp_to_pub/EasySpider_windows_x32/tasks/31.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/31.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/31.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/32.json b/.temp_to_pub/EasySpider_windows_x32/tasks/32.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/32.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/32.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/33.json b/.temp_to_pub/EasySpider_windows_x32/tasks/33.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/33.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/33.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/34.json b/.temp_to_pub/EasySpider_windows_x32/tasks/34.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/34.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/34.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/35.json b/.temp_to_pub/EasySpider_windows_x32/tasks/35.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/35.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/35.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/36.json b/.temp_to_pub/EasySpider_windows_x32/tasks/36.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/36.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/36.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/37.json b/.temp_to_pub/EasySpider_windows_x32/tasks/37.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/37.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/37.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/38.json b/.temp_to_pub/EasySpider_windows_x32/tasks/38.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/38.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/38.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/39.json b/.temp_to_pub/EasySpider_windows_x32/tasks/39.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/39.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/39.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/4.json b/.temp_to_pub/EasySpider_windows_x32/tasks/4.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/4.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/4.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/40.json b/.temp_to_pub/EasySpider_windows_x32/tasks/40.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/40.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/40.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/41.json b/.temp_to_pub/EasySpider_windows_x32/tasks/41.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/41.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/41.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/42.json b/.temp_to_pub/EasySpider_windows_x32/tasks/42.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/42.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/42.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/43.json b/.temp_to_pub/EasySpider_windows_x32/tasks/43.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/43.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/43.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/44.json b/.temp_to_pub/EasySpider_windows_x32/tasks/44.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/44.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/44.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/45.json b/.temp_to_pub/EasySpider_windows_x32/tasks/45.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/45.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/45.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/46.json b/.temp_to_pub/EasySpider_windows_x32/tasks/46.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/46.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/46.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/47.json b/.temp_to_pub/EasySpider_windows_x32/tasks/47.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/47.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/47.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/48.json b/.temp_to_pub/EasySpider_windows_x32/tasks/48.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/48.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/48.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/49.json b/.temp_to_pub/EasySpider_windows_x32/tasks/49.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/49.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/49.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/5.json b/.temp_to_pub/EasySpider_windows_x32/tasks/5.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/5.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/5.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/50.json b/.temp_to_pub/EasySpider_windows_x32/tasks/50.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/50.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/50.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/6.json b/.temp_to_pub/EasySpider_windows_x32/tasks/6.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/6.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/6.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/7.json b/.temp_to_pub/EasySpider_windows_x32/tasks/7.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/7.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/7.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/8.json b/.temp_to_pub/EasySpider_windows_x32/tasks/8.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/8.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/8.json diff --git a/.temp_to_pub/EasySpider_windows_x86/tasks/9.json b/.temp_to_pub/EasySpider_windows_x32/tasks/9.json similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/tasks/9.json rename to .temp_to_pub/EasySpider_windows_x32/tasks/9.json diff --git a/.temp_to_pub/EasySpider_windows_x86/软件使用说明.txt b/.temp_to_pub/EasySpider_windows_x32/软件使用说明.txt similarity index 100% rename from .temp_to_pub/EasySpider_windows_x86/软件使用说明.txt rename to .temp_to_pub/EasySpider_windows_x32/软件使用说明.txt diff --git a/.temp_to_pub/EasySpider_windows_x64/Readme.txt b/.temp_to_pub/EasySpider_windows_x64/Readme.txt index 4575b56..11fd936 100644 --- a/.temp_to_pub/EasySpider_windows_x64/Readme.txt +++ b/.temp_to_pub/EasySpider_windows_x64/Readme.txt @@ -4,7 +4,7 @@ Welcome to promote this software to other friends. This version is for Windows 10 x64 and above. -The Windows version supports **Windows 10 and above**. If you want to use EasySpider on windows 7, please download the Windows x86 version of EasySpider. +The Windows version supports **Windows 10 and above**. If you want to use EasySpider on windows 7, please download the Windows x32 version of EasySpider. Video Tutorial: https://youtube.com/playlist?list=PL0kEFEkWrT7mt9MUlEBV2DTo1QsaanUTp diff --git a/.temp_to_pub/EasySpider_windows_x64/软件使用说明.txt b/.temp_to_pub/EasySpider_windows_x64/软件使用说明.txt index 721731d..2764e6a 100644 --- a/.temp_to_pub/EasySpider_windows_x64/软件使用说明.txt +++ b/.temp_to_pub/EasySpider_windows_x64/软件使用说明.txt @@ -4,7 +4,7 @@ 支持Windows 10 x64及以上版本。 -Windows 7此请下载Windows的32位版本使用。 +Windows 7任意版本,包括x64和x32版本,以及Windows 10 x32版本请下载Windows的32位版本使用。 视频教程:https://www.bilibili.com/video/BV1th411A7ey/ diff --git a/.temp_to_pub/EasySpider_windows_x86/Code/easyspider_executestage.py b/.temp_to_pub/EasySpider_windows_x86/Code/easyspider_executestage.py deleted file mode 100644 index 19fd21a..0000000 --- a/.temp_to_pub/EasySpider_windows_x86/Code/easyspider_executestage.py +++ /dev/null @@ -1,1546 +0,0 @@ -# -*- coding: utf-8 -*- -# import atexit -from datetime import datetime -import io # 遇到错误退出时应执行的代码 -import json -# from lib2to3.pgen2 import driver -import re -# import shutil -import subprocess -import sys -# from urllib import parse -# import base64 -# import hashlib -import time -import requests -from urllib.parse import urljoin -from lxml import etree -import undetected_chromedriver as uc -from pynput.keyboard import Key, Listener -from selenium.webdriver.chrome.options import Options -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.common.action_chains import ActionChains -from selenium import webdriver -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -from selenium.webdriver.common.by import By -from selenium.common.exceptions import NoSuchElementException -from selenium.common.exceptions import TimeoutException -from selenium.common.exceptions import StaleElementReferenceException, InvalidSelectorException -from selenium.webdriver.common.desired_capabilities import DesiredCapabilities -from selenium.webdriver.support.ui import Select -from selenium.webdriver import ActionChains -from selenium.webdriver.common.by import By -import random -# import pandas as pd -from openpyxl import load_workbook, Workbook -# import numpy -import csv -import os -from commandline_config import Config -import pytesseract -from PIL import Image -# import uuid -from threading import Thread, Event -from myChrome import MyChrome, MyUCChrome -from utils import check_pause, download_image, get_output_code, isnull, lowercase_tags_in_xpath, myMySQL, new_line, on_press_creator, on_release_creator, write_to_csv, write_to_excel -desired_capabilities = DesiredCapabilities.CHROME -desired_capabilities["pageLoadStrategy"] = "none" - -class BrowserThread(Thread): - def __init__(self, browser_t, id, service, version, event, saveName, config): - Thread.__init__(self) - self.browser = browser_t - self.config = config - self.id = id - self.event = event - try: - self.saveName = service["saveName"] # 保存文件的名字 - except: - now = datetime.now() - # 将时间格式化为精确到秒的字符串 - self.saveName = now.strftime("%Y_%m_%d_%H_%M_%S") - self.log = "" - self.OUTPUT = "" - self.SAVED = False - self.BREAK = False - # 名称设定 - if saveName != "": # 命令行覆盖保存名称 - self.saveName = saveName # 保存文件的名字 - now = datetime.now().strftime("%Y_%m_%d_%H_%M_%S") - self.saveName = self.saveName.replace("current_time", now) - - print("Save Name for task ID", i, "is:", self.saveName) - print("任务ID", i, "的保存文件名为:", self.saveName) - if not os.path.exists("Data/Task_" + str(i)): - os.mkdir("Data/Task_" + str(i)) - if not os.path.exists("Data/Task_" + str(i) + "/" + self.saveName): - os.mkdir("Data/Task_" + str(i) + "/" + self.saveName) # 创建保存文件夹用来保存截图 - - stealth_path = driver_path[:driver_path.find( - "chromedriver")] + "stealth.min.js" - with open(stealth_path, 'r') as f: - js = f.read() - print("Loading stealth.min.js") - self.browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', { - 'source': js}) # TMALL 反扒 - WebDriverWait(self.browser, 10) - self.browser.get('about:blank') - self.procedure = service["graph"] # 程序执行流程 - try: - self.maxViewLength = service["maxViewLength"] # 最大显示长度 - except: - self.maxViewLength = 15 - try: - self.outputFormat = service["outputFormat"] # 输出格式 - except: - self.outputFormat = "csv" - try: - if service["version"] >= "0.3.1": # 0.3.1及以上版本以上的EasySpider兼容从0.3.1版本开始的所有版本 - pass - else: # 0.3.1以下版本的EasySpider不兼容0.3.1及以上版本的EasySpider - if service["version"] != version: - print("版本不一致,请使用" + - service["version"] + "版本的EasySpider运行该任务!") - print("Version not match, please use EasySpider " + - service["version"] + " to run this task!") - self.browser.quit() - sys.exit() - except: # 0.2.0版本没有version字段,所以直接退出 - print("版本不一致,请使用v0.2.0版本的EasySpider运行该任务!") - print("Version not match, please use EasySpider v0.2.0 to run this task!") - self.browser.quit() - sys.exit() - try: - self.save_threshold = service["saveThreshold"] # 保存最低阈值 - except: - self.save_threshold = 10 - self.links = list( - filter(isnull, service["links"].split("\n"))) # 要执行的link的列表 - self.OUTPUT = [] # 采集的数据 - self.writeMode = 1 # 写入模式,0为新建,1为追加 - if self.outputFormat == "csv" or self.outputFormat == "txt": - if not os.path.exists("Data/Task_" + str(self.id) + "/" + self.saveName + '.' + self.outputFormat): - self.OUTPUT.append([]) # 添加表头 - self.writeMode = 0 - elif self.outputFormat == "xlsx": - if not os.path.exists("Data/Task_" + str(self.id) + "/" + self.saveName + '.xlsx'): - self.OUTPUT.append([]) # 添加表头 - self.writeMode = 0 - elif self.outputFormat == "mysql": - self.mysql = myMySQL(config["mysql_config_path"]) - self.mysql.create_table(self.saveName, service["outputParameters"]) - self.writeMode = 2 - if self.writeMode == 1: - print("追加模式") - print("Append Mode") - elif self.writeMode == 0: - print("新建模式") - print("New Mode") - elif self.writeMode == 2: - print("MySQL模式") - print("MySQL Mode") - self.containJudge = service["containJudge"] # 是否含有判断语句 - self.outputParameters = {} - self.outputParametersTypes = [] - self.outputParametersRecord = [] # 字段是否被记录 - self.dataNotFoundKeys = {} # 记录没有找到数据的key - self.log = "" # 记下现在总共开了多少个标签页 - self.history = {"index": 0, "handle": None} # 记录页面现在所以在的历史记录的位置 - self.SAVED = False # 记录是否已经存储了 - for para in service["outputParameters"]: # 初始化输出参数 - if para["name"] not in self.outputParameters.keys(): - self.outputParameters[para["name"]] = "" - self.dataNotFoundKeys[para["name"]] = False - try: - self.outputParametersTypes.append(para["type"]) - except: - self.outputParametersTypes.append("text") - try: - self.outputParametersRecord.append(bool(para["recordASField"])) - except: - self.outputParametersRecord.append(True) - # 文件叠加的时候不添加表头 - if self.outputFormat == "csv" or self.outputFormat == "txt" or self.outputFormat == "xlsx": - if self.writeMode == 0: - self.OUTPUT[0].append(para["name"]) - self.urlId = 0 # 全局记录变量 - self.preprocess() # 预处理,优化提取数据流程 - - # 检测如果没有复杂的操作,优化提取数据流程 - def preprocess(self): - for node in self.procedure: - try: - iframe = node["parameters"]["iframe"] - except: - node["parameters"]["iframe"] = False - try: - node["parameters"]["xpath"] = lowercase_tags_in_xpath( - node["parameters"]["xpath"]) - except: - pass - if node["option"] == 1: # 打开网页操作 - try: - cookies = node["parameters"]["cookies"] - except: - node["parameters"]["cookies"] = "" - if node["option"] == 3: # 提取数据操作 - paras = node["parameters"]["paras"] - for para in paras: - try: - iframe = para["iframe"] - except: - para["iframe"] = False - try: - para["relativeXPath"] = lowercase_tags_in_xpath(para["relativeXPath"]) - except: - pass - if para["beforeJS"] == "" and para["afterJS"] == "" and para["contentType"] <= 1 and para["nodeType"] <= 2: - para["optimizable"] = True - else: - para["optimizable"] = False - - def run(self): - # 挨个执行程序 - for i in range(len(self.links)): - print("正在执行第", i + 1, "/ ", len(self.links), "个链接") - print("Executing link", i + 1, "/ ", len(self.links)) - self.executeNode(0) - self.urlId = self.urlId + 1 - files = os.listdir("Data/Task_" + str(self.id) + "/" + self.saveName) - # 如果目录为空,则删除该目录 - if not files: - os.rmdir("Data/Task_" + str(self.id) + "/" + self.saveName) - print("Done!") - print("执行完成!") - self.recordLog("Done!") - self.saveData(exit=True) - if self.outputFormat == "mysql": - self.mysql.close() - - def recordLog(self, str=""): - self.log = self.log + str + "\n" - - # 控制台打印log函数 - - def Log(self, text, text2=""): - switch = False - if switch: - print(text, text2) - - # @atexit.register - # def clean(self): - # self.saveData(exit=True) - # self.browser.quit() - # sys.exit(0) - - def saveData(self, exit=False): - # 每save_threshold条保存一次 - if exit == True or len(self.OUTPUT) >= self.save_threshold: - # 写入日志 - with open("Data/Task_" + str(self.id) + "/" + self.saveName + '_log.txt', 'a', encoding='utf-8-sig') as file_obj: - file_obj.write(self.log) - file_obj.close() - # 写入数据 - if self.outputFormat == "csv" or self.outputFormat == "txt": - file_name = "Data/Task_" + \ - str(self.id) + "/" + self.saveName + '.' + self.outputFormat - write_to_csv(file_name, self.OUTPUT, self.outputParametersRecord) - elif self.outputFormat == "xlsx": - file_name = "Data/Task_" + \ - str(self.id) + "/" + self.saveName + '.xlsx' - write_to_excel(file_name, self.OUTPUT, self.outputParametersTypes, self.outputParametersRecord) - elif self.outputFormat == "mysql": - self.mysql.write_to_mysql(self.OUTPUT, self.outputParametersRecord, self.outputParametersTypes) - - self.OUTPUT = [] - self.log = "" - - def scrollDown(self, para, rt=""): - try: - time.sleep(para["scrollWaitTime"]) # 下拉前等待 - except: - pass - scrollType = int(para["scrollType"]) - try: - if scrollType != 0 and para["scrollCount"] > 0: # 控制屏幕向下滚动 - for i in range(para["scrollCount"]): - self.Log("Wait for set second after screen scrolling") - body = self.browser.find_element( - By.CSS_SELECTOR, "body", iframe=para["iframe"]) - if scrollType == 1: - body.send_keys(Keys.PAGE_DOWN) - elif scrollType == 2: - body.send_keys(Keys.END) - try: - time.sleep(para["scrollWaitTime"]) # 下拉完等待 - except: - pass - except: - self.Log('Time out after set seconds when scrolling. ') - self.recordLog('Time out after set seconds when scrolling') - self.browser.execute_script('window.stop()') - if scrollType != 0 and para["scrollCount"] > 0: # 控制屏幕向下滚动 - for i in range(para["scrollCount"]): - self.Log("Wait for set second after screen scrolling") - body = self.browser.find_element( - By.CSS_SELECTOR, "body", iframe=para["iframe"]) - if scrollType == 1: - body.send_keys(Keys.PGDN) - elif scrollType == 2: - body.send_keys(Keys.END) - try: - time.sleep(para["scrollWaitTime"]) # 下拉完等待 - except: - pass - if rt != "": - rt.end() - - def execute_code(self, codeMode, code, max_wait_time, element=None, iframe=False): - output = "" - if code == "": - return "" - if max_wait_time == 0: - max_wait_time = 999999 - # print(codeMode, code) - # 将value中的Field[""]替换为outputParameters中的键值 - pattern = r'Field\["([^"]+)"\]' - try: - replaced_text = re.sub( - pattern, lambda match: self.outputParameters.get(match.group(1), ''), code) - except: - replaced_text = code - code = replaced_text - if iframe and self.browser.iframe_env == False: - # 获取所有的 iframe - self.browser.switch_to.default_content() - iframes = self.browser.find_elements( - By.CSS_SELECTOR, "iframe", iframe=False) - # 遍历所有的 iframe 并点击里面的元素 - for iframe in iframes: - # 切换到 iframe - try: - self.browser.switch_to.default_content() - self.browser.switch_to.frame(iframe) - self.browser.iframe_env = True - break - except: - print("Iframe switch failed") - elif not iframe and self.browser.iframe_env == True: - self.browser.switch_to.default_content() - self.browser.iframe_env = False - if int(codeMode) == 0: - self.recordLog("Execute JavaScript:" + code) - self.recordLog("执行JavaScript:" + code) - self.browser.set_script_timeout(max_wait_time) - try: - output = self.browser.execute_script(code) - except: - output = "" - self.recordLog("JavaScript execution failed") - elif int(codeMode) == 2: - self.recordLog("Execute JavaScript for element:" + code) - self.recordLog("对元素执行JavaScript:" + code) - self.browser.set_script_timeout(max_wait_time) - try: - output = self.browser.execute_script(code, element) - except: - output = "" - self.recordLog("JavaScript execution failed") - elif int(codeMode) == 1: - self.recordLog("Execute System Call:" + code) - self.recordLog("执行系统命令:" + code) - # 执行系统命令 - try: - # output = subprocess.run(code, capture_output=True, text=True, timeout=max_wait_time, encoding="utf-8", shell=True) - output = subprocess.run( - code, capture_output=True, text=True, timeout=max_wait_time, shell=True) - # 输出命令返回值 - output = output.stdout - print(output) - except subprocess.TimeoutExpired: - # 命令执行时间超过指定值,抛出异常 - self.recordLog("Command timed out") - self.recordLog("命令执行超时") - except Exception as e: - print(e) # 打印异常信息 - self.recordLog("Command execution failed") - self.recordLog("命令执行失败") - return str(output) - - def customOperation(self, node, loopValue, loopPath, index): - paras = node["parameters"] - codeMode = int(paras["codeMode"]) - code = paras["code"] - output = "" - max_wait_time = int(paras["waitTime"]) - if codeMode == 2: # 使用循环的情况下,传入的clickPath就是实际的xpath - try: - elements = self.browser.find_elements( - By.XPATH, loopPath, iframe=paras["iframe"]) - element = elements[index] - output = self.execute_code( - codeMode, code, max_wait_time, element, iframe=paras["iframe"]) - except: - output = "" - print("JavaScript execution failed") - elif codeMode == 3: - self.BREAK = True - else: # 0 1 - output = self.execute_code( - codeMode, code, max_wait_time, iframe=paras["iframe"]) - recordASField = bool(paras["recordASField"]) - if recordASField: - print("操作<" + node["title"] + ">的返回值为:" + output) - print("The return value of operation <" + node["title"] + "> is: " + output) - self.outputParameters[node["title"]] = output - if recordASField: - line = new_line(self.outputParameters, self.maxViewLength, self.outputParametersRecord) - self.OUTPUT.append(line) - - def switchSelect(self, para, loopValue): - optionMode = int(para["optionMode"]) - optionValue = para["optionValue"] - try: - dropdown = Select(self.browser.find_element( - By.XPATH, para["xpath"], iframe=para["iframe"])) - try: - if optionMode == 0: - # 获取当前选中的选项索引 - current_index = dropdown.options.index( - dropdown.first_selected_option) - # 计算下一个选项的索引 - next_index = (current_index + 1) % len(dropdown.options) - # 选择下一个选项 - dropdown.select_by_index(next_index) - elif optionMode == 1: - dropdown.select_by_index(int(optionValue)) - elif optionMode == 2: - dropdown.select_by_value(optionValue) - elif optionMode == 3: - dropdown.select_by_visible_text(optionValue) - except: - print("切换下拉框选项失败:", para["xpath"], - para["optionMode"], para["optionValue"]) - print("Failed to change drop-down box option:", - para["xpath"], para["optionMode"], para["optionValue"]) - except: - print("找不到下拉框元素:", para["xpath"]) - print("Cannot find drop-down box element:", para["xpath"]) - - def moveToElement(self, para, loopElement=None, loopPath="", index=0): - time.sleep(0.1) # 移动之前等待0.1秒 - if para["useLoop"]: # 使用循环的情况下,传入的clickPath就是实际的xpath - path = loopPath - # element = loopElement - else: - index = 0 - path = para["xpath"] # 不然使用元素定义的xpath - # element = self.browser.find_element( - # By.XPATH, path, iframe=para["iframe"]) - try: - elements = self.browser.find_elements( - By.XPATH, path, iframe=para["iframe"]) - element = elements[index] - try: - ActionChains(self.browser).move_to_element(element).perform() - except: - print("移动鼠标到元素失败:", para["xpath"]) - print("Failed to move mouse to element:", para["xpath"]) - except: - print("找不到元素:", para["xpath"]) - print("Cannot find element:", para["xpath"]) - - # 执行节点关键函数部分 - - def executeNode(self, nodeId, loopValue="", loopPath="", index=0): - node = self.procedure[nodeId] - WebDriverWait(self.browser, 10).until - # 等待元素出现才进行操作,10秒内未出现则报错 - (EC.visibility_of_element_located( - (By.XPATH, node["parameters"]["xpath"]))) - - # 根据不同选项执行不同操作 - if node["option"] == 0 or node["option"] == 10: # root操作,条件分支操作 - for i in node["sequence"]: # 从根节点开始向下读取 - self.executeNode(i, loopValue, loopPath, index) - elif node["option"] == 1: # 打开网页操作 - self.recordLog("openPage") - self.openPage(node["parameters"], loopValue) - elif node["option"] == 2: # 点击元素 - self.recordLog("Click") - self.clickElement(node["parameters"], loopValue, loopPath, index) - elif node["option"] == 3: # 提取数据 - self.recordLog("getData") - self.getData(node["parameters"], loopValue, node["isInLoop"], - parentPath=loopPath, index=index) - self.saveData() - elif node["option"] == 4: # 输入文字 - self.inputInfo(node["parameters"], loopValue) - elif node["option"] == 5: # 自定义操作 - self.customOperation(node, loopValue, loopPath, index) - self.saveData() - elif node["option"] == 6: # 切换下拉框 - self.switchSelect(node["parameters"], loopValue) - elif node["option"] == 7: # 鼠标移动到元素上 - self.moveToElement(node["parameters"], loopValue, loopPath, index) - elif node["option"] == 8: # 循环 - self.recordLog("loop") - self.loopExecute(node, loopValue, loopPath, index) # 执行循环 - elif node["option"] == 9: # 条件分支 - self.recordLog("judge") - self.judgeExecute(node, loopValue, loopPath, index) - - # 执行完之后进行等待 - if node["option"] != 0 and node["option"] != 2: # 点击元素操作单独定义等待时间操作 - waitTime = 0.01 # 默认等待0.01秒 - if node["parameters"]["wait"] >= 0: - waitTime = node["parameters"]["wait"] - try: - waitType = int(node["parameters"]["waitType"]) - except: - waitType = 0 - if waitType == 0: # 固定等待时间 - time.sleep(waitTime) - elif waitType == 1: # 随机等待时间 - time.sleep(random.uniform(waitTime * 0.5, waitTime * 1.5)) - self.Log("Wait seconds after node executing: ", waitTime) - self.event.wait() # 等待事件结束 - - # 对判断条件的处理 - - def judgeExecute(self, node, loopElement, clickPath="", index=0): - executeBranchId = 0 # 要执行的BranchId - for i in node["sequence"]: - cnode = self.procedure[i] # 获得条件分支 - tType = int(cnode["parameters"]["class"]) # 获得判断条件类型 - if tType == 0: # 什么条件都没有 - executeBranchId = i - break - elif tType == 1: # 当前页面包含文本 - try: - bodyText = self.browser.find_element( - By.CSS_SELECTOR, "body", iframe=cnode["parameters"]["iframe"]).text - if bodyText.find(cnode["parameters"]["value"]) >= 0: - executeBranchId = i - break - except: # 找不到元素下一个条件 - continue - elif tType == 2: # 当前页面包含元素 - try: - if self.browser.find_element(By.XPATH, cnode["parameters"]["value"], iframe=cnode["parameters"]["iframe"]): - executeBranchId = i - break - except: # 找不到元素或者xpath写错了,下一个条件 - continue - elif tType == 3: # 当前循环元素包括文本 - try: - if loopElement.text.find(cnode["parameters"]["value"]) >= 0: - executeBranchId = i - break - except: # 找不到元素或者xpath写错了,下一个条件 - continue - elif tType == 4: # 当前循环元素包括元素 - try: - if loopElement.find_element(By.XPATH, cnode["parameters"]["value"][1:]): - executeBranchId = i - break - except: # 找不到元素或者xpath写错了,下一个条件 - continue - elif tType <= 7: # JS命令返回值 - if tType == 5: # JS命令返回值等于 - output = self.execute_code( - 0, cnode["parameters"]["code"], cnode["parameters"]["waitTime"], iframe=cnode["parameters"]["iframe"]) - elif tType == 6: # System - output = self.execute_code( - 1, cnode["parameters"]["code"], cnode["parameters"]["waitTime"], iframe=cnode["parameters"]["iframe"]) - elif tType == 7: # 针对当前循环项的JS命令返回值 - output = self.execute_code( - 2, cnode["parameters"]["code"], cnode["parameters"]["waitTime"], loopElement, iframe=cnode["parameters"]["iframe"]) - try: - if output.find("rue") != -1: # 如果返回值中包含true - code = 1 - else: - code = int(output) - except: - code = 0 - if code > 0: - executeBranchId = i - break - # rt.end() - if executeBranchId != 0: - self.executeNode(executeBranchId, loopElement, clickPath, index) - - # 对循环的处理 - def loopExecute(self, node, loopValue, clickPath="", index=0): - time.sleep(0.1) # 第一次执行循环的时候强制等待1秒 - # self.Log("循环执行前等待0.1秒") - self.Log("Wait 0.1 second before loop") - thisHandle = self.browser.current_window_handle # 记录本次循环内的标签页的ID - thisHistoryLength = self.browser.execute_script( - 'return history.length') # 记录本次循环内的history的length - self.history["index"] = thisHistoryLength - self.history["handle"] = thisHandle - if int(node["parameters"]["loopType"]) == 0: # 单个元素循环 - # 无跳转标签页操作 - count = 0 # 执行次数 - while True: # do while循环 - try: - finished = False - element = self.browser.find_element( - By.XPATH, node["parameters"]["xpath"], iframe=node["parameters"]["iframe"]) - for i in node["sequence"]: # 挨个执行操作 - self.executeNode( - i, element, node["parameters"]["xpath"], 0) - if self.BREAK: # 如果有break操作,下面的操作不执行 - break - if self.BREAK: # 如果有break操作,退出循环 - self.BREAK = False - finished = True - break - finished = True - self.Log("Click: ", node["parameters"]["xpath"]) - self.recordLog("Click:" + node["parameters"]["xpath"]) - except NoSuchElementException: - # except: - print("Single loop element not found: ", - node["parameters"]["xpath"]) - print("找不到要循环的单个元素: ", node["parameters"]["xpath"]) - self.recordLog( - "Single loop element not found: " + node["parameters"]["xpath"]) - for i in node["sequence"]: # 不带点击元素的把剩余的如提取数据的操作执行一遍 - if node["option"] != 2: - self.executeNode( - i, None, node["parameters"]["xpath"], 0) - finished = True - break # 如果找不到元素,退出循环 - finally: - if not finished: - print("\n\n-------Retrying-------\n\n") - self.Log("-------Retrying-------: ", - node["parameters"]["xpath"]) - self.recordLog("ClickNotFound:" + - node["parameters"]["xpath"]) - for i in node["sequence"]: # 不带点击元素的把剩余的如提取数据的操作执行一遍 - if node["option"] != 2: - self.executeNode( - i, None, node["parameters"]["xpath"], 0) - break # 如果找不到元素,退出循环 - count = count + 1 - self.Log("Page: ", count) - self.recordLog("Page:" + str(count)) - # print(node["parameters"]["exitCount"], "-------") - if node["parameters"]["exitCount"] == count: # 如果达到设置的退出循环条件的话 - break - if int(node["parameters"]["breakMode"]) > 0: # 如果设置了退出循环的脚本条件 - output = self.execute_code(int( - node["parameters"]["breakMode"]) - 1, node["parameters"]["breakCode"], node["parameters"]["breakCodeWaitTime"], iframe=node["parameters"]["iframe"]) - code = get_output_code(output) - if code <= 0: - break - elif int(node["parameters"]["loopType"]) == 1: # 不固定元素列表 - try: - elements = self.browser.find_elements(By.XPATH, - node["parameters"]["xpath"], iframe=node["parameters"]["iframe"]) - if len(elements) == 0: - print("Loop element not found: ", - node["parameters"]["xpath"]) - print("找不到循环元素: ", node["parameters"]["xpath"]) - self.recordLog("pathNotFound: " + - node["parameters"]["xpath"]) - for index in range(len(elements)): - for i in node["sequence"]: # 挨个顺序执行循环里所有的操作 - self.executeNode(i, elements[index], - node["parameters"]["xpath"], index) - if self.BREAK: - break - if self.BREAK: - self.BREAK = False - break - if self.browser.current_window_handle != thisHandle: # 如果执行完一次循环之后标签页的位置发生了变化 - while True: # 一直关闭窗口直到当前标签页 - self.browser.close() # 关闭使用完的标签页 - self.browser.switch_to.window( - self.browser.window_handles[-1]) - if self.browser.current_window_handle == thisHandle: - break - if self.history["index"] != thisHistoryLength and self.history[ - "handle"] == self.browser.current_window_handle: # 如果执行完一次循环之后历史记录发生了变化,注意当前页面的判断 - difference = thisHistoryLength - \ - self.history["index"] # 计算历史记录变化差值 - self.browser.execute_script( - 'history.go(' + str(difference) + ')') # 回退历史记录 - # if node["parameters"]["historyWait"] > 2: # 回退后要等待的时间 - time.sleep(node["parameters"]["historyWait"]) - # else: - # time.sleep(2) - # 切换历史记录等待: - self.Log("Change history back time or:", - node["parameters"]["historyWait"]) - self.browser.execute_script('window.stop()') - if int(node["parameters"]["breakMode"]) > 0: # 如果设置了退出循环的脚本条件 - output = self.execute_code(int( - node["parameters"]["breakMode"]) - 1, node["parameters"]["breakCode"], node["parameters"]["breakCodeWaitTime"], iframe=node["parameters"]["iframe"]) - code = get_output_code(output) - if code <= 0: - break - except NoSuchElementException: - print("Loop element not found: ", node["parameters"]["xpath"]) - print("找不到循环元素: ", node["parameters"]["xpath"]) - self.recordLog("pathNotFound: " + node["parameters"]["xpath"]) - except Exception as e: - raise - elif int(node["parameters"]["loopType"]) == 2: # 固定元素列表 - # 千万不要忘了分割!! - for path in node["parameters"]["pathList"].split("\n"): - try: - element = self.browser.find_element( - By.XPATH, path, iframe=node["parameters"]["iframe"]) - for i in node["sequence"]: # 挨个执行操作 - self.executeNode(i, element, path, 0) - if self.BREAK: - break - if self.BREAK: - self.BREAK = False - break - if self.browser.current_window_handle != thisHandle: # 如果执行完一次循环之后标签页的位置发生了变化 - while True: # 一直关闭窗口直到当前标签页 - self.browser.close() # 关闭使用完的标签页 - self.browser.switch_to.window( - self.browser.window_handles[-1]) - if self.browser.current_window_handle == thisHandle: - break - if self.history["index"] != thisHistoryLength and self.history[ - "handle"] == self.browser.current_window_handle: # 如果执行完一次循环之后历史记录发生了变化,注意当前页面的判断 - difference = thisHistoryLength - \ - self.history["index"] # 计算历史记录变化差值 - self.browser.execute_script( - 'history.go(' + str(difference) + ')') # 回退历史记录 - # if node["parameters"]["historyWait"] > 2: # 回退后要等待的时间 - time.sleep(node["parameters"]["historyWait"]) - # else: - # time.sleep(2) - self.Log("Change history back time or:", - node["parameters"]["historyWait"]) - self.browser.execute_script('window.stop()') - except NoSuchElementException: - print("Loop element not found: ", path) - print("找不到循环元素: ", path) - self.recordLog("pathNotFound: " + path) - continue # 循环中找不到元素就略过操作 - except Exception as e: - raise - if int(node["parameters"]["breakMode"]) > 0: # 如果设置了退出循环的脚本条件 - output = self.execute_code(int( - node["parameters"]["breakMode"]) - 1, node["parameters"]["breakCode"], node["parameters"]["breakCodeWaitTime"], iframe=node["parameters"]["iframe"]) - code = get_output_code(output) - if code <= 0: - break - elif int(node["parameters"]["loopType"]) == 3: # 固定文本列表 - textList = node["parameters"]["textList"].split("\n") - for text in textList: - self.recordLog("input: " + text) - for i in node["sequence"]: # 挨个执行操作 - self.executeNode(i, text, "", 0) - if self.BREAK: - break - if self.BREAK: - self.BREAK = False - break - if int(node["parameters"]["breakMode"]) > 0: # 如果设置了退出循环的脚本条件 - output = self.execute_code(int( - node["parameters"]["breakMode"]) - 1, node["parameters"]["breakCode"], node["parameters"]["breakCodeWaitTime"], iframe=node["parameters"]["iframe"]) - code = get_output_code(output) - if code <= 0: - break - elif int(node["parameters"]["loopType"]) == 4: # 固定网址列表 - # tempList = node["parameters"]["textList"].split("\r\n") - urlList = list( - filter(isnull, node["parameters"]["textList"].split("\n"))) # 去空行 - # urlList = [] - # for url in tempList: - # if url != "": - # urlList.append(url) - for url in urlList: - self.recordLog("input: " + url) - for i in node["sequence"]: - self.executeNode(i, url, "", 0) - if self.BREAK: - break - if self.BREAK: - self.BREAK = False - break - if int(node["parameters"]["breakMode"]) > 0: # 如果设置了退出循环的脚本条件 - output = self.execute_code(int( - node["parameters"]["breakMode"]) - 1, node["parameters"]["breakCode"], node["parameters"]["breakCodeWaitTime"], iframe=node["parameters"]["iframe"]) - code = get_output_code(output) - if code <= 0: - break - elif int(node["parameters"]["loopType"]) <= 6: # 命令返回值 - while True: # do while循环 - if int(node["parameters"]["loopType"]) == 5: # JS - output = self.execute_code( - 0, node["parameters"]["code"], node["parameters"]["waitTime"], iframe=node["parameters"]["iframe"]) - elif int(node["parameters"]["loopType"]) == 6: # System - output = self.execute_code( - 1, node["parameters"]["code"], node["parameters"]["waitTime"], iframe=node["parameters"]["iframe"]) - code = get_output_code(output) - if code <= 0: - break - for i in node["sequence"]: # 挨个执行操作 - self.executeNode(i, code, node["parameters"]["xpath"], 0) - if self.BREAK: - break - if self.BREAK: - self.BREAK = False - break - self.history["index"] = thisHistoryLength - self.history["handle"] = self.browser.current_window_handle - self.scrollDown(node["parameters"]) - - # 打开网页事件 - def openPage(self, para, loopValue): - time.sleep(1) # 打开网页后强行等待至少1秒 - if len(self.browser.window_handles) > 1: - self.browser.switch_to.window( - self.browser.window_handles[-1]) # 打开网页操作从第1个页面开始 - self.browser.close() - self.browser.switch_to.window( - self.browser.window_handles[0]) # 打开网页操作从第1个页面开始 - self.history["handle"] = self.browser.current_window_handle - if para["useLoop"]: - url = loopValue - elif para["url"] != "about:blank": - url = self.links[self.urlId] - # clear output parameters - for key in self.outputParameters: - self.outputParameters[key] = "" - else: - url = list(filter(isnull, para["links"].split("\n")))[0] - # 将value中的Field[""]替换为outputParameters中的键值 - pattern = r'Field\["([^"]+)"\]' - try: - replaced_text = re.sub( - pattern, lambda match: self.outputParameters.get(match.group(1), ''), url) - except: - replaced_text = url - url = replaced_text - try: - maxWaitTime = int(para["maxWaitTime"]) - except: - maxWaitTime = 10 # 默认最大等待时间为10秒 - try: - self.browser.set_page_load_timeout(maxWaitTime) # 加载页面最大超时时间 - self.browser.set_script_timeout(maxWaitTime) - self.browser.get(url) - if para["cookies"] != "": - self.browser.delete_all_cookies() # 清除所有已有cookie - cookies = para["cookies"].split('\n') - for cookie in cookies: - name, value = cookie.split('=', 1) - cookie_dict = {'name': name, 'value': value} - # 加载 cookie - self.browser.add_cookie(cookie_dict) - self.Log('Loading page: ' + url) - self.recordLog('Loading page: ' + url) - except TimeoutException: - self.Log('Time out after set seconds when loading page: ' + url) - self.recordLog( - 'Time out after set seconds when loading page: ' + url) - try: - self.browser.execute_script('window.stop()') - except: - pass - except Exception as e: - print("Failed to load page: " + url) - self.recordLog('Failed to load page: ' + url) - try: - self.history["index"] = self.browser.execute_script( - "return history.length") - except TimeoutException: - try: - self.browser.execute_script('window.stop()') - self.history["index"] = self.browser.execute_script( - "return history.length") - except: - self.history["index"] = 0 - self.scrollDown(para) # 控制屏幕向下滚动 - - # 键盘输入事件 - def inputInfo(self, para, loopValue): - time.sleep(0.1) # 输入之前等待0.1秒 - self.Log("Wait 0.1 second before input") - try: - textbox = self.browser.find_element( - By.XPATH, para["xpath"], iframe=para["iframe"]) - # textbox.send_keys(Keys.CONTROL, 'a') - # textbox.send_keys(Keys.BACKSPACE) - self.execute_code( - 2, para["beforeJS"], para["beforeJSWaitTime"], textbox, iframe=para["iframe"]) # 执行前置JS - # Send the HOME key - textbox.send_keys(Keys.HOME) - # Send the SHIFT + END key combination - textbox.send_keys(Keys.SHIFT, Keys.END) - # Send the DELETE key - textbox.send_keys(Keys.DELETE) - value = "" - if para["useLoop"]: - value = loopValue - else: - value = para["value"] - # 将value中的Field[""]替换为outputParameters中的键值 - pattern = r'Field\["([^"]+)"\]' - try: - replaced_text = re.sub( - pattern, lambda match: self.outputParameters.get(match.group(1), ''), value) - replaced_text = re.sub( - '', '', replaced_text, flags=re.IGNORECASE) - except: - replaced_text = value - textbox.send_keys(replaced_text) - if value.lower().find("") >= 0: - textbox.send_keys(Keys.ENTER) - self.execute_code( - 2, para["afterJS"], para["afterJSWaitTime"], textbox, iframe=para["iframe"]) # 执行后置js - except: - print("Cannot find input box element:" + - para["xpath"] + ", please try to set the wait time before executing this operation") - print("找不到输入框元素:" + para["xpath"] + ",请尝试在执行此操作前设置等待时间") - self.recordLog("Cannot find input box element:" + - para["xpath"] + "Please try to set the wait time before executing this operation") - - # 点击元素事件 - - def clickElement(self, para, loopElement=None, clickPath="", index=0): - try: - maxWaitTime = int(para["maxWaitTime"]) - except: - maxWaitTime = 10 - self.browser.set_page_load_timeout(maxWaitTime) # 加载页面最大超时时间 - self.browser.set_script_timeout(maxWaitTime) - # 点击前对该元素执行一段JavaScript代码 - try: - # element = self.browser.find_element( - # By.XPATH, path, iframe=para["iframe"]) - if para["useLoop"]: # 使用循环的情况下,传入的clickPath就是实际的xpath - path = clickPath - # element = loopElement - else: - index = 0 - path = para["xpath"] # 不然使用元素定义的xpath - # element = self.browser.find_element( - # By.XPATH, path, iframe=para["iframe"]) - elements = self.browser.find_elements( - By.XPATH, path, iframe=para["iframe"]) - element = elements[index] - if para["beforeJS"] != "": - self.execute_code(2, para["beforeJS"], - para["beforeJSWaitTime"], element, iframe=para["iframe"]) - except: - print("Cannot find element:" + - path + ", please try to set the wait time before executing this operation") - print("找不到要点击的元素:" + path + ",请尝试在执行此操作前设置等待时间") - self.recordLog("Cannot find element:" + - path + ", please try to set the wait time before executing this operation") - tempHandleNum = len(self.browser.window_handles) # 记录之前的窗口位置 - try: - click_way = int(para["clickWay"]) - except: - click_way = 0 - try: - if click_way == 0: # 用selenium的点击方法 - actions = ActionChains(self.browser) # 实例化一个action对象 - actions.click(element).perform() - elif click_way == 1: # 用js的点击方法 - script = 'var result = document.evaluate(`' + path + \ - '`, document, null, XPathResult.ANY_TYPE, null);for(let i=0;i= 0 or p["relativeXPath"].find("/text()") >= 0 or p["relativeXPath"].find("::text()") >= 0: - xpath = p["relativeXPath"] - elif p["nodeType"] == 2: - xpath = p["relativeXPath"] + "/@href" - elif p["contentType"] == 1: - xpath = p["relativeXPath"] + "/text()" - elif p["contentType"] == 0: - xpath = p["relativeXPath"] + "//text()" - if p["relative"]: - # if p["relativeXPath"] == "": - # content = [loopElementHTML] - # else: - # 如果字串里有//即子孙查找,则不动语句 - if p["relativeXPath"].find("//") >= 0: - full_path = "(" + parentPath + \ - xpath + ")" + \ - "[" + str(index + 1) + "]" - content = pageHTML.xpath(full_path) - else: - content = loopElementHTML.xpath( - "/html/body/" + loopElementHTML[0][0].tag + xpath) - else: - if xpath.find("/body") < 0: - xpath = "/html/body" + xpath - content = pageHTML.xpath(xpath) - if len(content) > 0: - # html = etree.tostring(content[0], encoding='utf-8').decode('utf-8') - # 拼接所有文本内容并去掉两边的空白 - content = ' '.join(result.strip() - for result in content if result.strip()) - if p["nodeType"] == 2: - base_url = self.browser.current_url - content = urljoin(base_url, content) # 合并链接相对路径为绝对路径 - else: - content = p["default"] - if not self.dataNotFoundKeys[p["name"]]: - print('Element %s not found with parameter name %s when extracting data, use default, this error will only show once' % ( - p["relativeXPath"], p["name"])) - print("提取数据操作时,字段名 %s 对应XPath %s 未找到,使用默认值,本字段将不再重复报错" % ( - p["name"], p["relativeXPath"])) - self.dataNotFoundKeys[p["name"]] = True - self.recordLog( - 'Element %s not found, use default' % p["relativeXPath"]) - except Exception as e: - if not self.dataNotFoundKeys[p["name"]]: - print('Element %s not found with parameter name %s when extracting data, use default, this error will only show once' % ( - p["relativeXPath"], p["name"])) - print("提取数据操作时,字段名 %s 对应XPath %s 未找到(请查看原因,如是否翻页太快页面元素未加载出来),使用默认值,本字段将不再重复报错" % ( - p["name"], p["relativeXPath"])) - self.dataNotFoundKeys[p["name"]] = True - self.recordLog( - 'Element %s not found, use default' % p["relativeXPath"]) - self.outputParameters[p["name"]] = content - - # 对于不能优化的操作,使用selenium执行 - for p in para["paras"]: - if not p["optimizable"]: - content = "" - if not (p["contentType"] == 5 or p["contentType"] == 6): # 如果不是页面标题或URL,去找元素 - try: - # p["relativeXPath"] = p["relativeXPath"].lower() - # p["relativeXPath"] = lowercase_tags_in_xpath(p["relativeXPath"]) - if p["relative"]: # 是否相对xpath - if p["relativeXPath"] == "": # 相对xpath有时候就是元素本身,不需要二次查找 - element = loopElement - else: - # 如果字串里有//即子孙查找,则不动语句 - if p["relativeXPath"].find("//") >= 0: - full_path = "(" + parentPath + \ - p["relativeXPath"] + ")" + \ - "[" + str(index + 1) + "]" - element = self.browser.find_element( - By.XPATH, full_path, iframe=p["iframe"]) - else: - element = loopElement.find_element(By.XPATH, - p["relativeXPath"][1:]) - else: - element = self.browser.find_element( - By.XPATH, p["relativeXPath"], iframe=p["iframe"]) - except (NoSuchElementException, InvalidSelectorException, StaleElementReferenceException): # 找不到元素的时候,使用默认值 - # print(p) - try: - content = p["default"] - except Exception as e: - content = "" - self.outputParameters[p["name"]] = content - try: - if not self.dataNotFoundKeys[p["name"]]: - print('Element %s not found with parameter name %s when extracting data, use default, this error will only show once' % ( - p["relativeXPath"], p["name"])) - print("提取数据操作时,字段名 %s 对应XPath %s 未找到,使用默认值,本字段将不再重复报错" % ( - p["name"], p["relativeXPath"])) - self.dataNotFoundKeys[p["name"]] = True - self.recordLog( - 'Element %s not found, use default' % p["relativeXPath"]) - except: - pass - continue - except TimeoutException: # 超时的时候设置超时值 - self.Log('Time out after set seconds when getting data') - self.recordLog( - 'Time out after set seconds when getting data') - self.browser.execute_script('window.stop()') - if p["relative"]: # 是否相对xpath - if p["relativeXPath"] == "": # 相对xpath有时候就是元素本身,不需要二次查找 - element = loopElement - else: - element = loopElement.find_element(By.XPATH, - p["relativeXPath"][1:]) - else: - element = self.browser.find_element( - By.XPATH, p["relativeXPath"], iframe=p["iframe"]) - # rt.end() - else: - element = self.browser.find_element( - By.XPATH, "//body", iframe=p["iframe"]) - try: - self.execute_code( - 2, p["beforeJS"], p["beforeJSWaitTime"], element, iframe=p["iframe"]) # 执行前置js - content = self.get_content(p, element) - except StaleElementReferenceException: # 发生找不到元素的异常后,等待几秒重新查找 - self.recordLog( - 'StaleElementReferenceException: '+p["relativeXPath"]) - time.sleep(3) - try: - if p["relative"]: # 是否相对xpath - if p["relativeXPath"] == "": # 相对xpath有时候就是元素本身,不需要二次查找 - element = loopElement - self.recordLog( - 'StaleElementReferenceException: loopElement') - else: - element = loopElement.find_element(By.XPATH, - p["relativeXPath"][1:]) - self.recordLog( - 'StaleElementReferenceException: loopElement+relativeXPath') - else: - element = self.browser.find_element( - By.XPATH, p["relativeXPath"], iframe=p["iframe"]) - self.recordLog( - 'StaleElementReferenceException: relativeXPath') - content = self.get_content(p, element) - except StaleElementReferenceException: - self.recordLog( - 'StaleElementReferenceException: '+p["relativeXPath"]) - continue # 再出现类似问题直接跳过 - self.outputParameters[p["name"]] = content - self.execute_code( - 2, p["afterJS"], p["afterJSWaitTime"], element, iframe=p["iframe"]) # 执行后置JS - line = new_line(self.outputParameters, self.maxViewLength, self.outputParametersRecord) - self.OUTPUT.append(line) - # rt.end() - - -if __name__ == '__main__': - from multiprocessing import freeze_support - freeze_support() # 防止无限死循环多开 - config = { - "id": [0], - "saved_file_name": "", - "user_data": False, - "config_folder": "", - "config_file_name": "config.json", - "read_type": "remote", - "headless": False, - "server_address": "http://localhost:8074", - "version": "0.3.5", - } - c = Config(config) - print(c) - options = Options() - driver_path = "chromedriver.exe" - import platform - print(sys.platform, platform.architecture()) - option = webdriver.ChromeOptions() - if not os.path.exists(os.getcwd()+"/Data"): - os.mkdir(os.getcwd()+"/Data") - if sys.platform == "darwin" and platform.architecture()[0] == "64bit": - options.binary_location = "EasySpider.app/Contents/Resources/app/chrome_mac64.app/Contents/MacOS/Google Chrome" - # MacOS需要用option而不是options! - option.binary_location = "EasySpider.app/Contents/Resources/app/chrome_mac64.app/Contents/MacOS/Google Chrome" - option.add_extension("EasySpider.app/Contents/Resources/app/XPathHelper.crx") - options.add_extension("EasySpider.app/Contents/Resources/app/XPathHelper.crx") - driver_path = "EasySpider.app/Contents/Resources/app/chromedriver_mac64" - # options.binary_location = "chrome_mac64.app/Contents/MacOS/Google Chrome" - # # MacOS需要用option而不是options! - # option.binary_location = "chrome_mac64.app/Contents/MacOS/Google Chrome" - # driver_path = os.getcwd()+ "/chromedriver_mac64" - print(driver_path) - elif os.path.exists(os.getcwd()+"/EasySpider/resources"): # 打包后的路径 - print("Finding chromedriver in EasySpider", - os.getcwd()+"/EasySpider") - if sys.platform == "win32" and platform.architecture()[0] == "32bit": - options.binary_location = os.path.join( - os.getcwd(), "EasySpider/resources/app/chrome_win32/chrome.exe") # 指定chrome位置 - driver_path = os.path.join( - os.getcwd(), "EasySpider/resources/app/chrome_win32/chromedriver_win32.exe") - option.add_extension("EasySpider/resources/app/XPathHelper.crx") - elif sys.platform == "win32" and platform.architecture()[0] == "64bit": - options.binary_location = os.path.join( - os.getcwd(), "EasySpider/resources/app/chrome_win64/chrome.exe") - driver_path = os.path.join( - os.getcwd(), "EasySpider/resources/app/chrome_win64/chromedriver_win64.exe") - option.add_extension("EasySpider/resources/app/XPathHelper.crx") - elif sys.platform == "linux" and platform.architecture()[0] == "64bit": - options.binary_location = "EasySpider/resources/app/chrome_linux64/chrome" - driver_path = "EasySpider/resources/app/chrome_linux64/chromedriver_linux64" - option.add_extension("EasySpider/resources/app/XPathHelper.crx") - else: - print("Unsupported platform") - sys.exit() - print("Chrome location:", options.binary_location) - print("Chromedriver location:", driver_path) - # elif os.getcwd().find("ExecuteStage") >= 0: # 如果直接执行 - # print("Finding chromedriver in ./Chrome", - # os.getcwd()+"/Chrome") - # options.binary_location = "./Chrome/chrome.exe" # 指定chrome位置 - # # option.binary_location = "C:\\Users\\q9823\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe" - # driver_path = "./Chrome/chromedriver.exe" - elif os.path.exists(os.getcwd()+"/../ElectronJS"): - # 软件dev用 - print("Finding chromedriver in EasySpider", - os.getcwd()+"/ElectronJS") - option.binary_location = "../ElectronJS/chrome_win64/chrome.exe" # 指定chrome位置 - driver_path = "../ElectronJS/chrome_win64/chromedriver_win64.exe" - option.add_extension("../ElectronJS/XPathHelper.crx") - else: - options.binary_location = "./chrome.exe" # 指定chrome位置 - driver_path = "./chromedriver.exe" - option.add_extension("XPathHelper.crx") - - option.add_experimental_option( - 'excludeSwitches', ['enable-automation']) # 以开发者模式 - options.add_argument('-ignore-certificate-errors') - options.add_argument('-ignore -ssl-errors') - option.add_argument('-ignore-certificate-errors') - option.add_argument('-ignore -ssl-errors') - # user_data_dir = r'' # 注意没有Default! - - # options.add_argument('--user-data-dir='+p) - - # 总结: - # 0. 带Cookie需要用userdatadir - # 1. chrome_options才是配置用户文件和chrome文件地址的正确选项 - # 2. User Profile文件夹的路径是:C:\Users\用户名\AppData\Local\Google\Chrome\User Data不要加Default - # 3. 就算User Profile相同,chrome版本不同所存储的cookie信息也不同,也不能爬 - # 4. TMALL如果一直弹出验证码,而且无法通过验证,那么需要在其他浏览器上用 - try: - with open(c.config_folder + c.config_file_name, "r", encoding='utf-8') as f: - config = json.load(f) - absolute_user_data_folder = config["absolute_user_data_folder"] - print("\nAbsolute_user_data_folder:", - absolute_user_data_folder, "\n") - except: - pass - if c.user_data: - option.add_argument( - f'--user-data-dir={absolute_user_data_folder}') # TMALL 反扒 - option.add_argument("--profile-directory=Default") - options.add_argument( - f'--user-data-dir={absolute_user_data_folder}') # TMALL 反扒 - options.add_argument("--profile-directory=Default") - - if c.headless: - print("Headless mode") - print("无头模式") - option.add_argument("--headless") - options.add_argument("--headless") - - # options.add_argument( - # '--user-data-dir=C:\\Users\\q9823\\AppData\\Local\\Google\\Chrome\\User Data') # TMALL 反扒 - option.add_argument( - "--disable-blink-features=AutomationControlled") # TMALL 反扒 - options.add_argument( - "--disable-blink-features=AutomationControlled") # TMALL 反扒 - - threads = [] - for i in c.id: - # print(options) - print("id: ", i) - if c.read_type == "remote": - print("remote") - content = requests.get( - c.server_address + "/queryExecutionInstance?id=" + str(i)) - service = json.loads(content.text) # 加载服务信息 - else: - print("local") - with open("execution_instances/" + str(i) + ".json", 'r', encoding='utf-8') as f: - content = f.read() - service = json.loads(content) # 加载服务信息 - print("Task Name:", service["name"]) - print("任务名称:", service["name"]) - try: - cloudflare = service["cloudflare"] - except: - cloudflare = 0 - if cloudflare == 0: - options.add_experimental_option("prefs", { - # 设置文件下载路径 - "download.default_directory": "Data/Task_" + str(i), - "download.prompt_for_download": False, # 禁止下载提示框 - "plugins.plugins_list": [{"enabled": False, "name": "Chrome PDF Viewer"}], - "download.directory_upgrade": True, - "download.extensions_to_open": "applications/pdf", - "plugins.always_open_pdf_externally": True # 总是在外部程序中打开PDF - }) - option.add_experimental_option("prefs", { - # 设置文件下载路径 - "download.default_directory": "Data/Task_" + str(i), - "download.prompt_for_download": False, # 禁止下载提示框 - "plugins.plugins_list": [{"enabled": False, "name": "Chrome PDF Viewer"}], - "download.directory_upgrade": True, - "download.extensions_to_open": "applications/pdf", - "plugins.always_open_pdf_externally": True # 总是在外部程序中打开PDF - }) - try: - if service["environment"] == 1: - option.add_experimental_option( - 'mobileEmulation', {'deviceName': 'iPhone X'}) # 模拟iPhone X浏览 - options.add_experimental_option( - 'mobileEmulation', {'deviceName': 'iPhone X'}) # 模拟iPhone X浏览 - except: - pass - browser_t = MyChrome( - options=options, chrome_options=option, executable_path=driver_path) - elif cloudflare == 1: - browser_t = MyUCChrome( - options=options, chrome_options=option, executable_path=driver_path) - print("Pass Cloudflare Mode") - print("过Cloudflare验证模式") - event = Event() - event.set() - thread = BrowserThread(browser_t, i, service, - c.version, event, c.saved_file_name, config=config) - print("Thread with task id: ", i, " is created") - threads.append(thread) - thread.start() - # Set the pause operation - # if sys.platform != "linux": - # time.sleep(3) - # print("\n\n----------------------------------") - # print("正在运行任务,长按键盘p键可暂停任务的执行以便手工操作浏览器如输入验证码;如果想恢复任务的执行,请再次长按p键。") - # print("Running task, long press 'p' to pause the task for manual operation of the browser such as entering the verification code; If you want to resume the execution of the task, please long press 'p' again.") - # print("----------------------------------\n\n") - # Thread(target=check_pause, args=("p", event)).start() - # else: - time.sleep(3) - press_time = {"duration": 0, "is_pressed": False} - print("\n\n----------------------------------") - print("正在运行任务,长按键盘p键可暂停任务的执行以便手工操作浏览器如输入验证码;如果想恢复任务的执行,请再次长按p键。") - print("Running task, long press 'p' to pause the task for manual operation of the browser such as entering the verification code; If you want to resume the execution of the task, please long press 'p' again.") - print("----------------------------------\n\n") - # 使用监听器监听键盘输入 - try: - with Listener(on_press=on_press_creator(press_time, event), on_release=on_release_creator(event, press_time)) as listener: - listener.join() - except: - print("您的操作系统不支持暂停功能。") - print("Your operating system does not support the pause function.") - - - # print("线程长度:", len(threads) ) - - for thread in threads: - print() - thread.join() - - for thread in threads: - thread.browser.quit() - # print("Thread with task id: ", thread.id, " is closed") - print("程序已运行完成,请手动关闭此窗口。") - print("The program has finished running, please manually close this window.") diff --git a/.temp_to_pub/EasySpider_windows_x86/Code/myChrome.py b/.temp_to_pub/EasySpider_windows_x86/Code/myChrome.py deleted file mode 100644 index f54f0a5..0000000 --- a/.temp_to_pub/EasySpider_windows_x86/Code/myChrome.py +++ /dev/null @@ -1,165 +0,0 @@ -from selenium.webdriver.chrome.options import Options -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.common.action_chains import ActionChains -from selenium import webdriver -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -from selenium.webdriver.common.by import By -from selenium.common.exceptions import NoSuchElementException -from selenium.common.exceptions import TimeoutException -from selenium.common.exceptions import StaleElementReferenceException, InvalidSelectorException -from selenium.webdriver.common.desired_capabilities import DesiredCapabilities -from selenium.webdriver.support.ui import Select -from selenium.webdriver import ActionChains -from selenium.webdriver.common.by import By -import undetected_chromedriver as uc -desired_capabilities = DesiredCapabilities.CHROME -desired_capabilities["pageLoadStrategy"] = "none" - - - -class MyChrome(webdriver.Chrome): - - def __init__(self, *args, **kwargs): - self.iframe_env = False # 现在的环境是root还是iframe - super().__init__(*args, **kwargs) # 调用父类的 __init__ - - def find_element(self, by=By.ID, value=None, iframe=False): - # 在这里改变查找元素的行为 - if self.iframe_env: - super().switch_to.default_content() - self.iframe_env = False - if iframe: - # 获取所有的 iframe - try: - iframes = super().find_elements(By.CSS_SELECTOR, "iframe") - except Exception as e: - print(e) - find_element = False - # 遍历所有的 iframe 并点击里面的元素 - for iframe in iframes: - # 切换到 iframe - super().switch_to.default_content() - super().switch_to.frame(iframe) - self.iframe_env = True - try: - # 在 iframe 中查找并点击元素 - # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素 - element = super().find_element(by=by, value=value) - find_element = True - except: - print("No such element found in the iframe") - # 完成操作后切回主文档 - # super().switch_to.default_content() - if find_element: - return element - if not find_element: - raise NoSuchElementException - else: - return super().find_element(by=by, value=value) - - def find_elements(self, by=By.ID, value=None, iframe=False): - # 在这里改变查找元素的行为 - if self.iframe_env: - super().switch_to.default_content() - self.iframe_env = False - if iframe: - # 获取所有的 iframe - iframes = super().find_elements(By.CSS_SELECTOR, "iframe") - find_element = False - # 遍历所有的 iframe 并点击里面的元素 - for iframe in iframes: - # 切换到 iframe - try: - super().switch_to.default_content() - super().switch_to.frame(iframe) - self.iframe_env = True - # 在 iframe 中查找并点击元素 - # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素 - elements = super().find_elements(by=by, value=value) - if len(elements) > 0: - find_element = True - # 完成操作后切回主文档 - # super().switch_to.default_content() - if find_element: - return elements - except: - print("No such element found in the iframe") - if not find_element: - raise NoSuchElementException - else: - return super().find_elements(by=by, value=value) - - -class MyUCChrome(uc.Chrome): - - def __init__(self, *args, **kwargs): - self.iframe_env = False # 现在的环境是root还是iframe - super().__init__(*args, **kwargs) # 调用父类的 __init__ - - def find_element(self, by=By.ID, value=None, iframe=False): - # 在这里改变查找元素的行为 - if self.iframe_env: - super().switch_to.default_content() - self.iframe_env = False - if iframe: - # 获取所有的 iframe - try: - iframes = super().find_elements(By.CSS_SELECTOR, "iframe") - except Exception as e: - print(e) - find_element = False - # 遍历所有的 iframe 并点击里面的元素 - for iframe in iframes: - # 切换到 iframe - super().switch_to.default_content() - super().switch_to.frame(iframe) - self.iframe_env = True - try: - # 在 iframe 中查找并点击元素 - # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素 - element = super().find_element(by=by, value=value) - find_element = True - except: - print("No such element found in the iframe") - # 完成操作后切回主文档 - # super().switch_to.default_content() - if find_element: - return element - if not find_element: - raise NoSuchElementException - else: - return super().find_element(by=by, value=value) - - def find_elements(self, by=By.ID, value=None, iframe=False): - # 在这里改变查找元素的行为 - if self.iframe_env: - super().switch_to.default_content() - self.iframe_env = False - if iframe: - # 获取所有的 iframe - iframes = super().find_elements(By.CSS_SELECTOR, "iframe") - find_element = False - # 遍历所有的 iframe 并点击里面的元素 - for iframe in iframes: - # 切换到 iframe - try: - super().switch_to.default_content() - super().switch_to.frame(iframe) - self.iframe_env = True - # 在 iframe 中查找并点击元素 - # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素 - elements = super().find_elements(by=by, value=value) - if len(elements) > 0: - find_element = True - # 完成操作后切回主文档 - # super().switch_to.default_content() - if find_element: - return elements - except: - print("No such element found in the iframe") - if not find_element: - raise NoSuchElementException - else: - return super().find_elements(by=by, value=value) - diff --git a/.temp_to_pub/EasySpider_windows_x86/Code/utils.py b/.temp_to_pub/EasySpider_windows_x86/Code/utils.py deleted file mode 100644 index 67f139e..0000000 --- a/.temp_to_pub/EasySpider_windows_x86/Code/utils.py +++ /dev/null @@ -1,348 +0,0 @@ -# 控制流程的暂停和继续 - -import csv -import datetime -import json -import os -import re -import time -import uuid -import keyboard -from openpyxl import Workbook, load_workbook -import requests -from urllib.parse import urlparse -import pymysql -from lxml import etree - -def is_valid_url(url): - try: - result = urlparse(url) - return all([result.scheme, result.netloc]) - except ValueError: - return False - -def lowercase_tags_in_xpath(xpath): - return re.sub(r"([A-Z]+)(?=[\[\]//]|$)", lambda x: x.group(0).lower(), xpath) - - -def on_press_creator(press_time, event): - def on_press(key): - try: - if key.char == 'p': - if press_time["is_pressed"] == False: # 没按下p键时,记录按下p键的时间 - press_time["duration"] = time.time() - press_time["is_pressed"] = True - else: # 按下p键时,判断按下p键的时间是否超过2.5秒 - duration = time.time() - press_time["duration"] - if duration > 2: - if event._flag == False: - print("任务执行中,长按p键暂停执行。") - print("Task is running, long press 'p' to pause.") - # 设置Event的值为True,使得线程b可以继续执行 - event.set() - else: - # 设置Event的值为False,使得线程b暂停执行 - print("任务已暂停,长按p键继续执行...") - print("Task paused, long press 'p' to continue...") - event.clear() - press_time["duration"] = time.time() - press_time["is_pressed"] = False - # print("按下p键时间:", press_time["duration"]) - except: - pass - return on_press - -def on_release_creator(event, press_time): - def on_release(key): - try: - # duration = time.time() - press_time["duration"] - # # print("松开p键时间:", time.time(), "Duration: ", duration) - # if duration > 2.5 and key.char == 'p': - # if event._flag == False: - # print("任务执行中,按p键暂停执行。") - # print("Task is running, press 'p' to pause.") - # # 设置Event的值为True,使得线程b可以继续执行 - # event.set() - # else: - # # 设置Event的值为False,使得线程b暂停执行 - # print("任务已暂停,按p键继续执行...") - # print("Task paused, press 'p' to continue...") - # event.clear() - # press_time["duration"] = time.time() - press_time["is_pressed"] = False - except: - pass - return on_release - - -def check_pause(key, event): - while True: - if keyboard.is_pressed(key): # 按下p键,暂停程序 - if event._flag == False: - print("任务执行中,长按p键暂停执行。") - print("Task is running, long press 'p' to pause.") - # 设置Event的值为True,使得线程b可以继续执行 - event.set() - else: - # 设置Event的值为False,使得线程b暂停执行 - print("任务已暂停,长按p键继续执行...") - print("Task paused, press 'p' to continue...") - event.clear() - time.sleep(1) # 每秒检查一次 - - -def download_image(url, save_directory): - # 定义浏览器头信息 - headers = { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' - } - if is_valid_url(url): - # 发送 GET 请求获取图片数据 - response = requests.get(url, headers=headers) - - # 检查响应状态码是否为成功状态 - if response.status_code == requests.codes.ok: - # 提取文件名 - file_name = url.split('/')[-1].split("?")[0] - - # 生成唯一的新文件名 - new_file_name = file_name + '_' + \ - str(uuid.uuid4()) + '_' + file_name - - # 构建保存路径 - save_path = os.path.join(save_directory, new_file_name) - - # 保存图片到本地 - with open(save_path, 'wb') as file: - file.write(response.content) - - print("图片已成功下载到:", save_path) - print("The image has been successfully downloaded to:", save_path) - else: - print("下载图片失败,请检查此图片链接是否有效:", url) - print( - "Failed to download image, please check if this image link is valid:", url) - else: - print("下载图片失败,请检查此图片链接是否有效:", url) - print("Failed to download image, please check if this image link is valid:", url) - - -def get_output_code(output): - try: - if output.find("rue") != -1: # 如果返回值中包含true - code = 1 - else: - code = int(output) - except: - code = 0 - return code - -# 判断字段是否为空 - - -def isnull(s): - return len(s) != 0 - -def new_line(outputParameters, maxViewLength, record): - line = [] - i = 0 - for value in outputParameters.values(): - line.append(value) - if record[i]: - print(value[:maxViewLength], " ", end="") - i += 1 - print("") - return line - -def write_to_csv(file_name, data, record): - with open(file_name, 'a', encoding='utf-8-sig', newline="") as f: - f_csv = csv.writer(f) - for line in data: - to_write = [] - for i in range(len(line)): - if record[i]: - to_write.append(line[i]) - f_csv.writerow(to_write) - f.close() - - -def write_to_excel(file_name, data, types, record): - first = False - if os.path.exists(file_name): - # 加载现有的工作簿 - wb = load_workbook(file_name) - ws = wb.active - else: - # 创建新的工作簿和工作表 - wb = Workbook() - ws = wb.active - first = True - # 追加数据到工作表 - for line in data: - if not first: # 如果不是第一行,需要转换数据类型 - for i in range(len(line)): - if types[i] == "int" or types[i] == "bigInt": - try: - line[i] = int(line[i]) - except: - line[i] = 0 - elif types[i] == "double": - try: - line[i] = float(line[i]) - except: - line[i] = 0.0 - else: - first = False - to_write = [] - for i in range(len(line)): - if record[i]: - to_write.append(line[i]) - ws.append(to_write) - # 保存工作簿 - wb.save(file_name) - - - - - -class Time: - def __init__(self, type1=""): - self.t = int(round(time.time() * 1000)) - self.type = type1 - - def end(self): - at = int(round(time.time() * 1000)) - print("Time used for", self.type, ":", at - self.t, "ms") - - -class myMySQL: - def __init__(self, config_file="mysql_config.json"): - # 读取配置文件 - try: - with open(config_file, 'r') as f: - config = json.load(f) - host = config["host"] - port = config["port"] - user = config["user"] - passwd = config["password"] - db = config["database"] - except: - print("读取配置文件失败,请检查配置文件:"+config_file+"是否存在。") - print("Failed to read configuration file, please check if the configuration file: "+config_file+" exists.") - try: - self.conn = pymysql.connect( - host=host, port=port, user=user, passwd=passwd, db=db) - print("成功连接到数据库。") - print("Successfully connected to the database.") - except: - print("连接数据库失败,请检查配置文件是否正确。") - print("Failed to connect to the database, please check if the configuration file is correct.") - - def create_table(self, table_name, parameters): - self.table_name = table_name - self.field_sql = "(" - cursor = self.conn.cursor() - # 检查表是否存在 - cursor.execute("SHOW TABLES LIKE '%s'" % table_name) - result = cursor.fetchone() - - sql = "CREATE TABLE " + table_name + " (_id INT AUTO_INCREMENT PRIMARY KEY, " - for item in parameters: - if item["recordASField"]: - name = item['name'] - if item['type'] == 'int': - sql += f"{name} INT, " - elif item['type'] == 'double': - sql += f"{name} DOUBLE, " - elif item['type'] == 'text': - sql += f"{name} TEXT, " - elif item['type'] == 'mediumText': - sql += f"{name} MEDIUMTEXT, " - elif item['type'] == 'longText': - sql += f"{name} LONGTEXT, " - elif item['type'] == 'datetime': - sql += f"{name} DATETIME, " - elif item['type'] == 'date': - sql += f"{name} DATE, " - elif item['type'] == 'time': - sql += f"{name} TIME, " - elif item['type'] == 'varchar': - sql += f"{name} VARCHAR(255), " - elif item['type'] == 'bigInt': - sql += f"{name} BIGINT, " - self.field_sql += f"{name}, " - # 移除最后的逗号并添加闭合的括号 - sql = sql.rstrip(', ') + ")" - self.field_sql = self.field_sql.rstrip(', ') + ")" - - # 如果表不存在,创建它 - if not result: - # 执行SQL命令 - cursor.execute(sql) - else: - print("数据表" + table_name + "已存在。") - print("The data table " + table_name + " already exists.") - cursor.close() - - def write_to_mysql(self, OUTPUT, record, types): - # 创建一个游标对象 - cursor = self.conn.cursor() - - for line in OUTPUT: - for i in range(len(line)): - if types[i] == "int" or types[i] == "bigInt": - try: - line[i] = int(line[i]) - except: - line[i] = 0 - elif types[i] == "double": - try: - line[i] = float(line[i]) - except: - line[i] = 0.0 - elif types[i] == "datetime": - try: - line[i] = datetime.datetime.strptime(line[i], '%Y-%m-%d %H:%M:%S') - except: - line[i] = datetime.datetime.strptime("1970-01-01 00:00:00", '%Y-%m-%d %H:%M:%S') - elif types[i] == "date": - try: - line[i] = datetime.datetime.strptime(line[i], '%Y-%m-%d') - except: - line[i] = datetime.datetime.strptime("1970-01-01", '%Y-%m-%d') - elif types[i] == "time": - try: - line[i] = datetime.datetime.strptime(line[i], '%H:%M:%S') - except: - line[i] = datetime.datetime.strptime("00:00:00", '%H:%M:%S') - to_write = [] - for i in range(len(line)): - if record[i]: - to_write.append(line[i]) - # 构造插入数据的 SQL 语句 - sql = f"INSERT INTO "+ self.table_name +" "+self.field_sql+" VALUES (" - for item in to_write: - sql += "%s, " - # 移除最后的逗号并添加闭合的括号 - sql = sql.rstrip(', ') + ")" - # 执行 SQL 语句 - try: - cursor.execute(sql, to_write) - except Exception as e: - print("Error:", e) - print("Error SQL:", sql, to_write) - print("插入数据库错误,请查看以上的错误提示,然后检查数据的类型是否正确,是否文本过长(超过一万的文本类型要设置为大文本)。") - print("Inserting database error, please check the above error, and then check whether the data type is correct, whether the text is too long (text type over 10,000 should be set to large text).") - print("重新执行任务时,请删除数据库中的数据表" + self.table_name + ",然后再次运行程序。") - print("When re-executing the task, please delete the data table " + self.table_name + " in the database, and then run the program again.") - - # 提交到数据库执行 - self.conn.commit() - - # 关闭游标和连接 - cursor.close() - - def close(self): - self.conn.close() - print("成功关闭数据库。") - print("Successfully closed the database.") diff --git a/.temp_to_pub/compress.py b/.temp_to_pub/compress.py index 6dc31b4..e149994 100644 --- a/.temp_to_pub/compress.py +++ b/.temp_to_pub/compress.py @@ -73,22 +73,22 @@ if __name__ == "__main__": compress_folder_to_7z("./EasySpider_windows_x64", file_name) print(f"Compress {file_name} successfully!") elif sys.platform == "win32" and platform.architecture()[0] == "32bit": - file_name = f"EasySpider_{easyspider_version}_windows_x86.7z" - if os.path.exists("./EasySpider_windows_x86/user_data"): - shutil.rmtree("./EasySpider_windows_x86/user_data") - if os.path.exists("./EasySpider_windows_x86/Data"): - shutil.rmtree("./EasySpider_windows_x86/Data") - if os.path.exists("./EasySpider_windows_x86/execution_instances"): - shutil.rmtree("./EasySpider_windows_x86/execution_instances") - if os.path.exists("./EasySpider_windows_x86/config.json"): - os.remove("./EasySpider_windows_x86/config.json") - if os.path.exists("./EasySpider_windows_x86/mysql_config.json"): - os.remove("./EasySpider_windows_x86/mysql_config.json") - os.mkdir("./EasySpider_windows_x86/Data") - os.mkdir("./EasySpider_windows_x86/execution_instances") - compress_folder_to_7z_split("./EasySpider_windows_x86", file_name) + file_name = f"EasySpider_{easyspider_version}_windows_x32.7z" + if os.path.exists("./EasySpider_windows_x32/user_data"): + shutil.rmtree("./EasySpider_windows_x32/user_data") + if os.path.exists("./EasySpider_windows_x32/Data"): + shutil.rmtree("./EasySpider_windows_x32/Data") + if os.path.exists("./EasySpider_windows_x32/execution_instances"): + shutil.rmtree("./EasySpider_windows_x32/execution_instances") + if os.path.exists("./EasySpider_windows_x32/config.json"): + os.remove("./EasySpider_windows_x32/config.json") + if os.path.exists("./EasySpider_windows_x32/mysql_config.json"): + os.remove("./EasySpider_windows_x32/mysql_config.json") + os.mkdir("./EasySpider_windows_x32/Data") + os.mkdir("./EasySpider_windows_x32/execution_instances") + compress_folder_to_7z_split("./EasySpider_windows_x32", file_name) print(f"Compress {file_name} Split successfully!") - compress_folder_to_7z("./EasySpider_windows_x86", file_name) + compress_folder_to_7z("./EasySpider_windows_x32", file_name) print(f"Compress {file_name} successfully!") elif sys.platform == "linux" and platform.architecture()[0] == "64bit": file_name = f"EasySpider_{easyspider_version}_Linux_x64.tar.xz" diff --git a/ElectronJS/README.md b/ElectronJS/README.md index 5a9de6f..5eed76b 100644 --- a/ElectronJS/README.md +++ b/ElectronJS/README.md @@ -47,7 +47,7 @@ If you already have Chrome installed on your local machine, you can directly exe 下载一个Chrome:[https://www.google.com/chrome/](https://www.google.com/chrome/),然后找到Chrome安装后的文件夹,如`C:\Program Files\Google\Chrome\Application`,把这个文件夹拷贝到此`ElectronJS`文件夹内,并按照以下格式更名: ``` -chrome_win32/ # for windows x86 +chrome_win32/ # for windows x32 chrome_win64/ # for windows x64 chrome_linux64/ # for linux x64 chrome_mac64/ # for mac x64 @@ -56,7 +56,7 @@ chrome_mac64/ # for mac x64 然后,从下面的页面下载和**自己安装的Chrome版本一致**的Chromedriver:[https://chromedriver.chromium.org/downloads](https://chromedriver.chromium.org/downloads),把chromedriver放入刚刚的chrome文件夹内,并更名为下面的格式: ``` -chromedriver_win32.exe # for windows x86 +chromedriver_win32.exe # for windows x32 chromedriver_win64.exe # for windows x64 chromedriver_linux64 # for linux x64 chromedriver_mac64 # for mac x64 @@ -70,7 +70,7 @@ chromedriver_mac64 # for mac x64 Download a Chrome from the Internet: https://www.google.com/chrome/, and then put them into this folder, with name format of the following: ``` -chrome_win32/ # for windows x86 +chrome_win32/ # for windows x32 chrome_win64/ # for windows x64 chrome_linux64/ # for linux x64 chrome_mac64/ # for mac x64 @@ -79,7 +79,7 @@ chrome_mac64/ # for mac x64 Then, download the corresponding chromedriver from the Internet on this page: https://chromedriver.chromium.org/downloads, note the **chromedriver version must match your chrome version!!!** And put them into corresponding chrome folder, with name format of the following: ``` -chromedriver_win32.exe # for windows x86 +chromedriver_win32.exe # for windows x32 chromedriver_win64.exe # for windows x64 chromedriver_linux64 # for linux x64 chromedriver_mac64 # for mac x64 diff --git a/ElectronJS/clean_and_release_win32.cmd b/ElectronJS/clean_and_release_win32.cmd index 032dc58..6a8b0c0 100644 --- a/ElectronJS/clean_and_release_win32.cmd +++ b/ElectronJS/clean_and_release_win32.cmd @@ -6,20 +6,20 @@ rmdir /s /q out\EasySpider\resources\app\.idea rmdir /s /q out\EasySpider\resources\app\tasks rmdir /s /q out\EasySpider\resources\app\execution_instances rmdir /s /q out\EasySpider\resources\app\user_data -rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x86\EasySpider +rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x32\EasySpider del out\EasySpider\resources\app\vs_BuildTools.exe -move out\EasySpider ..\.temp_to_pub\EasySpider_windows_x86\EasySpider -rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x86\Code -mkdir ..\.temp_to_pub\EasySpider_windows_x86\Code -copy ..\ExecuteStage\easyspider_executestage.py ..\.temp_to_pub\EasySpider_windows_x86\Code -copy ..\ExecuteStage\myChrome.py ..\.temp_to_pub\EasySpider_windows_x86\Code -copy ..\ExecuteStage\utils.py ..\.temp_to_pub\EasySpider_windows_x86\Code -copy ..\ExecuteStage\requirements.txt ..\.temp_to_pub\EasySpider_windows_x86\Code -xcopy ..\ExecuteStage\undetected_chromedriver_ES ..\.temp_to_pub\EasySpider_windows_x86\Code\undetected_chromedriver_ES /E /I /Y -rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x86\user_data -rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x86\execution_instances -mkdir ..\.temp_to_pub\EasySpider_windows_x86\execution_instances -rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x86\Data -mkdir ..\.temp_to_pub\EasySpider_windows_x86\Data +move out\EasySpider ..\.temp_to_pub\EasySpider_windows_x32\EasySpider +rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x32\Code +mkdir ..\.temp_to_pub\EasySpider_windows_x32\Code +copy ..\ExecuteStage\easyspider_executestage.py ..\.temp_to_pub\EasySpider_windows_x32\Code +copy ..\ExecuteStage\myChrome.py ..\.temp_to_pub\EasySpider_windows_x32\Code +copy ..\ExecuteStage\utils.py ..\.temp_to_pub\EasySpider_windows_x32\Code +copy ..\ExecuteStage\requirements.txt ..\.temp_to_pub\EasySpider_windows_x32\Code +xcopy ..\ExecuteStage\undetected_chromedriver_ES ..\.temp_to_pub\EasySpider_windows_x32\Code\undetected_chromedriver_ES /E /I /Y +rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x32\user_data +rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x32\execution_instances +mkdir ..\.temp_to_pub\EasySpider_windows_x32\execution_instances +rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x32\Data +mkdir ..\.temp_to_pub\EasySpider_windows_x32\Data del EasySpider_en.crx del EasySpider_zh.crx \ No newline at end of file diff --git a/Readme.md b/Readme.md index fe22c7e..8d99ebe 100644 --- a/Readme.md +++ b/Readme.md @@ -38,6 +38,20 @@ A visual code-free/no-code web crawler/spider, just select the content you want Refer to the [Releases Page](https://github.com/NaiboWang/EasySpider/releases) to download the latest version of EasySpider. +## 支持作者/Support Author + +易采集EasySpider是一款完全免费无广告的开源软件,软件开发和维护全靠作者用爱发电,因此您可以选择支持作者让作者有更多的热情和精力维护此软件,或者您使用了此软件进行了盈利,欢迎您通过下面的方式支持作者: + +1. 支付宝账号:naibowang@foxmail.com,也可以扫描下方二维码。 +2. 微信收款:扫描下方二维码。 +3. PayPal账号:naibowang,也可以扫描下方二维码。 + +Support author at paypal if you like this software, or use it to make profit: naibowang + +![QRCodes](media/QRCODES.png) + + + ## 文档/Documentation 请点此进入[教程文档](https://github.com/NaiboWang/EasySpider/wiki),如有英文可暂时翻译一下,或看作者的[硕士毕业论文](Docs/%E9%9D%A2%E5%90%91WEB%E5%BA%94%E7%94%A8%E7%9A%84%E6%99%BA%E8%83%BD%E5%8C%96%E6%9C%8D%E5%8A%A1%E5%B0%81%E8%A3%85%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.pdf)(主要看第三章和第五章)。 diff --git a/media/QRCODES.png b/media/QRCODES.png new file mode 100644 index 0000000000000000000000000000000000000000..2f7a23471c76e16fc82d8626919aa24a1b9eca8b GIT binary patch literal 225510 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%0Du8f93xjwUiqM_ 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ᬎ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