爬虫架构设计

Posted XDORG

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫架构设计相关的知识,希望对你有一定的参考价值。

前言

公司要求:需要获取并分析数据,所以干起了爬虫工程师的事情,分享一下最近学习的经验.由于团队人手不够,目前是自己独自负责这部分(搭建、爬取、解析),可能会有不完善的地方,如果觉得有可以优化的地方或者是更好的方案可以私信交流。

目标:京东、考拉、淘宝、costco、amazon(自己现阶段的需求就是这些了)

使用到的数据库:mysql、mongo、redis

目录:

1.简易爬虫
2.框架设计(分布式框架爬虫)
3.服务器自动扩容(程序自动增减服务器设备)
4.反爬

一:简易爬虫

1.使用selenium+chromedp实现浏览器进行爬虫。
当然如果硬要用请求去爬取而不是浏览器也行,当稍微遇到反爬时,则会头痛不已,因为浏览器爬取是模拟真实请求,
而接口请求很容易被识别出来,就算没有被识别出来,其实很多大网站的反爬,都会有加密,多层接口的过程,尤其是
javascript层加密,那就很好玩了,恐怕不知需要花费多久才能正常爬取一个网站,当反爬逻辑一改,那就晾凉罗,代码
也是大动,这里不多讲了,反爬部分会进行说明。

2.环境(linux) windows也可,但没必要,性能上无法比较。使用selenium在linux上无窗口爬取就行.

3.这边默认是爬取网站的所有商品,所以找到目录,获取目录,在解析目录,获取所有目录的分类链接.

4.根据分类链接爬取所有的商品列表页面,里面包括分页等等,从而就可以获取对应的商品名称,价格,商品详情链接等等.
当然不同的网站的爬取细节都不同,这里就不一一举例了,因为只是往大的方向说,不太理解的可以评论或私聊。
看到了就会解答。

5.和上一步一样,详情商品链接爬取html,进行存储,全部存储完,在进行解析。从而就可以获取商品的规格以及各种详细
信息

6.注意事项:页面商品展示以及评论很多都不会直接展示出来,有一些关键信息是隐藏起来的,需要页面去触发,有可能
是点击,也有可能是鼠标移动就行,这个时候你调用对应的api即可.
7.此时解析出来的商品数据,就可以进行合理分析了,比如和公司商品匹配,看看其他平台的商品价格趋势、信息、评论等.

缺点:通过这种单一脚本的方式、性能肯定是有限制的、就算开了多线程毕竟是单例模式,整个网站所有的商品爬取下
来都不知道要花多长时间,更何况还需要持续监测,监测出每个商品的变动,价格趋势,所以这个时候就需要设计一套
分布式爬虫架构.

二.分布式爬虫架构

1.所有爬取、解析都是通过任务的方式进行操作。

2.任务关键字段:平台、分类、是否使用代理ip、是否产生cookie、停断多久继续爬取、错误重试次数,超时时间、任务
状态执行结果,任务执行进度,类型(分类、主页、详情)

3.客户端、客户端专门获取用户的任务然后分发给采集端进行采集。这边获取到的任务,在解析任务,把任务对应的爬
虫链接都发送到消息队列里。消息队列有很多选择. kafka、rocketMq .....等等,emmm自己选吧,我目前用的就是
rocketMq,因为是阿里云强烈推荐的,kafka之前也用过,kafka在承受高并发场景下是特别好的,主要是我也没有场景能直
接把消息队列给弄挂了,所以这里用哪个的区别其实意义不大,当然这些都可以部署,但会增加运维成本,还不如直接
用阿里云的rocketMq,反正特别便宜,如果实在舍不得花那么一点钱,那就干脆直接用rpc通信就行了,不过后面的采
集端负载,消费会很麻烦,就看个人了吧,估计公司肯定都是走消息队列了,去走请求、在维持负载采集、强行增加难度、
这可能是单纯的想提升技术水平了吧。

4.采集端:采集端拥有N个,具体拥有多少个则需要看自己的需求量了,计算每天的采集数量,需要多少天完成,得出有多
少个采集端,采集端将会从消息队列里接收到一条url的采集任务,接受后进行采集进行存储,如果临时发现速度较慢,则
可以用任务创建服务器、生成对应的采集端、进行采集.

5.最后就是一些细节操作了,根据任务解析等等.

三:服务器自动扩容(程序自动增减服务器设备)

平台:阿里云
1.准备一台服务器,选择自己需要的配置信息进行创建.(这里选择了centos7系统)

2.部署好这台centos7系统,把自己的程序服务部署上去

3.使用systemctl的方式,使linux系统上让程序服务开机即启动、以及关闭时自启动。

4.部署对应的环境等等

5.把该服务器打包成自定义镜像.

6.通过自己的程序代码创建阿里云ECS服务.

这样在创建的那一刻、即程序以及自动运行,则实行了自动扩容的效果.

四:反爬

1.使用selenium+chromedp可以模拟用户真实访问的效果

2.代理ip,不用代理ip很容易直接被封。

3.拼接cookie等一些携带请求头,看看对应的网站有没有一些对应的规则.

4.有些网站会出现图片验证码,拖动条等等,这里我先简单的描述如何解决对两种反爬
(1)拖动条
以简单的为例,比如从A点拖动到B点即可.
获取滚动条(根据id或者对应的属性获取即可),计算出滚动条的长度,算出滚动条A点的XY中心轴.
鼠标移动到A点的XY中心轴进行拖动,拖动具体长度即可。
拖动的时候最好有幅度,比如速度的控制,以及上下的控制,弄点随机数就好.
(2)图片验证码
首先获取元素的图片,再将图片解析.
解析通过OCR解析即可.使用google即可。
解析后的验证码填入对应的文本框即可,在点击按钮确认。

结束

由于时间原因,具体的实现过程就没有写上了,如果一一列出,恐怕就不知道多久能写得完了,有兴趣的小伙伴可以留言交流。


以上是关于爬虫架构设计的主要内容,如果未能解决你的问题,请参考以下文章

分布式爬虫架构设计与实现

scrapy按顺序启动多个爬虫代码片段(python3)

scrapy主动退出爬虫的代码片段(python3)

爬虫架构设计

系统架构 之 高效分布式爬虫系统的架构设计[申请专利]

.NET跨平台爬虫框架:DotnetSpider初衷与架构设计