Ver código fonte

MACOS version

pull/43/head
Naibo Wang 1 ano atrás
pai
commit
4669caf0c4
46 arquivos alterados com 164 adições e 26 exclusões
  1. BIN
      .DS_Store
  2. +3
    -0
      .gitignore
  3. BIN
      ElectronJS/.DS_Store
  4. +1
    -1
      ElectronJS/config.json
  5. +2
    -0
      ElectronJS/execute_macos.sh
  6. +1
    -1
      ElectronJS/execution_instances/0.json
  7. BIN
      ElectronJS/favicon.icns
  8. +9
    -7
      ElectronJS/main.js
  9. +4
    -4
      ElectronJS/package.json
  10. +14
    -0
      ElectronJS/package_macos.sh
  11. +12
    -3
      ElectronJS/server.js
  12. +4
    -0
      ElectronJS/src/taskGrid/global.js
  13. +39
    -1
      ElectronJS/src/taskGrid/invokeTask.html
  14. BIN
      ExecuteStage/.DS_Store
  15. +11
    -6
      ExecuteStage/easyspider_executestage.py
  16. +4
    -2
      ExecuteStage/generateExecutable_Macos.sh
  17. +2
    -1
      Releases/.gitignore
  18. +1
    -0
      Releases/EasySpider_MacOS_all_arch/config.json
  19. BIN
      Releases/EasySpider_MacOS_all_arch/easyspider_executestage
  20. +1
    -0
      Releases/EasySpider_MacOS_all_arch/execution_instances/0.json
  21. +1
    -0
      Releases/EasySpider_MacOS_all_arch/execution_instances/1.json
  22. +1
    -0
      Releases/EasySpider_MacOS_all_arch/execution_instances/2.json
  23. +31
    -0
      Releases/EasySpider_MacOS_all_arch/readme.txt
  24. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/11.json
  25. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/15.json
  26. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/16.json
  27. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/17.json
  28. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/19.json
  29. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/2.json
  30. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/20.json
  31. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/23.json
  32. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/25.json
  33. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/27.json
  34. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/28.json
  35. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/29.json
  36. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/30.json
  37. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/31.json
  38. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/32.json
  39. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/33.json
  40. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/34.json
  41. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/35.json
  42. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/36.json
  43. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/4.json
  44. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/5.json
  45. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/6.json
  46. +1
    -0
      Releases/EasySpider_MacOS_all_arch/tasks/7.json

BIN
.DS_Store Ver arquivo


+ 3
- 0
.gitignore Ver arquivo

@ -1,3 +1,5 @@
.DS_Store/
.DS_Store
.idea/
node_modules/
ServiceWrapper/
@ -9,3 +11,4 @@ old_code/
*.7z
*.mp4
*.tar.xz
*.zip

BIN
ElectronJS/.DS_Store Ver arquivo


+ 1
- 1
ElectronJS/config.json Ver arquivo

@ -1 +1 @@
{"webserver_address":"http://localhost","webserver_port":8074,"user_data_folder":"./user_data","absolute_user_data_folder":"/Users/naibowang/Documents/EasySpider/ElectronJS/user_data"}
{"webserver_address":"http://localhost","webserver_port":8074,"user_data_folder":"./user_data123","absolute_user_data_folder":"/Users/naibowang/Documents/EasySpider/ElectronJS/user_data123"}

+ 2
- 0
ElectronJS/execute_macos.sh Ver arquivo

@ -1,3 +1,5 @@
#!/bin/bash
echo "Executing EasySpider on MacOS"
./easyspider_executestage $1 $2 $3 $4 $5 $6 $7 $8 $9

+ 1
- 1
ElectronJS/execution_instances/0.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


BIN
ElectronJS/favicon.icns Ver arquivo


+ 9
- 7
ElectronJS/main.js Ver arquivo

@ -34,7 +34,7 @@ if (process.platform === 'win32' && process.arch === 'ia32') {
} else if (process.platform === 'darwin') {
driverPath = path.join(__dirname, "chromedriver_mac64");
chromeBinaryPath = path.join(__dirname, "chrome_mac64.app/Contents/MacOS/Google Chrome");
execute_path = path.join(__dirname, "execute_macos.sh");
execute_path = path.join(__dirname, "");
} else if (process.platform === 'linux') {
driverPath = path.join(__dirname, "chrome_linux64/chromedriver_linux64");
chromeBinaryPath = path.join(__dirname, "chrome_linux64/chrome");
@ -204,7 +204,7 @@ async function beginInvoke(msg) {
if (msg.message.user_data_folder == null || msg.message.user_data_folder == undefined || msg.message.user_data_folder == "") {
parameters = ["--id", msg.message.id, "--server_address", server_address, "--user_data", 0];
} else {
let user_data_folder_path = __dirname.indexOf("resources") >= 0 && __dirname.indexOf("app") >= 0 ? path.join(__dirname, "../../..", msg.message.user_data_folder) : path.join(__dirname, msg.message.user_data_folder);
let user_data_folder_path = path.join(task_server.getDir(), msg.message.user_data_folder);
parameters = ["--id", msg.message.id, "--server_address", server_address, "--user_data", 1];
config.user_data_folder = msg.message.user_data_folder;
config.absolute_user_data_folder = user_data_folder_path;
@ -215,10 +215,12 @@ async function beginInvoke(msg) {
// });
let spawn = require("child_process").spawn;
let child_process = spawn(execute_path, parameters);
child_process.stdout.on('data', function (data) {
console.log(data.toString());
});
if (process.platform != "darwin") {
let child_process = spawn(execute_path, parameters);
child_process.stdout.on('data', function (data) {
console.log(data.toString());
});
}
}
}
@ -282,7 +284,7 @@ async function runBrowser(lang = "en", user_data_folder = '') {
}
options.setChromeBinaryPath(chromeBinaryPath);
if (user_data_folder != "") {
let dir = __dirname.indexOf("resources") >= 0 && __dirname.indexOf("app") >= 0 ? path.join(__dirname, "../../..", user_data_folder) : path.join(__dirname, user_data_folder);
let dir = path.join(task_server.getDir(), user_data_folder);
console.log(dir);
options.addArguments("--user-data-dir=" + dir);
config.user_data_folder = user_data_folder;

+ 4
- 4
ElectronJS/package.json Ver arquivo

@ -1,8 +1,8 @@
{
"name": "easy-spider",
"productName": "EasySpider",
"version": "0.1.0",
"icon": "favicon.ico",
"version": "0.2.0",
"icon": "./favicon",
"description": "NoCode Visual Web Crawler",
"main": "main.js",
"scripts": {
@ -59,8 +59,8 @@
}
],
"packagerConfig": {
"icon": "favicon.ico",
"appVersion": "0.1.0",
"icon": "./favicon",
"appVersion": "0.2.0",
"name": "EasySpider",
"executableName": "EasySpider",
"appCopyright": "Naibo Wang (naibowang@foxmail.com)",

+ 14
- 0
ElectronJS/package_macos.sh Ver arquivo

@ -0,0 +1,14 @@
#!/bin/bash
# This script is used to build.md the package for Linux 64-bit.
rm -rf out
rm -r ../Releases/EasySpider_MacOS_all_arch/EasySpider.app
npm run make
unzip out/make/zip/darwin/x64/EasySpider-darwin-x64-* -d ../Releases/EasySpider_MacOS_all_arch/
rm ../Releases/EasySpider_MacOS_all_arch/EasySpider.app/Contents/Resources/app/VS_BuildTools.exe
rm -r ../Releases/EasySpider_MacOS_all_arch/EasySpider.app/Contents/Resources/app/chrome_win64
rm -r ../Releases/EasySpider_MacOS_all_arch/EasySpider.app/Contents/Resources/app/Data
rm -r ../Releases/EasySpider_MacOS_all_arch/EasySpider.app/Contents/Resources/app/.idea
rm -r ../Releases/EasySpider_MacOS_all_arch/EasySpider.app/Contents/Resources/app/tasks
rm -r ../Releases/EasySpider_MacOS_all_arch/EasySpider.app/Contents/Resources/app/execution_instances
rm -r ../Releases/EasySpider_MacOS_all_arch/EasySpider.app/Contents/Resources/app/user_data

+ 12
- 3
ElectronJS/server.js Ver arquivo

@ -20,9 +20,14 @@ function compare(p){ //这是比较函数
return b - a; //降序
}
}
function getDir(){
if(__dirname.indexOf("app") >= 0 && __dirname.indexOf("resources") >= 0){
return path.join(__dirname,"../../..");
if(__dirname.indexOf("app") >= 0 && __dirname.indexOf("sources") >= 0){
if(process.platform == "darwin"){
return path.join(__dirname,"../../../..");
} else {
return path.join(__dirname,"../../..");
}
} else{
return __dirname;
}
@ -223,7 +228,10 @@ exports.start = function(port = 8074) {
let file_names = [];
fs.readdirSync(path.join(getDir(), "execution_instances")).forEach((file)=>{
try{
file_names.push(parseInt(file.split(".")[0]));
if(file.split(".")[1] == "json"){
file_names.push(parseInt(file.split(".")[0]));
}
console.log(file);
} catch (error) {
}
@ -232,6 +240,7 @@ exports.start = function(port = 8074) {
if (file_names.length != 0) {
eid = Math.max(...file_names) + 1;
}
console.log(file_names);
task["id"] = eid;
task = JSON.stringify(task);
fs.writeFile(path.join(getDir(), `execution_instances/${eid}.json`), task, (err) => {});

+ 4
- 0
ElectronJS/src/taskGrid/global.js Ver arquivo

@ -5,6 +5,10 @@ function getUrlParam(name) {
return ""; //返回参数值,默认后台地址
}
function isMac() {
return /macintosh|mac os x/i.test(navigator.userAgent);
};
Vue.filter('lang', function (value) {
if (getUrlParam("lang") == "zh") {
return value.split("~")[1];

+ 39
- 1
ElectronJS/src/taskGrid/invokeTask.html Ver arquivo

@ -8,6 +8,7 @@
name="viewport">
<meta content="ie=edge" http-equiv="X-UA-Compatible">
<script src="vue.js"></script>
<script src="bootstrap/js/bootstrap.js"></script>
<link href="bootstrap/css/bootstrap.css" rel="stylesheet"></link>
<title>Task Invoke</title>
<style>
@ -34,8 +35,32 @@
</head>
<body>
<div class="row" style="margin-top: 40px;">
<div class="col-md-6" id="taskInfo" style="margin:0 auto" v-if="show">
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="myModalLabel">{{"Task Invocation Instruction~执行任务说明" | lang}}</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
<input onkeydown="inputDelete(event)" id="serviceId" type="hidden" name="serviceId" value="-1"></input>
<input onkeydown="inputDelete(event)" id="url" type="hidden" name="url" value="about:blank"></input>
<label>{{"For MacOS, please open a terminal, go to EasySpider's folder, and then type the following command to run the task (EasySpider cannot quit when executing command):~对于MacOS系统,请在EasySpider目录下打开命令行工具Terminal,然后复制和运行以下命令以执行任务(执行命令时不能退出EasySpider):" | lang}}</label>
<textarea class="form-control">{{command}}</textarea>
</div>
<!-- <div class="modal-footer">
<button type="button" id="saveAsButton" class="btn btn-outline-primary">另存为</button>
<button type="button" id="saveButton" class="btn btn-primary">保存</button>
</div> -->
</div>
<!-- /.modal-content -->
</div>
</div>
<nav aria-label="breadcrumb">
<ol class="breadcrumb" style="padding-left:0;background-color: white">
<li @click="gotoHome" class="breadcrumb-item"><a href="#">{{"Home~首页" | lang}}</a></li>
@ -74,7 +99,7 @@
</tbody>
</table>
<div class="form-group" style="margin-top: 10px">
<label>{{"User Data Folder (If you want to load the cookie data from your local browser, please set this folder path, and then cilck the 'Run with (Data Mode)' button to run the task):~用户本地浏览器数据目录(如果需要使用本地的登录信息和cookie,请设置此目录,并点击下方“执行(带用户信息模式)”按钮开始执行任务):" | lang}}</label>
<label>{{"User Data Folder (If you want to load the cookie, data and extension(s) from your local browser, please set this folder path, and then cilck the 'Run with (Data Mode)' button to run the task):~用户本地浏览器数据目录(如果需要使用本地的登录信息,插件和cookie,请设置此目录,并点击下方“执行(带用户信息模式)”按钮开始执行任务):" | lang}}</label>
<input type="text" class="form-control" v-model="user_data_folder"></input>
</div>
</form>
@ -127,10 +152,12 @@
user_data_folder:"",
with_user_data: true,
backEndAddressServiceWrapper: getUrlParam("backEndAddressServiceWrapper"),
command: "./easyspider_executestage "
}, mounted() {
$.get(this.backEndAddressServiceWrapper + "/getConfig", function (result) {
app.$data.user_data_folder = result.user_data_folder;
});
//TODO 翻译 写清楚readme有关浏览器版本的问题 logo更换 提示看文档来运行
},
methods: {
gotoHome: function () {
@ -195,6 +222,10 @@
}
};
ws.send(JSON.stringify(message));
if(isMac()){
app.$data.command = "./easyspider_executestage --id " + app.$data.ID.toString() + " --user_data " + (app.$data.with_user_data ? "1" : "0") + " --server_address " + app.$data.backEndAddressServiceWrapper;
$('#myModal').modal('show');
}
}
},
remoteExecute: function () {
@ -207,6 +238,7 @@
} else {
text = "确定要立即在本地运行此任务吗?";
}
this.with_user_data = with_user_data;
if (confirm(text)) {
var para = {};
@ -226,6 +258,10 @@
}
};
ws.send(JSON.stringify(message));
if(isMac()){
app.$data.command = "./easyspider_executestage --id " + result.toString() + " --user_data " + (app.$data.with_user_data ? "1" : "0") + " --server_address " + app.$data.backEndAddressServiceWrapper;
$('#myModal').modal('show');
}
});
}
},
@ -233,10 +269,12 @@
},
}
});
$.get(app.$data.backEndAddressServiceWrapper + "/queryTask?id=" + sId, function (result) {
app.$data.task = result;
app.$data.show = true;
});
ws = new WebSocket("ws://localhost:"+getUrlParam("wsport"));
ws.onopen = function () {
// Web Socket 已连接上,使用 send() 方法发送数据

BIN
ExecuteStage/.DS_Store Ver arquivo


+ 11
- 6
ExecuteStage/easyspider_executestage.py Ver arquivo

@ -693,7 +693,17 @@ if __name__ == '__main__':
option = webdriver.ChromeOptions()
if not os.path.exists(os.getcwd()+"/Data"):
os.mkdir(os.getcwd()+"/Data")
if os.path.exists(os.getcwd()+"/EasySpider/resources"): # 打包后的路径
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"
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":
@ -709,11 +719,6 @@ if __name__ == '__main__':
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"
elif sys.platform == "darwin" and platform.architecture()[0] == "64bit":
options.binary_location = "EasySpider/resources/app/chrome_mac64/chrome"
# MacOS需要用option而不是options!
option.binary_location = "EasySpider/resources/app/chrome_mac64/chrome"
driver_path = "EasySpider/resources/app/chrome_mac64/chromedriver_mac64"
else:
print("Unsupported platform")
sys.exit()

+ 4
- 2
ExecuteStage/generateExecutable_Macos.sh Ver arquivo

@ -1,5 +1,7 @@
rm -r build
rm -r dist
pyinstaller -F --icon=favicon.ico easyspider_executestage.py
rm ../ElectronJS/chrome_mac64/easyspider_executestage
mv dist/easyspider_executestage ../ElectronJS/chrome_linux64/easyspider_executestage
rm ../Releases/EasySpider_MacOS_all_arch/easyspider_executestage
rm ../ElectronJS/easyspider_executestage
mv dist/easyspider_executestage ../Releases/EasySpider_MacOS_all_arch/easyspider_executestage
# mv dist/easyspider_executestage ../ElectronJS/easyspider_executestage

+ 2
- 1
Releases/.gitignore Ver arquivo

@ -1,2 +1,3 @@
EasySpider
*.tmp
EasySpider.app/
*.tmp

+ 1
- 0
Releases/EasySpider_MacOS_all_arch/config.json Ver arquivo

@ -0,0 +1 @@
{"webserver_address":"http://localhost","webserver_port":8074,"user_data_folder":"./user_data","absolute_user_data_folder":"/Users/naibowang/Documents/EasySpider/Releases/EasySpider_MacOS_all_arch/user_data"}

BIN
ElectronJS/easyspider_executestage → Releases/EasySpider_MacOS_all_arch/easyspider_executestage Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/execution_instances/0.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/execution_instances/1.json Ver arquivo

@ -0,0 +1 @@
{"id":1,"name":"新web采集任务","url":"https://www.jd.com","links":"https://www.jd.com","containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"string","exampleValue":"https://www.jd.com"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","wait":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"url":"https://www.jd.com","links":"https://www.jd.com","scrollType":0,"scrollCount":0}}]}

+ 1
- 0
Releases/EasySpider_MacOS_all_arch/execution_instances/2.json Ver arquivo

@ -0,0 +1 @@
{"id":2,"name":"新web采集任务","url":"https://www.jd.com","links":"https://www.jd.com","containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"string","exampleValue":"https://www.jd.com"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","wait":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"url":"https://www.jd.com","links":"https://www.jd.com","scrollType":0,"scrollCount":0}}]}

+ 31
- 0
Releases/EasySpider_MacOS_all_arch/readme.txt Ver arquivo

@ -0,0 +1,31 @@
由于MacOS复杂的安全性设置,初次打开软件会显示未验证开发者从而不允许打开的问题,请参考以下github文档来查看MacOS版本如何打开软件和执行任务:https://github.com/NaiboWang/EasySpider/wiki/MacOS-Guide
文件访问权限必须给,麦克风权限完全用不到,作者也不清楚为什么会需要麦克风,因此可以拒绝。
可以从其他机器导入任务,只需要把其他机器的tasks文件夹里的.json文件放入此目录的tasks文件夹里即可。同理执行号文件可以通过复制execution_instances文件夹中的.json文件来导入。注意,两个文件夹里的.json文件只支持命名为大于0的数字。
MacOS版本的软件有一个问题可能存在,即软件所调用的Chrome软件会在打开后经常性自动更新,但软件所依赖的Chromedriver版本并不会随着chrome自动更新,从而导致软件打不开chrome的问题。注意此版本的EasySpider使用的Chrome为111.0版本,如果使用过程中发现Chrome无法打开,请到Github Issues页面提issue,作者将会更新最新版本的软件供大家使用。
检查Chrome版本的方式为:进入EasySpider软件内部,即右键软件“显示包内容”,然后进入Contents/Resources/app文件夹内,手动双击打开chrome_mac64软件打开chrome,然后打开设置->关于Chrome来查看chrome版本是否为111.0版本。
如果不是,除了提出issue外,也可以自行到以下网址下载对应自己当前chrome版本的macOS版本的chromedriver:https://chromedriver.chromium.org/downloads
并放在上面提到的Contents/Resources/app文件夹内,更名并替换掉“chromedriver_mac64”文件即可使软件恢复正常使用。
Due to the complex security settings of MacOS, the issue of being unable to open software due to the "unverified developer" message may occur upon the first attempt to open the software. Please refer to the following GitHub document to see how to open software and perform tasks on your MacOS version:
https://github.com/NaiboWang/EasySpider/wiki/MacOS-Guide
File access permissions must be granted, microphone permissions are not necessary at all, and the author is not sure why microphone permissions are being requested, so they can be declined.
Tasks can be imported from other machines by simply placing the .json files from the "tasks" folder of those machines into the "tasks" folder of this directory. Similarly, execution instance files can be imported by copying the .json files from the "execution_instances" folder. Note that only files named with a number greater than 0 are supported in both folders.
There is a potential issue with the software for MacOS, in that the Chrome software called by the software often updates automatically after opening, but the version of Chromedriver that the software relies on does not update automatically with Chrome, leading to the problem of being unable to open Chrome. Note that the EasySpider version used for Chrome is 111.0. If Chrome cannot be opened during use, please report the issue on the GitHub Issues page, and the author will update the latest version of the software for everyone to use.
To check the Chrome version, enter the EasySpider software and right-click to "Show Package Contents". Then go to Contents/Resources/app folder and double-click on the chrome_mac64 software to open Chrome. Then go to Settings -> About to check if the Chrome version is 111.0.
If it is not, besides reporting the issue, you can also download the corresponding macOS version of Chromedriver for your current Chrome version from the following website: https://chromedriver.chromium.org/downloads
Place the downloaded Chromedriver in the Contents/Resources/app folder mentioned above, rename it and replace the "chromedriver_mac64" file to restore normal use of the software.

+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/11.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/15.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/16.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/17.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/19.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/2.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/20.json Ver arquivo

@ -0,0 +1 @@
{"id": 20, "name": "Bilibili\u7c89\u4e1d", "url": "https://space.bilibili.com/291929894/fans/fans", "links": "https://space.bilibili.com/291929894/fans/fans", "containJudge": false, "desc": "https://space.bilibili.com/291929894/fans/fans", "inputParameters": [{"id": 0, "name": "urlList_0", "nodeId": 1, "nodeName": "Open Page", "value": "https://space.bilibili.com/291929894/fans/fans", "desc": "List of URLs to be collected, separated by \\n for multiple lines", "type": "string", "exampleValue": "https://space.bilibili.com/291929894/fans/fans"}, {"id": 1, "name": "loopTimes_Loop_1", "nodeId": 2, "nodeName": "Loop", "desc": "Number of loop executions, 0 means unlimited loops (until element not found)", "type": "int", "exampleValue": 0, "value": 0}], "outputParameters": [{"id": 0, "name": "\u53c2\u65701_\u6587\u672c", "desc": "", "type": "string", "exampleValue": "\u5bf9\u65b9\u7b54\u590d5"}], "graph": [{"index": 0, "id": 0, "parentId": 0, "type": -1, "option": 0, "title": "root", "sequence": [1, 2], "parameters": {"history": 1, "tabIndex": 0, "useLoop": false, "xpath": "", "wait": 0}, "isInLoop": false}, {"id": 1, "index": 1, "parentId": 0, "type": 0, "option": 1, "title": "Open Page", "sequence": [], "isInLoop": false, "position": 0, "parameters": {"useLoop": false, "xpath": "", "wait": 0, "url": "https://space.bilibili.com/291929894/fans/fans", "links": "https://space.bilibili.com/291929894/fans/fans", "scrollType": 0, "scrollCount": 0}}, {"id": 2, "index": 2, "parentId": 0, "type": 1, "option": 8, "title": "Loop", "sequence": [4], "isInLoop": false, "position": 1, "parameters": {"history": 4, "tabIndex": -1, "useLoop": false, "xpath": "//a[contains(text(),\"\u4e0b\u4e00\u9875\")]", "wait": 0, "scrollType": 0, "scrollCount": 0, "loopType": 0, "pathList": "", "textList": "", "exitCount": 0, "historyWait": 2}}, {"id": -1, "index": 3, "parentId": 2, "type": 0, "option": 2, "title": "Click Element", "sequence": [], "isInLoop": true, "position": 1, "parameters": {"history": 4, "tabIndex": -1, "useLoop": true, "xpath": "//*[@id=\"page-follows\"]/div[1]/div[2]/div[2]/div[2]/ul[2]/li[7]", "wait": 1, "scrollType": 0, "scrollCount": 0, "paras": [], "loopType": 0}}, {"id": 3, "index": 4, "parentId": 2, "type": 1, "option": 8, "title": "Loop", "sequence": [5], "isInLoop": true, "position": 0, "parameters": {"history": 4, "tabIndex": -1, "useLoop": false, "xpath": "/html/body/div[2]/div[4]/div[1]/div[1]/div[1]/div[2]/div[2]/div[2]/ul[1]/li/div[2]/a[1]/span[1]", "wait": 0, "scrollType": 0, "scrollCount": 0, "loopType": 1, "pathList": "", "textList": "", "exitCount": 0, "historyWait": 2}}, {"id": 4, "index": 5, "parentId": 3, "type": 0, "option": 3, "title": "Extract Data", "sequence": [], "isInLoop": true, "position": 0, "parameters": {"history": 4, "tabIndex": -1, "useLoop": false, "xpath": "", "wait": 0, "paras": [{"nodeType": 0, "contentType": 0, "relative": true, "name": "\u53c2\u65701_\u6587\u672c", "desc": "", "relativeXpath": "", "exampleValues": [{"num": 0, "value": "\u5bf9\u65b9\u7b54\u590d5"}], "default": ""}], "loopType": 1}}]}

+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/23.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/25.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/27.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/28.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/29.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/30.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/31.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/32.json Ver arquivo

@ -0,0 +1 @@
{"id":32,"name":"知乎_登录后采集","url":"https://www.zhihu.com","links":"https://www.zhihu.com","containJudge":false,"desc":"https://www.zhihu.com\n使用带用户配置的浏览器模式来先手工登录后保存信息,再接着执行。","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.zhihu.com","desc":"要采集的网址列表,多行以\\n分开","type":"string","exampleValue":"https://www.zhihu.com"}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"string","exampleValue":"历史上有哪些通过“正当手段”干出不正当事的人物?"}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","wait":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"url":"https://www.zhihu.com","links":"https://www.zhihu.com","scrollType":0,"scrollCount":0}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环","sequence":[3],"isInLoop":false,"position":1,"parameters":{"history":5,"tabIndex":-1,"useLoop":false,"xpath":"","wait":0,"scrollType":0,"scrollCount":0,"loopType":2,"pathList":"//*[contains(@class, \"css-0\")]/div[2]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[3]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[4]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[5]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[6]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[7]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[8]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[9]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[10]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[11]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[12]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[13]/div[1]/div[1]/div[1]/h2[1]/div[1]","textList":"","exitCount":0,"historyWait":2}},{"id":3,"index":3,"parentId":2,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":5,"tabIndex":-1,"useLoop":false,"xpath":"","wait":0,"paras":[{"nodeType":0,"contentType":0,"relative":true,"name":"参数1_文本","desc":"","relativeXpath":"","exampleValues":[{"num":0,"value":"历史上有哪些通过“正当手段”干出不正当事的人物?"},{"num":1,"value":"新加坡有哪些不好的地方?"},{"num":2,"value":"孙悟空可以秒杀山村老尸那样的厉鬼吗?"},{"num":3,"value":"为什么渐渐厌倦玩《原神》了?"},{"num":4,"value":"历史上有哪些著名的考古乌龙事件?"},{"num":5,"value":"苹果公司为什么能把用户调教得这么好?"},{"num":6,"value":"哪个瞬间让你发现了世界的bug?"},{"num":7,"value":"假如中国的院士,想为亲属谋体制内的工作,难度大吗?为什么?"},{"num":8,"value":"你一直珍藏的视频是哪个?"},{"num":9,"value":"如何评价《原神》角色艾莉丝?"},{"num":10,"value":"索罗斯如何做空的英镑、泰铢?为什么做空香港失败了?"},{"num":11,"value":"如何在婚前认清并杜绝王力宏这种男人?"}],"default":""}],"loopType":2}}]}

+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/33.json Ver arquivo

@ -0,0 +1 @@
{"id":33,"name":"JD","url":"https://www.jd.com","links":"https://www.jd.com","containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"string","exampleValue":"https://www.jd.com"},{"id":1,"name":"inputText_1","nodeName":"输入文字","nodeId":2,"desc":"要输入的文本,如京东搜索框输入:电脑","type":"string","exampleValue":"123","value":"123"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2,3],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","wait":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"url":"https://www.jd.com","links":"https://www.jd.com","scrollType":0,"scrollCount":0}},{"id":2,"index":2,"parentId":0,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"key\"]","wait":0,"value":"123"}},{"id":3,"index":3,"parentId":0,"type":0,"option":2,"title":"点击元素","sequence":[],"isInLoop":false,"position":2,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"search-btn\"]/i[1]","wait":0,"scrollType":0,"scrollCount":0,"paras":[]}}]}

+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/34.json Ver arquivo

@ -0,0 +1 @@
{"id":34,"name":"新web采集任务","url":"https://www.jd.com","links":"https://www.jd.com","containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"string","exampleValue":"https://www.jd.com"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","wait":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"url":"https://www.jd.com","links":"https://www.jd.com","scrollType":0,"scrollCount":0}}]}

+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/35.json Ver arquivo

@ -0,0 +1 @@
{"id":35,"name":"新web采集任务","url":"https://www.jd.com","links":"https://www.jd.com","containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"string","exampleValue":"https://www.jd.com"},{"id":1,"name":"inputText_1","nodeName":"输入文字","nodeId":2,"desc":"要输入的文本,如京东搜索框输入:电脑","type":"string","exampleValue":"赛啃老","value":"赛啃老"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","wait":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"url":"https://www.jd.com","links":"https://www.jd.com","scrollType":0,"scrollCount":0}},{"id":2,"index":2,"parentId":0,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"key\"]","wait":0,"value":"赛啃老"}}]}

+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/36.json Ver arquivo

@ -0,0 +1 @@
{"id":36,"name":"新web采集任务","url":"https://www.jd.com","links":"https://www.jd.com","containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"string","exampleValue":"https://www.jd.com"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","wait":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"url":"https://www.jd.com","links":"https://www.jd.com","scrollType":0,"scrollCount":0}}]}

+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/4.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/5.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/6.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 1
- 0
Releases/EasySpider_MacOS_all_arch/tasks/7.json
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


Carregando…
Cancelar
Salvar