Scrapy-Splash的介绍安装以及实例

Posted jclian91

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scrapy-Splash的介绍安装以及实例相关的知识,希望对你有一定的参考价值。

scrapy-splash的介绍

  在前面的博客中,我们已经见识到了Scrapy的强大之处。但是,Scrapy也有其不足之处,即Scrapy没有JS engine, 因此它无法爬取javascript生成的动态网页,只能爬取静态网页,而在现代的网络世界中,大部分网页都会采用JavaScript来丰富网页的功能。所以,这无疑Scrapy的遗憾之处。
  那么,我们还能愉快地使用Scrapy来爬取动态网页吗?有没有什么补充的办法呢?答案依然是yes!答案就是,使用scrapy-splash模块
  scrapy-splash模块主要使用了Splash. 所谓的Splash, 就是一个Javascript渲染服务。它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT。Twisted(QT)用来让服务具有异步处理能力,以发挥webkit的并发能力。Splash的特点如下:

  • 并行处理多个网页
  • 得到html结果以及(或者)渲染成图片
  • 关掉加载图片或使用 Adblock Plus规则使得渲染速度更快
  • 使用JavaScript处理网页内容
  • 使用Lua脚本
  • 能在Splash-Jupyter Notebooks中开发Splash Lua scripts
  • 能够获得具体的HAR格式的渲染信息

scrapy-splash的安装

  由于Splash的上述特点,使得Splash和Scrapy两者的兼容性较好,抓取效率较高。
  听了上面的介绍,有没有对scrapy-splash很心动呢?下面就介绍如何安装scrapy-splash,步骤如下:
  1. 安装scrapy-splash模块

pip3 install scrapy-splash

  2. scrapy-splash使用的是Splash HTTP API, 所以需要一个splash instance,一般采用docker运行splash,所以需要安装docker。不同系统的安装命令会不同,如笔者的CentOS7系统的安装方式为:

sudo yum install docker

安装完docker后,可以输入命令‘docker -v’来验证docker是否安装成功。

  3. 开启docker服务,拉取splash镜像(pull the image):

sudo service docker start
sudo dock pull scrapinghub/splash

运行结果如下:

  4. 开启容器(start the container):

sudo docker run -p 8050:8050 scrapinghub/splash

此时Splash以运行在本地服务器的端口8050(http).在浏览器中输入\'localhost:8050\', 页面如下:

在这个网页中我们能够运行Lua scripts,这对我们在scrapy-splash中使用Lua scripts是非常有帮助的。以上就是我们安装scrapy-splash的全部。

scrapy-splash的实例

  在安装完scrapy-splash之后,不趁机介绍一个实例,实在是说不过去的,我们将在此介绍一个简单的实例,那就是利用百度查询手机号码信息。比如,我们在百度输入框中输入手机号码‘159********’,然后查询,得到如下信息:

我们将利用scrapy-splash模拟以上操作并获取手机号码信息。

  1. 创建scrapy项目phone
  2. 配置settings.py文件,配置的内容如下:

ROBOTSTXT_OBEY = False

SPIDER_MIDDLEWARES = {
    \'scrapy_splash.SplashDeduplicateArgsMiddleware\': 100,
}

DOWNLOADER_MIDDLEWARES = {
    \'scrapy_splash.SplashCookiesMiddleware\': 723,
    \'scrapy_splash.SplashMiddleware\': 725,
    \'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware\': 810
}

SPLASH_URL = \'http://localhost:8050\'

DUPEFILTER_CLASS = \'scrapy_splash.SplashAwareDupeFilter\'
HTTPCACHE_STORAGE = \'scrapy_splash.SplashAwareFSCacheStorage\'

具体的配置说明可以参考:  https://pypi.python.org/pypi/scrapy-splash .

  3. 创建爬虫文件phoneSpider.py, 代码如下:

# -*- coding: utf-8 -*-
from scrapy import Spider, Request
from scrapy_splash import SplashRequest

# splash lua script
script = """
         function main(splash, args)
             assert(splash:go(args.url))
             assert(splash:wait(args.wait))
             js = string.format("document.querySelector(\'#kw\').value=%s;document.querySelector(\'#su\').click()", args.phone)
             splash:evaljs(js)
             assert(splash:wait(args.wait))
             return splash:html()
         end
         """

class phoneSpider(Spider):
    name = \'phone\'
    allowed_domains = [\'www.baidu.com\']
    url = \'https://www.baidu.com\'
    
    # start request
    def start_requests(self):
        yield SplashRequest(self.url, callback=self.parse, endpoint=\'execute\', args={\'lua_source\': script, \'phone\':\'159*******\', \'wait\': 5})
   
    # parse the html content 
    def parse(self, response):
        info = response.css(\'div.op_mobilephone_r.c-gap-bottom-small\').xpath(\'span/text()\').extract()
        print(\'=\'*40)
        print(\'\'.join(info))
        print(\'=\'*40)

  4. 运行爬虫,scrapy crawl phone, 结果如下:

  实例展示到此结束,欢迎大家访问这个项目的Github地址:  https://github.com/percent4/phoneSpider .当然,有什么问题,也可以载下面留言评论哦~~

以上是关于Scrapy-Splash的介绍安装以及实例的主要内容,如果未能解决你的问题,请参考以下文章

[Python3网络爬虫开发实战] 1.8.3-Scrapy-Splash的安装

17.docker及scrapy-splash安装-1

Docker的安装和scrapy-splash的安装

scrapy-splash抓取动态数据例子六

scrapy-splash抓取动态数据例子八

scrapy-splash抓取动态数据例子五