分布式爬虫(五)| 青训营笔记

441 阅读6分钟

这是我参与「第四届青训营 」笔记创作活动的第五天

实战:爬取京东、苏宁易购全网手机商品数据

因为前面在介绍这个系统的时候也提到了,我只写了京东和苏宁易购的网页解析器,所以接下来也就是爬取其全网的手机商品数据。\

环境说明

需要确保Redis、ZooKeeper服务可用,另外如果需要使用HBase来存储数据,需要确保Hadoop集群中的HBase可用,并且相关配置文件已经加入到爬虫程序的classpath中。

还有一点需要注意的是,URL定时器和监控报警系统是作为单独的进程来运行的,并且也是可选的。\

爬虫结果

进行了两次爬取,分别尝试将数据保存到MySQL和HBase中,给出如下数据情况。

保存到MySQL\

mysql> select count(*from phone;
+----------+
| count(*|
+----------+
|    12052 |
+----------+
1 row in set

mysql> select count(*from phone where source='jd.com';
+----------+
| count(*|
+----------+
|     9578 |
+----------+
1 row in set

mysql> select count(*from phone where source='suning
.com';
+----------+
| count(*|
+----------+
|     2474 |
+----------+
1 row in set


在可视化工具中查看数据情况:\

9.jpg


保存到HBase\

hbase(main):225:0* count 'phone'
Current count: 1000row11155386088_jd.com
Current count: 2000row136191393_suning.com
Current count: 3000row16893837301_jd.com
Current count: 4000row19036619855_jd.com
Current count: 5000row1983786945_jd.com
Current count: 6000row1997392141_jd.com
Current count: 7000row21798495372_jd.com
Current count: 8000row24154264902_jd.com
Current count: 9000row25687565618_jd.com
Current count: 10000row26458674797_jd.com
Current count: 11000row617169906_suning.com
Current count: 12000row769705049_suning.com                 
12348 row(s) in 1.5720 seconds

=> 12348


在HDFS中查看数据情况:\

10.png


数据量与实际情况分析

京东:\

11.png


京东手机的列表大概有160多页,每个列表有60个商品数据,所以总量在9600左右,我们的数据基本是符合的,后面通过日志分析其实可以知道,一般丢失的数据为连接超时导致的,所以在选取爬虫的环境时,更建议在网络环境好的主机上进行,同时如果可以有IP代理地址库就更好了,另外对于连接超时的情况,其实是可以进一步在我们的程序中加以控制,一旦出现爬取数据失败的url,可以将其加入到重试url队列中,目前这一点功能我是没有做,有兴趣的同学可以试一下。

苏宁易购:

再来看看苏宁的,其有100页左右的手机列表,每页也是60个商品数据,所以总量在6000左右。但可以看到,我们的数据却只有3000这样的数量级(缺少的依然是频繁爬取造成的连接失败问题),这是为什么呢?

这是因为,打开苏宁的某个列表页面后,其是先加载30个商品,当鼠标向下滑动时,才会通过另外的API去加载其它的30个商品数据,每一个列表页面都是如此,所以,实际上,我们是缺少了一半的商品数据没有爬取。知道这个原因之后,实现也不难,但是因为时间关系,我就没有做了,有兴趣的朋友折腾一下吧。\

通过日志分析爬虫系统的性能

在我们的爬虫系统中,每个关键的地方,如网页下载、数据解析等都是有打logger的,所以通过日志,可以大概分析出相关的时间参数。\

2018-04-01 21:26:03 [pool-1-thread-1] [cn.xpleaf.spider.utils.HttpUtil] [INFO] - 下载网页:https://list.jd.com/list.html?cat=9987,653,655&page=1,消耗时长:590 ms,代理信息:null:null
2018-04-01 21:26:03 [pool-1-thread-1] [cn.xpleaf.spider.core.parser.Impl.JDHtmlParserImpl] [INFO] - 解析列表页面:https://list.jd.com/list.html?cat=9987,653,655&page=1, 消耗时长:46ms
2018-04-01 21:26:03 [pool-1-thread-3] [cn.xpleaf.spider.core.parser.Impl.SNHtmlParserImpl] [INFO] - 解析列表页面:https://list.suning.com/0-20006-0.html, 消耗时长:49ms
2018-04-01 21:26:04 [pool-1-thread-5] [cn.xpleaf.spider.utils.HttpUtil] [INFO] - 下载网页:https://item.jd.com/6737464.html,消耗时长:219 ms,代理信息:null:null
2018-04-01 21:26:04 [pool-1-thread-2] [cn.xpleaf.spider.utils.HttpUtil] [INFO] - 下载网页:https://list.jd.com/list.html?cat=9987,653,655&page=2&sort=sort_rank_asc&trans=1&JL=6_0_0,消耗时长:276 ms,代理信息:null:null
2018-04-01 21:26:04 [pool-1-thread-4] [cn.xpleaf.spider.utils.HttpUtil] [INFO] - 下载网页:https://list.suning.com/0-20006-99.html,消耗时长:300 ms,代理信息:null:null
2018-04-01 21:26:04 [pool-1-thread-4] [cn.xpleaf.spider.core.parser.Impl.SNHtmlParserImpl] [INFO] - 解析列表页面:https://list.suning.com/0-20006-99.html, 消耗时长:4ms
......
2018-04-01 21:27:49 [pool-1-thread-3] [cn.xpleaf.spider.utils.HttpUtil] [INFO] - 下载网页:https://club.jd.com/comment/productCommentSummaries.action?referenceIds=23934388891,消耗时长:176 ms,代理信息:null:null
2018-04-01 21:27:49 [pool-1-thread-3] [cn.xpleaf.spider.core.parser.Impl.JDHtmlParserImpl] [INFO] - 解析商品页面:https://item.jd.com/23934388891.html, 消耗时长:413ms
2018-04-01 21:27:49 [pool-1-thread-2] [cn.xpleaf.spider.utils.HttpUtil] [INFO] - 下载网页:https://review.suning.com/ajax/review_satisfy/general-00000000010017793337-0070079092-----satisfy.htm,消耗时长:308 ms,代理信息:null:null
2018-04-01 21:27:49 [pool-1-thread-2] [cn.xpleaf.spider.core.parser.Impl.SNHtmlParserImpl] [INFO] - 解析商品页面:https://product.suning.com/0070079092/10017793337.html, 消耗时长:588ms
......


平均下来,下载一个商品网页数据的时间在200~500毫秒不等,当然这个还需要取决于当时的网络情况。

另外,如果想要真正计算爬取一个商品的数据,可以通过日志下面的数据来计算:\

  • 下载一个商品页面数据的时间
  • 获取价格数据的时间
  • 获取评论数据的时间


在我的主机上(CPU:E5 10核心,内存:32GB,分别开启1个虚拟机和3个虚拟机),情况如下:\

12.png


可以看到,当使用3个节点时,时间并不会相应地缩小为原来的1/3,这是因为此时影响爬虫性能的问题主要是网络问题,节点数量多,线程数量大,网络请求也多,但是带宽一定,并且在没有使用代理的情况,请求频繁,连接失败的情况也会增多,对时间也有一定的影响,如果使用随机代理库,情况将会好很多。

但可以肯定的是,在横向扩展增加爬虫节点之后,确实可以大大缩小我们的爬虫时间,这也是分布式爬虫系统的好处。\

爬虫系统中使用的反反爬虫策略

在整个爬虫系统的设计中,主要使用下面的策略来达到反反爬虫的目的:\

  • 使用代理来访问-->IP代理库,随机IP代理
  • 随机顶级域名URL访问-->URL调度系统
  • 每个线程每爬取完一条商品数据sleep一小段时间再进行爬取