一、背景
针对某信息发布网站,希望爬取已发布的信息。原网站提供过滤查询选项,且内容加载方式以 JS 拉取数据后填充显示进行。不提供直接的选页功能,仅可通过下一页,或前后三页幅度跳转,跳转也以 JS 更新数据形式进行。
二、方案一(未最终采用)
1、利用 Selenium 模拟网页访问,获取显示内容,并激发下一页跳转。持续爬取数据。
2、该方法遇到两个问题:1)网站设计上可能存在缺陷,在完全不添加查询过滤选项时,仅能正常显示一部分分页。不能访问的部分未见主动限制提示,猜测是代码实现中有 bug。2)采用 Selenium 整体加载较慢,爬取效率较低。
三、方案二
1、利用 Chrome 调试台查看网络流量,定位到所需过滤选项条件下 JS 拉取数据的接口,该接口返回含所需爬取内容的 JSON 格式数据,访问速度很快。
2、经测试,未发现该接口有访问限制。可进行持续大量访问。
3、编写 python 脚本,利用 requests 包按所需过滤条件调用该数据端口,保存获取的数据。
4、因数据量较大,采用多进程 + 多线程方法进行加速。
------------------
20220813更新:
目标网站调整部分方案二接口返回数据的方式,不直接返回 json 数据,而是返回嵌入 js 的 html 页面,在页面加载时可获得完整数据。因此更改拉取接口,改为使用 Selenium 模拟网页访问后再获取其中的 json 数据。经测试,发现原多线程拉取方法过度占用系统资源,故改为单线程爬取。对一年量数据的爬取整体耗时为多线程方案下3-4倍。