本文主要介绍Scrapy爬虫框架用于爬取360图片,顺带提下之前说的碰到Ajax如何处理,先提下目前的爬虫技术如下图。
    scrapy框架爬虫_360摄影 - 图1
    初步介绍下Scrapy是一个基于Twisted的异步处理框架,是纯python实现的爬虫框架,而且结构清晰,模块之前耦合度低,非常灵活。
    了解Twisted见:https://www.cnblogs.com/silence-cho/p/9898984.html

    百度上copy张图:
    scrapy框架爬虫_360摄影 - 图2
    项目结构:
    Scrapy框架和pyspider不同,它是通过命令行来创建项目的,代码的编写还是需要IDE的。
    项目文件结构:
    Scrapy.cfg #scrapy项目配置文件,其内定义了项目的配置文件路径、部署相关信息等内容
    Project/
    init.py
    Items.py #它定义Item数据结构(可以当成字典)
    Pipelines.py #它定义Item Pipeline的实现
    Settings.py #它定义项目的全局配置
    Middlewares.py #它定义Spider Middlewares和Downloader Middlewares的实现
    Spiders/
    init.py
    Spider1.py #spider的实现
    Spider2.py


    1. 创建项目
    在命令行:
    scrapy startproject images360 #images360为项目文件夹

    2. 创建Spiders
    cd images360
    scrapy genspider images images.so.com #利用genspider生成一个name为images的spider

    3. 对项目类其余文件编写配置

    4. 运行
    scrapy crawl images


    那具体怎么实现呢?
    先打开要爬的摄影图片网站
    https://image.so.com/z?ch=photography
    然后对图片点击右键检查


    scrapy框架爬虫_360摄影 - 图3

    接着点下面这个network,看下数据是怎么传输的,现在可以往下滑动,加载更多的图片处来
    scrapy框架爬虫_360摄影 - 图4
    这个时候选择下面的XHR文件
    scrapy框架爬虫_360摄影 - 图5
    这些就是找Ajax的规律,因为它不像传统page直接加1页就翻页走了,它是通过ajax请求到网页更新这样的,如何去发现,通过xhr类型(Ajax的请求类型就是xhr)

    我把这些圈中的链接copy如下:
    https://image.so.com/zjl?ch=photography&sn=30&listtype=new&temp=1
    https://image.so.com/zjl?ch=photography&sn=60&listtype=new&temp=1
    https://image.so.com/zjl?ch=photography&sn=90&listtype=new&temp=1

    发现规律了吧,虽然不像之前的urlpage+1那样简单,不过这个稍微找下也能找到规律

    Ok,构造url已经解决,接下来就是提取信息,我们可以先访问下这个网页:
    https://image.so.com/zjl?ch=photography&sn=30&listtype=new&temp=1

    scrapy框架爬虫_360摄影 - 图6
    打开发现是密密麻麻的json格式,这就好办了,看看有哪些字段:

    {“id”:”c5f4e6e3b5f361ebb7c5dc0a7a0faa93”,”index”:91,”grpmd5”:”54f5cf75eb7ffb69a87fe1864f3ca4d4”,”grpseq”:”1”,”grpcnt”:”1”,”imgkey”:”t01a9fc7df1be324711.jpg”,”width”:”1024”,”height”:”683”,”title”:”\u9b41\u5317\u514b,\u52a0\u62ff\u5927”,”imgurl”:”http:\/\/m2.quanjing.com\/2m\/acp006\/acp50318.jpg”,”purl”:”http:\/\/www.quanjing.com\/imginfo\/acp50318.html”,”site”:”www.quanjing.com”,”imgsize”:”0”,”label”:””,”sitename”:”\u5168\u666f”,”siteid”:”1293354658”,”src”:”0”,”fnum”:”0”,”qhimg_thumb_width”:200,”qhimg_thumb_height”:133,”qhimg_downurl”:”https:\/\/dl.image.so.com\/d?imgurl=https%3A%2F%2Fp1.ssl.qhimgs1.com%2Ft01a9fc7df1be324711.jpg&purl=https%3A%2F%2Fimage.so.com%2F%3Fsrc%3Ddl.image&key=eab865d4ec”,”qhimg_url”:”https:\/\/p1.ssl.qhimgs1.com\/t01a9fc7df1be324711.jpg”,”qhimg_thumb”:”https:\/\/p1.ssl.qhimgs1.com\/sdr\/200_200
    \/t01a9fc7df1be324711.jpg”,”qhimg_qr_key”:”163dda74f0”,”tag”:”0”,”rdate”:”1367942400”,”ins_time”:”2013-05-08 00:00:00”,”dsptime”:””,”summary”:[],”pic_desc”:” \u7530\u56ed”},

    Spiders文件夹中iamges.py函数就写好了:
    scrapy框架爬虫_360摄影 - 图7


    别忘了在item.py对提取字段进行定义:

    scrapy框架爬虫_360摄影 - 图8
    接下来如果想把数据存在数据库中,还需要进行相应的配置,这里选择用mysql介绍,用MongoDB也是类似的操作。
    这个存储过程需要在pipelines.py文件中实现:
    主要是用python中pymysql连接上你的mysql数据库,中间主要是参数传递,方法很简单。
    scrapy框架爬虫_360摄影 - 图9

    最后就是在配置文件中添加上存数据以及爬取页数的设置就行了,不过要注意images360.pipelines.ImagePipelin、MysqlPipeline调用的顺序,先ImagePipelin对item下载进行筛选后,才用MysqlPipeline存储。
    最后第四步运行咯!

    得到结果如下:
    scrapy框架爬虫_360摄影 - 图10

    在mysql中:
    scrapy框架爬虫_360摄影 - 图11

    Scrapy下载速度是很快的:
    scrapy框架爬虫_360摄影 - 图12

    近1000张图片,3分钟搞定。想想上次爬妹子图片3w多张,爬了好几个小时…


    爬虫就写到这把,本来还有微博评论、豆瓣影评…
    理解不深,望见谅。



    Reference:
    1.《python3 网络爬虫开发实战》崔庆才