提示：保存成功！
提示：您加载的任务版本不是最新版，可能出现兼容性问题。
提示：保存名不符合MySQL表名规范，请重试！
工具箱
----------
提示：拖动上方按钮到流程图箭头处以添加操作，也可以点击按钮再点击箭头。

■

#### 等价XPath

以下提供除默认生成的XPath外其余等价的XPath，都能定位到同一个元素（但不完全准确，可能可以定位到除该元素外的其他元素，因此只是提供在这里作为参考）。 每行一个XPath（可使用预装的XPath Helper扩展调试）： {{XPaths}}
提示：鼠标移到笑脸可查看提示，在流程图中双击操作可试运行（页面完全加载完毕后），右键点击操作查看更多选项。 选项名称：

使用循环内的链接

链接池（每行一个链接，有多少行链接整个任务流程就会被执行多少次）： 链接（只能填写一个链接，因为是手动添加的打开网页操作）：
页面加载最长等待时间（秒）： 打开网页后是否向下滚动：
滚动次数（滚动类型设置为不滚动或一直滚动时请忽略此项）： 滚动后等待时间（秒）：

点此展开/折叠自定义操作

加载后设置Cookies：

点击获取当前页面Cookie

元素在iframe内

使用相对循环内的XPath定位到的元素

XPath（或者用point(10,10)表示点击网页坐标位置(10, 10)以用来点击空白区域推出弹窗对话框文本列表等）： ☺

任务运行时最终定位的本元素XPath：

点此展开/折叠自定义操作

点击该元素前针对该元素执行一段JavaScript脚本： 最长等待脚本执行时间（0代表无限等待）： 点击该元素后针对该元素执行一段JavaScript脚本： 最长等待脚本执行时间（0代表无限等待）：
点击后页面加载最长等待时间（秒）： 点击类型（如是否双击）：
在新标签页打开超链接：
点击后是否向下滚动页面：
滚动次数（滚动类型设置为不滚动或一直滚动时请忽略此项）： 滚动后等待时间（秒）： 文件下载最长等待时间（秒）： 点击元素后如有弹窗出现，弹窗处理方式：

提取数据前清空其他操作字段已记录的值

此提取数据操作后生成新数据行 ☺

字段名 | 示例值 | 操作

| {{params.parameters[i-1]["exampleValues"][0]["value"]}} | 修改 删除 上移 下移

当前编辑字段参数名（点击字段的“修改”选项切换参数）：

{{params.parameters[paraIndex]["name"]}}

使用相对循环内的XPATH

元素在iframe内

XPath（所有XPath内均可用Field["字段名"]表示参数值，用eval("你的代码")来替换成自定义的变量）： ☺

任务运行时最终定位的本字段XPath： {{getFinalXPath(params.parameters[paraIndex]['relativeXPath'], params.parameters[paraIndex]['relative'])}}
试运行（只测试第一个匹配到的元素）

点此展开/折叠自定义操作

提取该元素数据前针对该元素执行一段JavaScript脚本： 最长等待脚本执行时间（0代表无限等待）： 提取该元素数据后针对该元素执行一段JavaScript脚本： 最长等待脚本执行时间（0代表无限等待）：
采集内容类型
常量字符串：
属性名称：
JavaScript（也可以不针对该元素，直接写return JS代码即可）/系统命令/Python代码： 最长等待脚本执行时间（0代表无限等待）：
节点类型
提取图片地址后是否同时下载图片：
参数类型转换为（用于Excel和数据库）：
元素找不到时的值： 是否将内容换行（长文章采集想要换行时设置）：
是否保存该字段（只想把此字段当变量而不想保存时可选否）：
参数描述：

元素在iframe内

使用循环内的文本（不勾选则每次输入的文本为下方“输入值”文本框内的文本，勾选后会使用所在“文本列表”循环内设置的文本）

索引值（0表示使用整个当前循环的文本，如果大于0则表示当前文本用~来分割开的文本索引取值，即如果当前循环的文本值为A~B，则索引值为1表示输入A，2表示输入B，0表示输入A~B）

输入值（用Field["字段名"]来输入某字段/自定义操作的最新提取/返回值，用<enter>或<ENTER>表示模拟按下回车键），用JS("return JS代码")和eval("Python代码")来替换成JavaScript和Python代码返回值：
XPath： ☺

点此展开/折叠自定义操作

对该元素输入文字前针对该元素执行一段JavaScript脚本： 最长等待脚本执行时间（0代表无限等待）： 对该元素输入文字后针对该元素执行一段JavaScript脚本： 最长等待脚本执行时间（0代表无限等待）：

操作在iframe内

执行模式
代码/脚本内容（用Field["字段名"]来输入某字段/自定义操作的最新提取/返回值）：

    请先阅读此说明，再在上方输入框（不是本框）写具体代码，如果要执行大量代码，可以直接写outside:myCode.py，这样程序就会读取并执行EasySpider目录下的myCode.py中的代码。
    注意包含exec和eval操作的语句和XPath不能在当前页面试运行，只能在任务真正调用时运行。
    此选项为高级功能，可以直接用Python代码操纵正在运行中的浏览器，及可以自定义整个执行环境中的变量，并对变量进行修改赋值等操作，示例：
    1. 用self.browser表示当前操作的浏览器，可直接用selenium的API进行操作，如self.browser.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END)即可滚动到页面最下方。
    2. 自定义一个全局变量：self.myVar = 1
    3. 操纵上面定义的全局变量：self.myVar = self.myVar + 1
    4. 打印上面定义的全局变量：print(self.myVar)
    5. 将自定义变量的值赋值为某个字段提取的值：self.myVar = self.outputParameters["字段名"]

    如果想要将自己定义的变量作为字段记录，请选择下一个“在执行环境下获得Python表达式值（eval操作）”选项。

    6. 如果想要引入并使用程序本身没有带的第三方库，需要先使用如pip等工具本地安装好此库，然后在import之前添加自己安装的库的路径，如：
    （1）在系统命令行执行安装emotlib库命令：
    pip install emotlib
    （2）在代码框中写入如下代码：
    sys.path.append("D:/Python38/Lib/site-packages") # 假设此路径下有emotlib库
    import emotlib # 此时就可以使用emotlib库了
    print(emotlib.emoji()) # 使用其中的函数。

    请先阅读此说明，再在上方输入框（不是本框）写具体代码，如果要执行大量代码，可以直接写outside:myCode.py，这样程序就会读取并执行EasySpider目录下的myCode.py中的代码。
    此选项为高级功能，可以直接返回Python代码的表达式值，并在其他位置用Field["本操作名称"]表示此操作返回值，示例：
    1. 返回当前浏览器对象的相关值，用self.browser表示当前操作的浏览器，可直接用selenium的API进行操作，如self.browser.find_element(By.CSS_SELECTOR, "body").text即可返回当前页面的文字。
    2. 返回自定义全局变量的值：self.myVar
    3. 返回条件判断的值：self.myVar == 1
    4. 判断某个字段提取的值是否等于某个变量的值：self.outputParameters["字段名"] == self.myVar

    注意此功能不能对变量进行赋值操作，即不可以写self.myVar = 1这种，如果想要进行赋值操作，请选择上一个“在执行环境下运行Python代码（exec操作）”选项。

是否将执行后的输出/返回值作为字段记录：

参数类型转换为：

记录前清空其他操作字段已记录的值：

此提取数据操作后生成新数据行：

最长等待脚本执行时间（0代表无限等待）：
此操作可以暂停程序执行，如检测到验证码框出现时暂停执行，直到手动长按键盘自定义暂停/继续快捷键（默认：p键）后才继续执行。
此操作可以刷新当前页面。
此操作可以发送邮件，如用于爬虫任务完成后发送邮件通知。 STMP邮件服务器主机： 邮件服务器端口： 发件人邮箱用户名： 发件人邮箱密码（设置了密码注意不要轻易泄露任务文件！）： 收件人邮箱地址： 邮件主题： 邮件内容：
此操作可以清空所有字段值，如用于爬虫任务开始前清空所有字段值。
此操作可以生成新数据行，如用于爬虫任务设计时暂不生成数据行，等所有字段提取结束后统一生成新数据行。

元素在iframe内

使用循环内的索引值（不勾选则输入为下方“设定值”文本框内的内容，勾选后会使用所在“文本列表”循环内设置的下拉框索引值）

相对循环内文本索引值（0表示使用整个当前循环的文本当做索引值，如果大于0则表示当前循环的文本用~来分割开的文本索引取值，即如果当前循环的文本值为2~3，这里填写2，则表示取文本第二项，即取值3，表示设置下拉框为第3项）

XPath：

切换模式

设定值（不适用于切换到下一个选项模式）

元素在iframe内

使用相对循环内的XPath定位的元素

XPath：

任务运行时最终定位的本元素XPath：

在iframe内操作

循环类型：
XPath： ☺

XPath列表：
内容列表（用Field["字段名"]来输入某字段/自定义操作的最新提取/返回值）：
代码/脚本内容（用Field["字段名"]来输入某字段/自定义操作的最新提取/返回值）：

    请先阅读此说明，再在上方输入框（不是本框）写具体代码，如果要执行大量代码，可以直接写outside:myCode.py，这样程序就会读取并执行EasySpider目录下的myCode.py中的代码。
    根据Python代码的表达式值来决定是否循环，示例：
    1. 返回当前浏览器对象的相关值，用self.browser表示当前操作的浏览器，可直接用selenium的API进行操作，如self.browser.find_element(By.CSS_SELECTOR, "body").text=="123"，表示判断当前页面是否为123这个文本。
    2. 返回自定义全局变量的值：self.myVar
    3. 返回条件判断的值：self.myVar > 1
    4. 判断某个字段提取的值是否等于某个变量的值：self.outputParameters["字段名"] == self.myVar
    以上表达式返回值大于0或为真则继续循环，否则停止循环。

最长等待脚本执行时间（0代表无限等待）：
最多执行循环次数（0代表无限循环直到找不到元素或检测不到页面元素内容变化为止）： 检测页面以下元素内容不变化时退出循环（次数为0时生效，如果是多层嵌套iframe，建议写一个只有要提取的iframe页面内才有的元素的XPath，如/html/body/div[@class='LeftSide_menu']）：

（自定义操作）使用代码/脚本定义循环退出条件（也可以在流程中添加自定义操作，然后选择退出循环选项）：

最长等待脚本执行时间（0代表无限等待）：
跳过前几次循环（如要跳过前2个循环则填写2）：
历史记录回退后等待秒数： 执行完是否向下滚动：
滚动次数（滚动类型设置为不滚动或一直滚动时请忽略此项）： 滚动后等待时间（秒）：
判断条件是从左往右判断的，即如果最左边的条件分支的判断条件满足，则执行最左边分支内的操作，否则判断从左向右第二个分支的条件是否满足，以此类推。设计任务时点击分支即可在浏览器中动态调试分支是否满足（不适用于系统命令和Python Eval操作）。
判断条件是从左往右判断的，即如果最左边的条件分支的判断条件满足，则执行最左边分支内的操作，否则判断从左向右第二个分支的条件是否满足，以此类推。设计任务时点击分支即可在浏览器中动态调试分支是否满足（不适用于系统命令和Python Eval操作）。

在iframe内操作

条件类型：
包含的文字/元素XPATH： ☺
代码/脚本内容（用Field["字段名"]来输入某字段/自定义操作的最新提取/返回值）：

    请先阅读此说明，再在上方输入框（不是本框）写具体代码，如果要执行大量代码，可以直接写outside:myCode.py，这样程序就会读取并执行EasySpider目录下的myCode.py中的代码。
    根据Python代码的表达式值来判断条件是否满足，示例：
    1. 返回当前浏览器对象的相关值，用self.browser表示当前操作的浏览器，可直接用selenium的API进行操作，如self.browser.find_element(By.CSS_SELECTOR, "body").text=="123"，表示判断当前页面是否为123这个文本。
    2. 返回自定义全局变量的值：self.myVar，如果
    3. 返回条件判断的值：self.myVar == 1
    4. 判断某个字段提取的值是否等于某个变量的值：self.outputParameters["字段名"] == self.myVar
    以上表达式返回值大于0或为则执行此分支内操作，否则不执行。

最长等待脚本执行时间（0代表无限等待）：
代码/脚本内容（点击此处查看更多示例）： 最长等待脚本执行时间（0代表无限等待）：
操作执行前等待以下元素出现： 要等待的元素在页面第几个iframe中，0表示元素不在iframe中： 元素出现的最长等待时间（秒）：
操作执行后等待秒数（所有等待时间均可设置为小数，如0.5）： 等待类型

#### 保存任务（可按Ctrl+S调出此窗口）

任务名称： 任务描述： 导出数据格式（Excel/CSV/TXT/数据库，查看MySQL操作教程）：
导出文件名/数据库表格名称（可使用../表示相对路径以改变文件保存位置，名称中的“current_time”会被替换为执行任务时的时间戳）： 数据写入模式（上方导出文件名/数据库表格名称需固定，同一个任务ID多次执行时生效）：
执行完成后是否去除重复数据（注意此功能需要等到任务结束时执行，因此执行任务中途退出将无法进行去重）：
执行时通过读取以下Excel（.xlsx）文件来修改各个操作的输入参数，文件格式请在调用任务时点击“从Excel文件读取输入参数”按钮查看： 浏览器模拟类型：
是否最大化浏览器窗口：
每采集多少条数据保存一次（值越大采集速度越快，但如果意外退出则有数据丢失风险）： 是否要意外退出并重新执行任务时从上次保存的位置继续执行（已采集条数记录间隔为上面设置的值）：
任务执行完毕后自动关闭浏览器等待秒数（用户信息临时目录将在浏览器关闭后自动删除）： 控制台预览时数据最大显示长度： 任务执行时是否记录日志：
任务暂停/继续快捷键：