阅读本文大概需要3分钟
本篇作者:BlueDamage同学
全网爬取近5000部手机并进行数据分析,是一个非常有趣的小项目,前面我们已经写了一篇对这个项目的整体介绍(厉害了!实战爬取全网5000部手机|上篇),今天把最精彩的爬虫部分和代理部分给大家讲一下,非常感谢BlueDamage同学的精彩投稿
1.爬虫代理类
很多网站都有反爬虫的策略,所以对每一个网站如何绕过反爬虫是一个头疼的问题,我们的目标网站“中关村在线”还好,只需要事先构造一个用户代理池,用代理池里面的UA内容去伪装不同的头,去请求网页就行
1).目标网站的User-Agent
我们点开一个手机的网页链接,然后进行分析,主要查看Host和User-Agent的信息
2).提前准备一个用户代理池
用户代理池甚至代理IP,网上免费的有很多,但是好不好用,稳不稳定就不好说了,这里我们用提前准备了一个User-Agent list
3).核心代码
首先构建一个专门处理代理的类,构造一个header字典变量,'Host','Referer','Connetion'就是上面网页里面的内容,'User-Agent'是动态变量,需要从代理池里面不断的获取
- 随机从用户代理池里面获取一个UA,如果获取的网页长度<100,则失败,循环继续取下一个UA
-
如果尝试次数超过最大值(比如5次),就退出.
2.爬虫类
爬虫部分其实还是跟前面讲过的例子类似,下面把主要的几点讲一下
1).一共108个页面,循环爬取,一个页面一个页面去爬
比如:页面url的获取,打开第2页, 移动鼠标至第3页
通过上图可以发现, 第N页的url应是
http://detail.zol.com.cn/cell_phone_index/subcate57_0_list_1_0_1_2_0_N.htm
2).接着采集每一个手机页面数据,找到手机块所在的标签
- 发现手机块均在 ul中, 其中的每一个li中都有一个手机综述页面url的链接
- 仔细观察发现, li中的data-follow-id=”p1156279”就包含了手机的id
- 正则获取:idList = re.findall(re.compile('data-follow-id="p(.*?)"'), briefPhoneInfoHtml)
3).接着获取当前手机页面信息页面,点评子页面和参数子页面
分析的过程和上面非常类似,限于篇幅我就不展开详述.具体可以看细细的看一下源码
3.断点续爬
1).一般稍微大一点的爬虫程序都会考虑断点续爬的问题
特别是当数据量成千上万的时候,不可能每次都重头再来爬取.这里BlueDamage同学用了一个非常巧妙的方法,来处理这个问题:
- 首先把所有要爬取的手机信息都封装成一个类,然后写入一个文件中
- 而且用了pickle这个模块来序列化存储,这样的好处在于可以非常方便的把一个对象保存到文件中去
- 每次爬取之前,我们先从pk文件中把已经存在里面的手机对象读取处理
2).接着我们要判断一下我们要爬取的手机id
若id已经在这个phoneList里面,则跳过不爬取;若不存在,则爬取
4.数据分析
我们作了这么多步骤,其实就是为了数据分析,下面我们看看部分的数据分析的结果(数据爬取自zol手机, 某些分析定会有出入, 勿介意)
1).2015-2017年, 好评数/差评数最多的是哪款手机, 哪几款品牌?
2).2016-2017年出的手机中, 目前平均售价最高/低的是哪几个品牌?
结论
好,全网爬取近5000部手机下篇就讲道这里,我对原文进行了修改和重新排榜.这个项目还是非常有趣的,非常感谢BlueDamage同学的投稿,源码写的非常精彩,思路非常清晰,上面几个图有几个地方写的非常简洁,不知道细心的同学有没有发现,如果需要源码的同学请留言
关注微信公众号“菜鸟学python”,获得更多免费电子书和源码资料
网友评论