实战爬取全网近5000手机|下篇

作者: 菜鸟学python | 来源:发表于2017-09-23 21:10 被阅读624次

    阅读本文大概需要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”,获得更多免费电子书和源码资料

    相关文章

      网友评论

      本文标题:实战爬取全网近5000手机|下篇

      本文链接:https://www.haomeiwen.com/subject/erhhextx.html