ソースを参照

Option Select by Loop

pull/129/head
naibo 1年前
コミット
f847ac6efd
14個のファイルの変更594行の追加36行の削除
  1. +1
    -0
      ElectronJS/clean_and_release_win32.cmd
  2. +1
    -0
      ElectronJS/clean_and_release_win64.cmd
  3. +1
    -0
      ElectronJS/package_linux64.sh
  4. +1
    -0
      ElectronJS/package_macos.sh
  5. +23
    -11
      ElectronJS/src/taskGrid/FlowChart.html
  6. +25
    -13
      ElectronJS/src/taskGrid/FlowChart_CN.html
  7. +19
    -1
      ElectronJS/src/taskGrid/logic.js
  8. +343
    -1
      ElectronJS/tasks/177.json
  9. +1
    -0
      ElectronJS/tasks/178.json
  10. +159
    -0
      ElectronJS/tasks/179.json
  11. +1
    -0
      ElectronJS/tasks/180.json
  12. +1
    -1
      ExecuteStage/.vscode/launch.json
  13. +17
    -6
      ExecuteStage/easyspider_executestage.py
  14. +1
    -3
      ExecuteStage/utils.py

+ 1
- 0
ElectronJS/clean_and_release_win32.cmd ファイルの表示

@ -16,6 +16,7 @@ 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
xcopy ..\ExecuteStage\.vscode ..\.temp_to_pub\EasySpider_windows_x32\Code\.vscode /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

+ 1
- 0
ElectronJS/clean_and_release_win64.cmd ファイルの表示

@ -16,6 +16,7 @@ copy ..\ExecuteStage\myChrome.py ..\.temp_to_pub\EasySpider_windows_x64\Code
copy ..\ExecuteStage\utils.py ..\.temp_to_pub\EasySpider_windows_x64\Code
copy ..\ExecuteStage\requirements.txt ..\.temp_to_pub\EasySpider_windows_x64\Code
xcopy ..\ExecuteStage\undetected_chromedriver_ES ..\.temp_to_pub\EasySpider_windows_x64\Code\undetected_chromedriver_ES /E /I /Y
xcopy ..\ExecuteStage\.vscode ..\.temp_to_pub\EasySpider_windows_x64\Code\.vscode /E /I /Y
rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x64\user_data
rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x64\execution_instances
mkdir ..\.temp_to_pub\EasySpider_windows_x64\execution_instances

+ 1
- 0
ElectronJS/package_linux64.sh ファイルの表示

@ -24,6 +24,7 @@ cp ../ExecuteStage/myChrome.py ../.temp_to_pub/EasySpider_Linux_x64/Code
cp ../ExecuteStage/utils.py ../.temp_to_pub/EasySpider_Linux_x64/Code
cp ../ExecuteStage/requirements.txt ../.temp_to_pub/EasySpider_Linux_x64/Code
cp -Rf ../ExecuteStage/undetected_chromedriver_ES ../.temp_to_pub/EasySpider_Linux_x64/Code
cp -Rf ../ExecuteStage/.vscode ../.temp_to_pub/EasySpider_Linux_x64/Code
chmod 777 ../.temp_to_pub/EasySpider_Linux_x64/easy-spider.sh
rm -rf ../.temp_to_pub/EasySpider_Linux_x64/user_data

+ 1
- 0
ElectronJS/package_macos.sh ファイルの表示

@ -24,3 +24,4 @@ cp ../ExecuteStage/myChrome.py ../.temp_to_pub/EasySpider_MacOS_all_arch/Code
cp ../ExecuteStage/utils.py ../.temp_to_pub/EasySpider_MacOS_all_arch/Code
cp ../ExecuteStage/requirements.txt ../.temp_to_pub/EasySpider_MacOS_all_arch/Code
cp -Rf ../ExecuteStage/undetected_chromedriver_ES ../.temp_to_pub/EasySpider_MacOS_all_arch/Code
cp -Rf ../ExecuteStage/.vscode ../.temp_to_pub/EasySpider_MacOS_all_arch/Code

+ 23
- 11
ElectronJS/src/taskGrid/FlowChart.html ファイルの表示

@ -21,6 +21,9 @@
<div id="tipError" class="alert alert-danger alert-dismissible fade show" style="position: fixed; width:100%;display: none;">
<button type="button" class="close" data-dismiss="alert">&times;</button> <span id="error_message">提示:保存名不符合MySQL表名规范,请重试!</span>
</div>
<div id="tipInfo" class="alert alert-info alert-dismissible fade show" style="position: fixed; width:100%;display: none;">
<button type="button" class="close" data-dismiss="alert">&times;</button> <span id="info_message">提示:您加载的任务版本不是最新版,可能出现兼容性问题。</span>
</div>
<div id="navigator">
<nav aria-label="breadcrumb" v-if="type==1">
<ol class="breadcrumb" style="padding-left:23px;padding-bottom: 0;margin-bottom:0;background-color: white">
@ -100,7 +103,8 @@
<div v-if='!useLoop'>
<!-- <label>url:</label>-->
<!-- <input onkeydown="inputDelete(event)" class="form-control" v-model='nowNode["parameters"]["url"]'></input>-->
<label>Links (one link per line, the entire workflow will be executed as many times as there are lines of links):</label>
<label v-if='nowNode["parameters"]["url"]!="about:blank"'>Links (one link per line, the entire workflow will be executed as many times as there are lines of links):</label>
<label v-else>Link (Only one link can be put here)</label>
<textarea onkeydown="inputDelete(event)" class="form-control" rows="2" v-model='nowNode["parameters"]["links"]'></textarea>
</div>
<label>Maximum wait time for page load (in seconds): </label>
@ -415,20 +419,28 @@ Please note that this feature does not support assigning values to variables. In
<div class="elements" v-if="nodeType==6">
<p><input onkeydown="inputDelete(event)" type="checkbox" v-model='nowNode["parameters"]["iframe"]'></input>Element is inside iframe</p>
<div v-if="nowNode['isInLoop']">
<!-- Display this element only if inside a loop and the loop contains fixed text -->
<p><input onkeydown="inputDelete(event)" type="checkbox" v-model='useLoop'></input>Use index value from within the loop (if unchecked, the setting will be the value of the "Set Value" text box below. If checked, it will use the index value set within the loop's dropdown box.)</p>
<p v-if="useLoop">
<label>Relative index value of the loop value (0 represents using the entire current loop's text. If greater than 0, it represents the value of the text separated by "~" within the current loop. For example, if the current loop's text value is 2~3 and you enter 2 here, it means taking the second item of the text, which is value 3, indicating setting the dropdown box to the third item.)</label>
<input onkeydown="inputDelete(event)" class="form-control" type="number" v-model.number='nowNode["parameters"]["index"]'></input>
</p>
</div>
<label>XPath: </label>
<textarea onkeydown="inputDelete(event)" class="form-control" rows="2" v-model='nowNode["parameters"]["xpath"]'></textarea>
<p><button type="button" data-toggle="modal" data-target="#myModal_XPath" @click="changeXPaths(nowNode['parameters']['allXPaths'])" class="btn btn-primary" style="margin-top: 10px">Click here to view other equivalent XPath expressions</button></p>
<div v-if="!useLoop">
<p>Option switch Mode</p>
<select class="form-control" v-model='nowNode["parameters"]["optionMode"]'>
<option value=0>Switch to the next option</option>
<option value=1>Switch options by index value</option>
<option value=2>Switch options by option value</option>
<option value=3>Switch options by option text</option>
</select>
<p>Set value (not applicable for "Switch to the next option" mode)</p>
<input class="form-control" id="selectValue" v-model='nowNode["parameters"]["optionValue"]' autoFocus="autofocus" type="text"></input>
<select class="form-control" v-model='nowNode["parameters"]["optionMode"]'>
<option value=0>Switch to the next option</option>
<option value=1>Switch options by index (0 is the first option)</option>
<option value=2>Switch options by option value</option>
<option value=3>Switch options by option text</option>
</select>
<p>Set value (not applicable for "Switch to the next option" mode)</p>
<input class="form-control" id="selectValue" v-model='nowNode["parameters"]["optionValue"]' autoFocus="autofocus" type="text"></input>
</div>
</div>
<div class="elements" v-if="nodeType==7">

+ 25
- 13
ElectronJS/src/taskGrid/FlowChart_CN.html ファイルの表示

@ -21,6 +21,9 @@
<div id="tipError" class="alert alert-danger alert-dismissible fade show" style="position: fixed; width:100%;display: none;">
<button type="button" class="close" data-dismiss="alert">&times;</button> <span id="error_message">提示:保存名不符合MySQL表名规范,请重试!</span>
</div>
<div id="tipInfo" class="alert alert-info alert-dismissible fade show" style="position: fixed; width:100%;display: none;">
<button type="button" class="close" data-dismiss="alert">&times;</button> <span id="info_message">提示:您加载的任务版本不是最新版,可能出现兼容性问题。</span>
</div>
<div id="navigator">
<nav aria-label="breadcrumb" v-if="type==1">
<ol class="breadcrumb" style="padding-left:23px;padding-bottom: 0;margin-bottom:0;background-color: white">
@ -100,7 +103,8 @@
<div v-if='!useLoop'>
<!-- <label>url:</label>-->
<!-- <input onkeydown="inputDelete(event)" class="form-control" v-model='nowNode["parameters"]["url"]'></input>-->
<label>链接池(每行一个链接,有多少行链接整个任务流程就会被执行多少次):</label>
<label v-if='nowNode["parameters"]["url"]!="about:blank"'>链接池(每行一个链接,有多少行链接整个任务流程就会被执行多少次):</label>
<label v-else>链接(这里只能填写一个链接,因为是手动添加的打开网页操作)</label>
<textarea onkeydown="inputDelete(event)" class="form-control" rows="2" v-model='nowNode["parameters"]["links"]'></textarea>
</div>
<label>页面加载最长等待时间(秒):</label>
@ -313,7 +317,7 @@
<p><input onkeydown="inputDelete(event)" type="checkbox" v-model='nowNode["parameters"]["iframe"]'></input>元素在iframe内</p>
<div v-if="nowNode['isInLoop']">
<!-- 如果在循环内且循环内是固定文本才显示此行元素 -->
<p><input onkeydown="inputDelete(event)" type="checkbox" v-model='useLoop'></input>使用循环内的文本(不勾选则每次输入的文本为下方“输入值”文本框内的文本,勾选后会使用所在循环内设置的文本)</p>
<p><input onkeydown="inputDelete(event)" type="checkbox" v-model='useLoop'></input>使用循环内的文本(不勾选则每次输入的文本为下方“输入值”文本框内的文本,勾选后会使用所在“文本列表”循环内设置的文本)</p>
<p v-if="useLoop">
<label>索引值(0表示使用整个当前循环的文本,如果大于0则表示当前文本用~来分割开的文本索引取值,即如果当前循环的文本值为A~B,则索引值为1表示输入A,2表示输入B,0表示输入A~B)</label>
<input onkeydown="inputDelete(event)" class="form-control" type="number" v-model.number='nowNode["parameters"]["index"]'></input></p>
@ -415,20 +419,28 @@
<div class="elements" v-if="nodeType==6">
<p><input onkeydown="inputDelete(event)" type="checkbox" v-model='nowNode["parameters"]["iframe"]'></input>元素在iframe内</p>
<div v-if="nowNode['isInLoop']">
<!-- 如果在循环内且循环内是固定文本才显示此行元素 -->
<p><input onkeydown="inputDelete(event)" type="checkbox" v-model='useLoop'></input>使用循环内的索引值(不勾选则输入为下方“设定值”文本框内的内容,勾选后会使用所在“文本列表”循环内设置的下拉框索引值)</p>
<p v-if="useLoop">
<label>相对循环内文本索引值(0表示使用整个当前循环的文本当做索引值,如果大于0则表示当前循环的文本用~来分割开的文本索引取值,即如果当前循环的文本值为2~3,这里填写2,则表示取文本第二项,即取值3,表示设置下拉框为第3项)</label>
<input onkeydown="inputDelete(event)" class="form-control" type="number" v-model.number='nowNode["parameters"]["index"]'></input></p>
</p>
</div>
<label>XPath: </label>
<textarea onkeydown="inputDelete(event)" class="form-control" rows="2" v-model='nowNode["parameters"]["xpath"]'></textarea>
<p><button type="button" data-toggle="modal" data-target="#myModal_XPath" @click="changeXPaths(nowNode['parameters']['allXPaths'])" class="btn btn-primary" style="margin-top: 10px">点此查看其他等价的XPath</button></p>
<p>切换模式</p>
<select class="form-control" v-model='nowNode["parameters"]["optionMode"]'>
<option value=0>切换到下一个选项</option>
<option value=1>按索引值切换选项</option>
<option value=2>按选项值切换选项</option>
<option value=3>按选项文本切换选项</option>
</select>
<p>设定值(不适用于切换到下一个选项模式)</p>
<input class="form-control" id="selectValue" v-model='nowNode["parameters"]["optionValue"]' autoFocus="autofocus" type="text"></input>
<div v-if="!useLoop">
<p>切换模式</p>
<select class="form-control" v-model='nowNode["parameters"]["optionMode"]'>
<option value=0>切换到下一个选项</option>
<option value=1>按索引值切换选项(第一个选项索引值为0)</option>
<option value=2>按选项值切换选项</option>
<option value=3>按选项文本切换选项</option>
</select>
<p>设定值(不适用于切换到下一个选项模式)</p>
<input class="form-control" id="selectValue" v-model='nowNode["parameters"]["optionValue"]' autoFocus="autofocus" type="text"></input>
</div>
</div>
<div class="elements" v-if="nodeType==7">

+ 19
- 1
ElectronJS/src/taskGrid/logic.js ファイルの表示

@ -184,6 +184,10 @@ function addParameters(t) {
t["parameters"]["waitTime"] = 0; //最长等待时间
t["parameters"]["recordASField"] = 0; //是否记录脚本输出
t["parameters"]["paraType"] = "text"; //记录脚本输出的字段索引
} else if (t.option == 6) { //切换下拉选项
t["parameters"]["optionMode"] = 0; //下拉模式
t["parameters"]["optionValue"] = ""; //下拉值
t["parameters"]["index"] = 0; //输入框索引
} else if (t.option == 8) { //循环
t["parameters"]["scrollType"] = 0; //滚动类型,0不滚动,1向下滚动1屏,2滚动到底部
t["parameters"]["scrollCount"] = 1; //滚动次数
@ -281,6 +285,14 @@ function showError(msg, time=4000) {
}, time);
}
function showInfo(msg, time=4000) {
$("#info_message").text(msg);
$("#tipInfo").slideDown(); //提示框
let fadeout = setTimeout(function() {
$("#tipInfo").slideUp();
}, time);
}
//点击确定按钮时的处理
$("#confirm").mousedown(updateUI);
@ -300,6 +312,9 @@ if (mobile == "true") {
$("#environment").val(1);
}
let serviceInfo = {
"version": "0.3.6"
};
function saveService(type) {
let serviceId = $("#serviceId").val();
@ -425,7 +440,7 @@ function saveService(type) {
}
}
}
let serviceInfo = {
serviceInfo = {
"id": parseInt(serviceId),
"name": serviceName,
"url": url,
@ -488,6 +503,9 @@ if (sId != null && sId != -1) //加载任务
console.log(e);
}
}
if(result["version"]!= serviceInfo["version"]){
showInfo(LANG("提示:该任务为" + result["version"] + "版本任务,当前版本为" + serviceInfo["version"] + ",可能存在兼容性问题,请按照当前版本指南设计任务流程以避免任务执行不正常。","This task is designed by EasySpider " + result["version"] + ", current version of EasySpider is " + serviceInfo["version"] + ", there may be compatibility issues, please design the task flow according to the current version guide to avoid abnormal task execution."));
}
refresh();
});
} else {

+ 343
- 1
ElectronJS/tasks/177.json
ファイル差分が大きすぎるため省略します
ファイルの表示


+ 1
- 0
ElectronJS/tasks/178.json ファイルの表示

@ -0,0 +1 @@
{"id":178,"name":"京东全球版-专业的综合网上购物商城","url":"https://www.jd.com","links":"https://www.jd.com","create_time":"7/15/2023, 4:06:24 AM","update_time":"7/15/2023, 4:06:24 AM","version":"0.3.6","saveThreshold":10,"cloudflare":0,"environment":0,"maxViewLength":15,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.jd.com"},{"id":1,"name":"loopTimes_循环_1","nodeId":2,"nodeName":"循环","desc":"循环循环执行的次数(0代表无限循环)","type":"int","exampleValue":0,"value":0}],"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,"waitType":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,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"url":"https://www.jd.com","links":"https://www.jd.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环","sequence":[3],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":0,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0}},{"id":3,"index":3,"parentId":2,"type":0,"option":6,"title":"切换下拉选项","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":1,"tabIndex":0,"useLoop":true,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"optionMode":0,"optionValue":"","index":2}}]}

+ 159
- 0
ElectronJS/tasks/179.json ファイルの表示

@ -0,0 +1,159 @@
{
"id": 179,
"name": "京东全球版-专业的综合网上购物商城",
"url": "https://www.jd.com",
"links": "https://www.jd.com",
"create_time": "7/15/2023, 4:08:45 AM",
"update_time": "7/15/2023, 4:08:45 AM",
"version": "0.3.6",
"saveThreshold": 10,
"cloudflare": 0,
"environment": 0,
"maxViewLength": 15,
"outputFormat": "xlsx",
"saveName": "current_time",
"inputExcel": "",
"startFromExit": 0,
"containJudge": false,
"desc": "https://www.jd.com",
"inputParameters": [
{
"id": 0,
"name": "urlList_0",
"nodeId": 1,
"nodeName": "打开网页",
"value": "https://www.jd.com",
"desc": "要采集的网址列表,多行以\\n分开",
"type": "text",
"exampleValue": "https://www.jd.com"
},
{
"id": 1,
"name": "loopTimes_循环_1",
"nodeId": 2,
"nodeName": "循环",
"desc": "循环循环执行的次数(0代表无限循环)",
"type": "int",
"exampleValue": 0,
"value": 0
}
],
"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,
"waitType": 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,
"waitType": 0,
"beforeJS": "",
"beforeJSWaitTime": 0,
"afterJS": "",
"afterJSWaitTime": 0,
"url": "https://www.jd.com",
"links": "https://www.jd.com",
"maxWaitTime": 10,
"scrollType": 0,
"scrollCount": 1,
"scrollWaitTime": 1,
"cookies": ""
}
},
{
"id": 2,
"index": 2,
"parentId": 0,
"type": 1,
"option": 8,
"title": "循环",
"sequence": [
3
],
"isInLoop": false,
"position": 1,
"parameters": {
"history": 1,
"tabIndex": 0,
"useLoop": false,
"xpath": "",
"iframe": false,
"wait": 0,
"waitType": 0,
"beforeJS": "",
"beforeJSWaitTime": 0,
"afterJS": "",
"afterJSWaitTime": 0,
"scrollType": 0,
"scrollCount": 1,
"scrollWaitTime": 1,
"loopType": 0,
"pathList": "",
"textList": "",
"code": "",
"waitTime": 0,
"exitCount": 0,
"historyWait": 2,
"breakMode": 0,
"breakCode": "",
"breakCodeWaitTime": 0
}
},
{
"id": 3,
"index": 3,
"parentId": 2,
"type": 0,
"option": 6,
"title": "切换下拉选项",
"sequence": [],
"isInLoop": true,
"position": 0,
"parameters": {
"history": 1,
"tabIndex": 0,
"useLoop": true,
"xpath": "",
"iframe": false,
"wait": 0,
"waitType": 0,
"beforeJS": "",
"beforeJSWaitTime": 0,
"afterJS": "",
"afterJSWaitTime": 0,
"optionMode": 0,
"optionValue": "",
"index": 2
}
}
]
}

+ 1
- 0
ElectronJS/tasks/180.json ファイルの表示

@ -0,0 +1 @@
{"id":180,"name":"Switch Select - APK Downloader - Download APK & OBB (Latest Version)","url":"https://apkcombo.com/downloader/","links":"https://apkcombo.com/downloader/","create_time":"","update_time":"7/15/2023, 5:23:55 AM","version":"0.3.6","saveThreshold":10,"cloudflare":0,"environment":0,"maxViewLength":15,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"containJudge":false,"desc":"https://apkcombo.com/downloader/","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://apkcombo.com/downloader/","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://apkcombo.com/downloader/"},{"id":1,"name":"loopText_1","nodeId":2,"nodeName":"循环","desc":"要输入的文本/网址,多行以\\n分开","type":"text","exampleValue":"1~3~3","value":"1~3~3"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,4,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","wait":0,"waitType":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,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"url":"https://apkcombo.com/downloader/","links":"https://apkcombo.com/downloader/","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":3,"index":2,"parentId":0,"type":1,"option":8,"title":"循环","sequence":[3],"isInLoop":false,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":"3","pathList":"","textList":"1~3~3","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0}},{"id":4,"index":3,"parentId":3,"type":0,"option":6,"title":"切换下拉选项","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"//*[@id=\"device\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"optionMode":0,"optionValue":"Phone","index":2,"allXPaths":["/html/body/section[1]/div[1]/div[1]/main[1]/form[1]/fieldset[1]/div[1]/div[1]/div[1]/select[1]","//select[contains(., 'Default\nP')]","id(\"device\")","//SELECT[@name='device']","/html/body/section/div[last()-1]/div/main/form/fieldset/div[last()-1]/div[last()-2]/div/select"]}},{"id":2,"index":4,"parentId":0,"type":0,"option":6,"title":"切换下拉选项","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"//*[@id=\"device\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"optionMode":0,"optionValue":"","index":0}}]}

+ 1
- 1
ExecuteStage/.vscode/launch.json ファイルの表示

@ -12,7 +12,7 @@
"justMyCode": false,
// "args": ["--id", "[7]", "--read_type", "remote", "--headless", "0"]
// "args": ["--id", "[9]", "--read_type", "remote", "--headless", "0", "--saved_file_name", "YOUTUBE"]
"args": ["--id", "[76]", "--headless", "0", "--user_data", "1"]
"args": ["--id", "[79]", "--headless", "0", "--user_data", "1"]
}
]
}

+ 17
- 6
ExecuteStage/easyspider_executestage.py ファイルの表示

@ -45,7 +45,7 @@ from threading import Thread, Event
from myChrome import MyChrome
if sys.platform != "darwin":
from myChrome import MyUCChrome
from utils import download_image, get_output_code, isnull, lowercase_tags_in_xpath, myMySQL, new_line, on_press_creator, on_release_creator, replace_field_values, write_to_csv, write_to_excel
from utils import download_image, get_output_code, isnotnull, lowercase_tags_in_xpath, myMySQL, new_line, on_press_creator, on_release_creator, replace_field_values, write_to_csv, write_to_excel
desired_capabilities = DesiredCapabilities.CHROME
desired_capabilities["pageLoadStrategy"] = "none"
@ -136,7 +136,7 @@ class BrowserThread(Thread):
except:
self.save_threshold = 10
self.links = list(
filter(isnull, service["links"].split("\n"))) # 要执行的link的列表
filter(isnotnull, service["links"].split("\n"))) # 要执行的link的列表
self.OUTPUT = [] # 采集的数据
self.writeMode = 1 # 写入模式,0为新建,1为追加
if self.outputFormat == "csv" or self.outputFormat == "txt":
@ -554,8 +554,19 @@ class BrowserThread(Thread):
self.OUTPUT.append(line)
def switchSelect(self, para, loopValue):
optionMode = int(para["optionMode"])
optionMode = para["optionMode"]
optionValue = para["optionValue"]
if para["useLoop"]:
index = para["index"]
if index != 0:
try:
optionValue = loopValue.split("~")[index - 1]
except:
print("取值失败,可能是因为取值索引超出范围,将使用整个文本值")
print("Failed to get value, maybe because the index is out of range, will use the entire text value")
else:
optionValue = loopValue
optionMode = 1
try:
xpath = replace_field_values(para["xpath"], self.outputParameters)
dropdown = Select(self.browser.find_element(
@ -985,7 +996,7 @@ class BrowserThread(Thread):
elif int(node["parameters"]["loopType"]) == 4: # 固定网址列表
# tempList = node["parameters"]["textList"].split("\r\n")
urlList = list(
filter(isnull, node["parameters"]["textList"].split("\n"))) # 去空行
filter(isnotnull, node["parameters"]["textList"].split("\n"))) # 去空行
# urlList = []
# for url in tempList:
# if url != "":
@ -1053,8 +1064,8 @@ class BrowserThread(Thread):
# clear output parameters
for key in self.outputParameters:
self.outputParameters[key] = ""
else:
url = list(filter(isnull, para["links"].split("\n")))[0]
else: # 在流程图其他位置设置了打开网页的操作,读取的应该是第一个网址,如打开网页后登录,再打开第二个网页
url = list(filter(isnotnull, para["links"].split("\n")))[0]
# 将value中的Field[""]替换为outputParameters中的键值
url = replace_field_values(url, self.outputParameters)
try:

+ 1
- 3
ExecuteStage/utils.py ファイルの表示

@ -139,9 +139,7 @@ def get_output_code(output):
return code
# 判断字段是否为空
def isnull(s):
def isnotnull(s):
return len(s) != 0
def new_line(outputParameters, maxViewLength, record):

読み込み中…
キャンセル
保存