(10)分布式下的爬虫Scrapy应该如何做-关于动态内容js或者ajax处理(2)

    不知不觉这个系列就已经写到了第十篇,如果你跟着前面教程一步一步来,我想你对于scrapy的熟练的程度已经超过了很多人了,这个时候你可能会思考,如果我自己去写这样一个爬虫框架,我会怎么来写,如果是我,我对于队列,数据库的解析又应该怎么来处理呢。如果你能深入到这样的一个地步,我想你一定会进步很快,带着问题去学东西始终是最快的。好了,又啰嗦一些,我们进入今天的主题,关于js的解析。

   关于动态内容的解析,对于各个爬虫新手来说一直是一个山,因为自己没有思路,所以大部分时候都被这个大山挡住了前进的脚步(ps:如果你系统的做过web前端或者后端,对于学习爬虫会有十分大的帮助)

   通常来说,对于js的动态内容一般两种解法

分析请求的接口,得到数据直接操作(70%的情况可以这样操作)

   关于js的处理(一)

使用js的环境来处理

   这里,js的环境分为两种,一种是有界面的,一种是无界面的,有界面的可以参考selenium ,splinter 这些解决方案或多或少都会打开一个浏览器窗口,不利于进一步的操作。

   另外一种就是大名鼎鼎的phantomjs,应用很多,不过和scrapy结合不够紧密。那scrapy有没有官方的操作方式呢?答案显然有的

   先上github的地址:===>scrapyjs<====

   因为是基于splash:  ===>splash<====

 文档地址:===>doc for splash<===

  关于安装的过程,我就不安利了,按照官方提供的文档操作就可以了。(前提条件是你对docker有熟悉的感觉)

-d 是以fork的方式运行,–name指定容器名字,-p 绑定端口 ,ok,docker已经运行起来了,那我们怎么访问呢?别急,我们先看看docker 的ip地址是多少

 

然后我们直接访问http://192.168.59.103:8050/

可以看到scrapyjs服务已经起来了

 

比如你们一直想爬的微信数据的抓取方式,我们可以在render me里面直接输入URL:

http://weixin.sogou.com/weixin?type=2&query=%E4%BB%8A%E5%A4%A9&ie=utf8

 

然后出来的结果:

renderhtml

 

结果已经很明显的出来了,javascript render出来的内容,还能系统的反应出来统计的内容,根据内容我们可以进一步的过滤出来不要的内容,比如css,比如图片。

 

那在scrapy中我们怎么写呢?

 

直接上代码:

 

输出的结果:

 

这样是不是很方便的解决了javascript 各种麻烦?那有没有不方便的地方呢?当然有,你交给渲染引擎来操作这些内容 ,那就要速度与性能的损耗,如果在大规模的抓取中,就要考虑splash的集群了,单独的集群来解析这些动态内容。不用想,各大搜索引擎也是这样类似的做法,没有区别的。

 

点赞
  • 5555,这个生成不出来网易云的关注列表.而且一次载入要20-30s左右 QAQ,鱼哥,还有什么好办法么

  • sowork

    请问这个scrapy-splash在windows不能使用么?

    • hi,I'm frank

      可以,因为可以基于docker ,而docker 是可以跨平台的。

  • sowork

    我按照教程上的安装了,anaconda找不到对应的包,pip能安装,但是docker run...不能运行,跟python的版本有关系么

    • sowork

      docker是个软件需要另外安装么?

      • sowork

        求教程发布顺带写下运行环境和软件,,,,Thank you

        • hi,I'm frank

          我在win和ubuntu都正常跑过了,docker用最新的就可以, download镜像就可以正常使用。

      • hi,I'm frank
  • conkang

    你好 scrapy-splash 做分布式爬虫,scrapy-splash 只提供渲染功能 ,还是提工渲染加网络请求,也就是说目前网站识别到的是爬虫的IP还是docker服务器的IP

    • bruce

      你看请求的顺序 A->B(渲染和再次请求)->网站 ,所以网站拿到的就是B的IP,B对外只有一个IP,就是他本机的IP

      • conkang

        相当于部署scrapy-splash的机器是代理服务器哈

        • bruce

          嗯,正解,渲染的是独立的IP

  • simon

    ± |master ✓| → boot2docker ip
    192.168.59.103

    这个命令 MacOS 上没有。我跑起来后直接是 127.0.0.1

    • bruce

      早期的docker 在mac上运行是以vm 为载体运行的,所以这个ip是老版本的做法。