EasySpider icon indicating copy to clipboard operation
EasySpider copied to clipboard

记录下待开发的功能,大家也可以来提想要的功能

Open NaiboWang opened this issue 1 year ago • 100 comments

以下功能会在有空的时候集中开发,大家有什么想要的功能也可以提issues留言,也欢迎大家fork之后帮我开发并提交pull request~

这部分是长期开发计划:

  • [ ] 设计阶段通过outside:code.js来加载JS代码,并暴露交互接口方便和设计阶段的程序交互。

  • [ ] 接入cms。

  • [ ] m3u8下载。

  • [ ] 智能检测主要内容块并标记选中,思路:先滚动直到到达5次没有新内容加载,然后根据网页中的html内容,检测最大的块(子元素结构一致且数量最多的块)作为主要块,并自动选中子元素。 另一种思路:将整个网页每个节点的具体内容替换成长度的数字,然后分析这个树,根据字数长短寻找最佳块。占比面积最大的块是什么,标记清楚(硕士论文最早的一章)。

  • [ ] 引入大语言模型,用于分析页面主要内容及识别验证码等,如将图片类验证码转换为文字后,用大语言模型/多模态模型过验证码。

  • [ ] 构建Docker镜像和Web前端页面,可以远程访问,调用和执行服务器的爬虫任务;通过http调用的方式直接执行任务。

  • [ ] Oracle/Sql Server/MongoDB/Postgre数据库入库功能。

  • [ ] iframe层数设置。

  • [ ] 循环和提取数据可以不止选择第一个元素。

  • [ ] 底层框架可以考虑换playwright。

  • [ ] 操纵扩展页面。

  • [ ] 手机APP采集支持。

  • [ ] 插件版本的EasySpider处理CloudFlare等极端网站。

  • [x] 任务列表排序和搜索。

  • [x] 拼接后给XPath最终是多少的提示。

  • [ ] 插件测试,saveData()之前过一个全局插件用来处理数据为其他指定格式,如导入翻译插件(新导包的路径依赖怎么做),试一下是否可以将self.替换成其他的如browser.就可以完成指定任务。

  • [x] 命令行默认为local模式。

  • [ ] 数据写入模式中增加文件已存在自动重命名,下载文件同名情况下重命名(多线程测试,keyboard参数测试,采集速度测试,两个相同任务ID同时下载文件测试)。

  • [ ] cookies池功能。

  • [x] 自定义操作新增“生成新数据行”,“清空字段值”,“退出程序”的操作。

  • [ ] 自定义操作新增“切换标签页”,“关闭当前标签页”,“最大化窗口”的操作,循环文本列表同样需要处理标签页。

  • [x] 试运行JS增加提示返回值功能。

  • [x] 提取数据操作试运行可以实时显示多数类型的元素提取值。

  • [x] 字段内容示例值很长时自动换行。

  • [ ] MacOS下循环点击每个链接的Bug修复。

  • [ ] 判断条件增加多个值,与或都行。

  • [ ] 操作台增加OCR识别图片选项。

  • [ ] 下载的图片名称可自定义,用于后续读取图片方便验证码识别等。

  • [ ] 出一期设计阶段不用自带浏览器设计的教程(不能自动点击和输入文字)。

  • [ ] 文心一言测试。

  • [ ] PDF生成。

  • [ ] 文章生成doc,图片插入到文字中保持顺序不变。

  • [x] 保存任务提示时间减少。

  • [ ] 操作备注。

  • [ ] 循环的XPath也可以使用上层循环做拼接。

  • [ ] 可选是否加载图片和视频以提高效率。

  • [x] (Bug修复)打开网页默认应该打开的是链接池的第一个链接。

  • [x] 双击操作。

  • [ ] mysql数据去重bug:1054, unknown column '_id' in 'field list'.

  • [x] 字段设置为常量。

  • [ ] 下载文件是否自动重命名选项。

NaiboWang avatar May 13 '23 12:05 NaiboWang

刚刚接触,代码上的初步意见: 未看出Git中放打包的EasySpider.crx,以及分成en和zh两版的意义。 从代码国际化(i18n)来说,lang=zh应该zh-cn或zh-hans。 代码和自述里中英混杂,对fork发展也许不太友好。

yfdyh000 avatar May 20 '23 09:05 yfdyh000

刚刚接触,代码上的初步意见: 未看出Git中放打包的EasySpider.crx,以及分成en和zh两版的意义。 从代码国际化(i18n)来说,lang=zh应该zh-cn或zh-hans。 代码和自述里中英混杂,对fork发展也许不太友好。

感谢,都是非常好的建议。 以上问题大部分原因基本都在于刚开始这个软件是个纯中文软件,只是后来要投稿国际会议WWW 2023所以赶鸭子上架拼凑了一个英文版出来,所以没时间查看其他双语规范的写法。至于en和zh两版是临时想出的解决方案,所有的中英文版本几乎都是独立加载的,没有参考通用写法。 代码和自述中英混杂是我的习惯问题,因为主要是想中国人用,所以中文放前面,英文只是顺便翻译了一下,不过以后可以考虑分开。 放出打包的.crx意义确实不大,应该在.gitignore中消掉。 现阶段我的主要工作还是做科研,等空出时间了会把代码继续重构,符合通用规范。 再次感谢提出宝贵的建议!

NaiboWang avatar May 20 '23 09:05 NaiboWang

能不能考虑把采集到的内容直接发布到常用的网站类型中,谢谢!

timodaxia2019 avatar Jun 01 '23 23:06 timodaxia2019

能不能考虑把采集到的内容直接发布到常用的网站类型中,谢谢!

这属于衍生需求,有很多工具可以做,参考:https://www.zhihu.com/question/52240701

因此暂时不考虑。

NaiboWang avatar Jun 02 '23 05:06 NaiboWang

加上打印日志功能

SarcomTDG avatar Jun 02 '23 08:06 SarcomTDG

1.列表页字段和详情页的字段能对应上; 2.相似的块的字段名称和字段值能不能识别生成,有的只知道区域,但字段名称不一定是固定的

wzt0501 avatar Jun 07 '23 15:06 wzt0501

采集下来数据的CSV文件的列表头(对应于任务信息当中输出参数的参数名称)的各个字段名称,能否根据采集者的意愿在任务中做配置,从而自动修改?

Forrestz88 avatar Jun 21 '23 06:06 Forrestz88

采集下来数据的CSV文件的列表头(对应于任务信息当中输出参数的参数名称)的各个字段名称,能否根据采集者的意愿在任务中做配置,从而自动修改?

能不能说详细一点什么叫做自动修改,现在各个字段的名称是可以手动修改的。

NaiboWang avatar Jun 21 '23 06:06 NaiboWang

采集下来数据的CSV文件的列表头(对应于任务信息当中输出参数的参数名称)的各个字段名称,能否根据采集者的意愿在任务中做配置,从而自动修改?

能不能说详细一点什么叫做自动修改,现在各个字段的名称是可以手动修改的。

所谓自动,就是我们事先在任务当中配置好该怎么修改,之后,执行完任务,采集下来的数据已经是按照我们事先的设定改好了,而不需要我们去手动在CSV或Excel文件中修改列表头,这就是我所谓的自动。

你提到的现在可以手动修改是指在任务配置过程中就修改好了是吗?如果是在任务配置过程中修改就修改好了,逻辑上就已经是我讲的自动修改的意思了。

我之前用八爪鱼用的很多。八爪鱼当中,列表头的字段名称是可以按照采集者的想法进行任意修改的。你的视频我没时间看。我是昨天一边做别的事,一边一口气听完的,中文的听了16集。软件没上手练,界面可能不熟悉。因为没听到说可以改列表头的这个说法,所以我以为列表头不能在任务配置文件中改呢。

Forrestz88 avatar Jun 21 '23 06:06 Forrestz88

采集下来数据的CSV文件的列表头(对应于任务信息当中输出参数的参数名称)的各个字段名称,能否根据采集者的意愿在任务中做配置,从而自动修改?

能不能说详细一点什么叫做自动修改,现在各个字段的名称是可以手动修改的。

所谓自动,就是我们事先在任务当中配置好该怎么修改,之后,执行完任务,采集下来的数据已经是按照我们事先的设定改好了,而不需要我们去手动在CSV或Excel文件中修改列表头,这就是我所谓的自动。

你提到的现在可以手动修改是指在任务配置过程中就修改好了是吗?如果是在任务配置过程中修改就修改好了,逻辑上就已经是我讲的自动修改的意思了。

我之前用八爪鱼用的很多。八爪鱼当中,列表头的字段名称是可以按照采集者的想法进行任意修改的。你的视频我没时间看。我是昨天一边做别的事,一边一口气听完的,中文的听了16集。软件没上手练,界面可能不熟悉。因为没听到说可以改列表头的这个说法,所以我以为列表头不能在任务配置文件中改呢。

表头可以在设计时改。

NaiboWang avatar Jun 21 '23 08:06 NaiboWang

作者您好,我想提一个关于对 采集到的数据处理的一个 小建议 现在的EasySpider默认是将采集到的数据以 csv 的格式储存在文件里,但是大多数时候我们也会有将数据持久到数据库或者别的文件格式的需求,能否提供自定义的持久化方式? 其实持久化到数据库这个操作也可以通过 现在已经提供的 插入js代码来调用其他api 来“间接”实现这个功能(这是我目前能想到的方法)

jyxzwd avatar Jun 21 '23 13:06 jyxzwd

作者您好,我想提一个关于对 采集到的数据处理的一个 小建议 现在的easySpdier默认是将采集到的数据以 csv 的格式储存在文件里,但是大多数时候我们也会有将数据持久到数据库或者别的文件格式的需求,能否提供自定义的持久化方式? 其实持久化到数据库这个操作也可以通过 现在已经提供的 插入js代码来调用其他api 来“间接”实现这个功能(这是我目前能想到的方法)

谢谢建议,这个程序设置的初衷是为那些不会写代码的朋友准备的,没想到发布后会有很多人想要写入数据库这种程序员级别的操作。

因为CSV转DB或者写入SQL数据库这个操作已经有很多开源实现,如:https://github.com/simonw/csvs-to-sqlite

因此这个功能属于边缘功能,大家如果想写入数据库总会找到办法,因此这个功能暂时不会考虑开发。

我倒希望有朋友能提交Pull Request,帮我一起完善这个软件,很遗憾发布了一个多月还没有有效的PR提交,一个人维护一个项目实在有些力不从心,将来我个人的重点也会主要集中在核心功能的开发上,至于写入数据库这种边缘功能,期待有朋友帮我做。

谢谢建议~

NaiboWang avatar Jun 21 '23 13:06 NaiboWang

目前发现还是变量这块不太行(如果实现了,麻烦也告知一下) 例如:

  • 提取页面数据作为循环次数
  • 提取页面数据作为xpath依据
  • 提取页面数据作为“切换下拉选项”的依据

再就是,编辑器部分建议优化为可以拖动那种操作,虽然目前也够用,但是第一次上手还是不太符合直觉

BanKnight avatar Jun 23 '23 01:06 BanKnight

能支持下载网页中的文件么?例如PDF

liujuncn avatar Jun 26 '23 18:06 liujuncn

能支持下载网页中的文件么?例如PDF

最新版本特性里就写了可以下载pdf……

NaiboWang avatar Jun 26 '23 18:06 NaiboWang

不好意思,只注意看教学视频了。

另外还有一个建议,对于采集多个页面文章的情况下,默认会把文本合并到输出的csv文件里。那么能否在提取数据的设置里增加一项用户自定义分隔项,例如我可以把每篇文章的文本用<|endoftext|>分隔。

liujuncn avatar Jun 27 '23 17:06 liujuncn

不好意思,只注意看教学视频了。

另外还有一个建议,对于采集多个页面文章的情况下,默认会把文本合并到输出的csv文件里。那么能否在提取数据的设置里增加一项用户自定义分隔项,例如我可以把每篇文章的文本用<|endoftext|>分隔。

这个在提取数据操作前用JS操作一下就行了,可以参考下面这个视频: https://www.bilibili.com/video/BV1qs4y1z7Hc

NaiboWang avatar Jun 27 '23 17:06 NaiboWang

这个在提取数据操作前用JS操作一下就行了,可以参考下面这个视频: https://www.bilibili.com/video/BV1qs4y1z7Hc

这样试了不行: image 如果在“提取页面文本”元素用js追加文本,会给每个p文本都追加。而我希望给整个页面提取出来的文本追加。 如果在该页面所有p文本提取的循环结束后用js追加(如图),结果是没有期望结果。 而且我也不希望追加的eot作为另一个单独的字段。

这个需求抽象来说就是: 我需要对某个操作或循环的结果,可以用js来处理并替代它们记录到csv。 例如上述例子:详情页面的每个p元素的文本被采集为text字段,那么这个页面处理的循环结束后,我需要用js处理结果,合并它们并追加一个eot标签字符串,然后将这个修改后的页面文本保存到结果csv。

liujuncn avatar Jun 28 '23 09:06 liujuncn

这个在提取数据操作前用JS操作一下就行了,可以参考下面这个视频: https://www.bilibili.com/video/BV1qs4y1z7Hc

这样试了不行: image 如果在“提取页面文本”元素用js追加文本,会给每个p文本都追加。而我希望给整个页面提取出来的文本追加。 如果在该页面所有p文本提取的循环结束后用js追加(如图),结果是没有期望结果。 而且我也不希望追加的eot作为另一个单独的字段。

这个需求抽象来说就是: 我需要对某个操作或循环的结果,可以用js来处理并替代它们记录到csv。 例如上述例子:详情页面的每个p元素的文本被采集为text字段,那么这个页面处理的循环结束后,我需要用js处理结果,合并它们并追加一个eot标签字符串,然后将这个修改后的页面文本保存到结果csv。

先找到你的EasySpider\resources\app\src\taskGrid文件夹,把logic_CN.js的第375到383行删掉,即删掉以下内容:

 if (outputNames.indexOf(title) >= 0) { //参数名称已经被添加
      $('#myModal').modal('hide');
      $("#tip2").slideDown(); //提示框
      fadeout = setTimeout(function() {
          $("#tip2").slideUp();
      }, 5000);
      return;
  }

然后把上面自定义操作的名称改成和上面“提取页面文本”操作里一样的字段名称,如参数1_文本,即可使得相同字段里的内容放在一起。

NaiboWang avatar Jun 28 '23 11:06 NaiboWang

这个办法生效,就是它还是会在csv首行生成一个同名列。如果后续需要处理,例如使用pandas.read,还需要人工去删除一下。

liujuncn avatar Jun 28 '23 14:06 liujuncn

这个办法生效,就是它还是会在csv首行生成一个同名列。如果后续需要处理,例如使用pandas.read,还需要人工去删除一下。

OK,这个bug会在下一个版本修复。

NaiboWang avatar Jun 28 '23 14:06 NaiboWang

搞个无头模式,最好能docker运行

aogg avatar Jul 03 '23 04:07 aogg

搞个无头模式,最好能docker运行

无头模式现在就有。

NaiboWang avatar Jul 03 '23 04:07 NaiboWang

能不能加个关闭当前标签页,我点开链接都是新的标签页,导致没法后退,循环立马就断了

handeserve avatar Jul 05 '23 14:07 handeserve

能不能加个关闭当前标签页,我点开链接都是新的标签页,导致没法后退,循环立马就断了

没法后退导致循环断不知道你是怎么设计的,理论上不太可能。

如果想关闭标签页,添加自定义操作,命令值为:window.close()即可。

NaiboWang avatar Jul 05 '23 14:07 NaiboWang

能不能加个关闭当前标签页,我点开链接都是新的标签页,导致没法后退,循环立马就断了

没法后退导致循环断不知道你是怎么设计的,理论上不太可能。

如果想关闭标签页,添加自定义操作,命令值为:window.close()即可。

我加了window.close()之后,直接把整个浏览器关了。 我的浏览器,点击链接之后就是在新标签页打开,然后每次打开完第一个链接,提取过数据之后,程序就结束了,我也不知道什么情况 这是我的程序,前面都没问题,点击详情页,就会打开一个新的标签页,然后里面有个元素是下载PDF的,点了以后就可以下载,然后不管加不加window.close(),下载完都会直接结束程序 截屏2023-07-05 22 29 39

handeserve avatar Jul 05 '23 14:07 handeserve

把你的任务文件发我邮箱:[email protected],我去帮你看下

NaiboWang avatar Jul 05 '23 14:07 NaiboWang

把你的任务文件发我邮箱:[email protected],我去帮你看下

好的,谢谢,我的是mac,应该在哪找我的任务文件呢,是这个吗 截屏2023-07-05 22 43 42

handeserve avatar Jul 05 '23 14:07 handeserve

是的

NaiboWang avatar Jul 05 '23 14:07 NaiboWang

作者您好,我想提一个关于对 采集到的数据处理的一个 小建议 现在的EasySpider默认是将采集到的数据以 csv 的格式储存在文件里,但是大多数时候我们也会有将数据持久到数据库或者别的文件格式的需求,能否提供自定义的持久化方式? 其实持久化到数据库这个操作也可以通过 现在已经提供的 插入js代码来调用其他api 来“间接”实现这个功能(这是我目前能想到的方法)

导入MySQL数据库功能的版本已发布,欢迎使用。

NaiboWang avatar Jul 08 '23 18:07 NaiboWang