前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫课堂(二十三)|使用Splash爬取动态页面(1)

爬虫课堂(二十三)|使用Splash爬取动态页面(1)

作者头像
黄小怪
发布2018-05-21 17:36:55
2.3K0
发布2018-05-21 17:36:55
举报
文章被收录于专栏:小怪聊职场

在之前的章节中,爬取的都是静态页面中的信息,随着越来越多的网站开始用JS在客户端浏览器动态渲染网站,导致很多需要的数据并不能在原始的HTML中获取,再加上Scrapy本身并不提供JS渲染解析的功能,那么如何通过Scrapy爬取动态网站的数据呢?这一章节我们将学习这些知识。 通常对这类网站数据的爬取采用如下两种方法:

  • 通过分析网站,找到对应数据的接口,模拟接口去获取需要的数据(一般也推荐这种方式,毕竟这种方式的效率最高),但是很多网站的接口隐藏的很深,或者接口的加密非常复杂,导致无法获取到它们的数据接口,此种方法很可能就行不通。
  • 借助JS内核,将获取到的含有JS脚本的页面交由JS内核去渲染,最后将渲染后生成的HTML返回给Scrapy解析,Splash是Scrapy官方推荐的JS渲染引擎,它是使用Webkit开发的轻量级无界面浏览器,提供基于HTML接口的JS渲染服务。

一、搭建Splash服务 如何在Scrapy中调用Splash服务?Python库的scrapy-splash是一个非常好的选择,下面就来讲解如何使用scrapy-splash。

  • 利用pip安装scrapy-splash库: $ pip install scrapy-splash
  • scrapy-splash使用的是Splash HTTP API,所以需要一个splash instance,一般采用docker运行splash,所以需要安装docker: $ sudo apt-get install docker 如果是Mac的话需要使用brew安装,如下:
代码语言:javascript
复制
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
$ brew install docker
  • 拉取镜像: $ sudo docker pull scrapinghub/splash 如果出现如下错误时,说明已确定Docker本身已经安装正常。
代码语言:javascript
复制
Using default tag: latest
Warning: failed to get default registry endpoint from daemon (Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?). Using system default: https://index.docker.io/v1/
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

问题原因是因为docker服务没有启动,在相应的/var/run/ 路径下找不到docker的进程。 执行service docker start命令,启动docker服务。

  • 使用docker开启Splash服务: $ sudo docker run -p 8050:8050 scrapinghub/splash
  • 在项目配置文件settings.py中配置splash服务: 1)添加splash服务器地址: SPLASH_URL = 'http://localhost:8050' 2)将splash middleware添加到DOWNLOADER_MIDDLEWARE中:
代码语言:javascript
复制
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}

3)支持cache_args(可选):

代码语言:javascript
复制
SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}

4)设置去重过滤器: DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter' 二、使用Splash服务 Splash功能丰富,包含多个服务端点,最常用的有两个端点:

  • render.html 提供JS页面渲染服务。
  • execute 执行用户自定义的渲染脚本,利用该端点可在页面中执行JS代码。

举一个简单的例子,使用scrapy_splash.SplashRequest渲染JS请求,如下:

代码语言:javascript
复制
import scrapy
from scrapy_splash import SplashRequest

class MySpider(scrapy.Spider):
    # 假设这个请求的页面数据是需要执行JS才能爬取的
    start_urls = ["http://example.com"]

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url, self.parse, args={'images':0,'timeout': 5})

    def parse(self, response):
        # ...        

上述代码中,用户只需使用scrapy_splash.SplashRequest替代scrapy.Request提交请求即可完成JS渲染,并且在SplashRequest的构造器中无须传递endpoint参数,因为该参数默认值就是‘render.html’。 下面介绍下SplashRequest构造器方法中的一些常用参数。

  • url 与scrapy.Request中的url相同,也就是待爬取页面的url。
  • headers 与scrapy.Request中的headers相同。
  • cookies 与scrapy.Request中的cookies相同。
  • args 传递给Splash的参数,如wait(等待时间)、timeout(超时时间)、images(是否禁止加载图片,0禁止,1不禁止)等。
  • endpoint Splash服务端点,默认为‘render.html’,即JS页面渲染服务。
  • splash_url Splash服务器地址,默认为None,即使用settings.py配置文件中的SPLASH_URL = 'http://localhost:8050' 三、项目实战 放在下一章节讲解
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.03.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档