js 爬虫抓取网页数据(图来说明架构的设计思想(一)说明)

优采云 发布时间: 2021-12-28 12:10

  js 爬虫抓取网页数据(图来说明架构的设计思想(一)说明)

  前言:

  (原文链接:

  /bone_ace/article/details/55000416

  )

  在爬虫开发过程中,一些业务场景需要同时爬取数百甚至数千个网站。这时候就需要一个支持多爬虫的框架了。设计时应注意以下几点:

  代码重用,功能模块化。如果为每个网站写一个完整的爬虫,肯定收录

很多重复的工作。不仅开发效率不高,而且整个爬虫项目后期会变得臃肿不堪,难以管理。易于扩展。多爬虫框架,最直观的需求就是方便扩展,添加一个要爬取的目标网站,我只需要写少量必要的内容(比如爬取规则、解析规则、入库规则),这样是最快的和最好的。健壮性和可维护性。这么多网站同时爬取,报错的概率就更大了,比如断网、中途反爬、爬到“脏数据”等等。因此,有必要做好日志监控,实时监控爬虫系统状态,准确定位错误信息;另外,对于各种异常的处理,如果你放假回来发现爬虫因为一个小问题死掉了,那你浪费几天就太可惜了(虽然实际上我是亲自远程查看爬虫状态的)时)。分散式。多站点爬取,数据量一般比较大,而且可以分布式扩展,这也是必备的功能。分布式,需要关注消息队列,多节点统一去重。爬虫优化。这是个大话题,但最基本的,框架应该是基于异步的,或者使用协程+多进程。结构简洁,

  要求如上,已经说的很清楚了。下面介绍一个架构设计,去年做的。现在让我分享一下。具体代码实现暂不公开。

  文本:

  下面将通过两张图来说明该架构的设计思路。

  

  框架主要分为下载器和分析器两部分。Downloader负责抓取网页,Analyzer负责解析网页并存入数据库。两者依靠消息队列MQ进行通信,两者可以分布在不同的机器上,也可以分布在同一台机器上。两者的数量也是灵活可变的。比如可能有五台机器在做下载,两台机器在做解析,可以根据爬虫系统的状态及时调整。从上图可以看出MQ有两个管道:HTML/JS文件和要爬取的*敏*感*词*。下载器从待爬取的*敏*感*词*中获取*敏*感*词*,根据*敏*感*词*信息调用对应的抓取模块抓取网页,然后保存在HTML/JS文件的通道中;Analyzer从HTML/JS文件中获取一个网页内容,根据内容调用相应的分析模块进行信息分析,将目标字段放入数据库,必要时解析出新的*敏*感*词*进行爬取到MQ。可以看出Downloader收录

User-Agent池、Proxy池和Cookie池,可以适应复杂网站的爬取。模块的调用使用工厂模式。

  

  这张图片是上一张图片的另一种表示。Htmls queue 和 Seed 是可以独立分离的队列,甚至可以开号,它们之间没有联系。可根据爬虫状态和硬件环境灵活调整。此外,8G 内容允许 Redis 将 50 到 8000 万个*敏*感*词*存储为一个 Seeds 队列。分布式爬虫有一个很关键的点:去重。可以看出,多个分析器共享一个重复数据删除队列,以保证数据的一致性和非重复性。重复数据删除队列可以放在一台机器上。Bloomfilter算法基于Redis实现(详见《基于Redis的Bloomfilter重复数据删除(附Python代码)》,理论上8G内存可以满足30亿个URL的重复数据删除)。如果允许丢失的概率更高,则可以对其进行重复数据删除。更多的。

  结论:

  写一个支持分布式多爬虫的框架,具体实现还是有难度的。除了实现主要功能之外,还要注意严格的代码规范和高效健壮的爬虫的要求。这样做之后,你肯定会成长很多!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线