前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python爬虫之scrapy_splash组件的使用

Python爬虫之scrapy_splash组件的使用

作者头像
海仔
发布2020-09-28 14:21:37
1.8K0
发布2020-09-28 14:21:37
举报
文章被收录于专栏:海仔技术驿站

scrapy_splash组件的使用

学习目标
  1. 了解 scrapy_splash组件的作用
  2. 了解 scrapy_splash组件的使用

1. 什么是scrapy_splash?

scrapy_splash是scrapy的一个组件

  • scrapy-splash加载js数据是基于Splash来实现的。
  • Splash是一个Javascript渲染服务。它是一个实现了HTTP API的轻量级浏览器,Splash是用Python和Lua语言实现的,基于Twisted和QT等模块构建。
  • 使用scrapy-splash最终拿到的response相当于是在浏览器全部渲染完成以后的网页源代码。

splash官方文档 https://splash.readthedocs.io/en/stable/

2. scrapy_splash的作用

scrapy-splash能够模拟浏览器加载js,并返回js运行后的数据

3. scrapy_splash的环境安装

3.1 使用splash的docker镜像

splash的dockerfile https://github.com/scrapinghub/splash/blob/master/Dockerfile

观察发现splash依赖环境略微复杂,所以我们可以直接使用splash的docker镜像

如果不使用docker镜像请参考 splash官方文档 安装相应的依赖环境

3.1.1 安装并启动docker服务

安装参考 https://blog.csdn.net/sanpic/article/details/81984683

3.1.2 获取splash的镜像

在正确安装docker的基础上pull取splash的镜像

sudo docker pull scrapinghub/splash

3.1.3 验证是否安装成功

运行splash的docker服务,并通过浏览器访问8050端口验证安装是否成功

  • 前台运行 sudo docker run -p 8050:8050 scrapinghub/splash
  • 后台运行 sudo docker run -d -p 8050:8050 scrapinghub/splash

访问 http://127.0.0.1:8050 看到如下截图内容则表示成功

3.1.4 解决获取镜像超时:修改docker的镜像源

以ubuntu18.04为例

  1. 创建并编辑docker的配置文件

sudo vi /etc/docker/daemon.json

  1. 写入国内docker-cn.com的镜像地址配置后保存退出
代码语言:javascript
复制
{ 
"registry-mirrors": ["https://registry.docker-cn.com"] 
}
  1. 重启电脑或docker服务后重新获取splash镜像
  2. 这时如果还慢,请使用手机热点(流量orz)
3.1.5 关闭splash服务

需要先关闭容器后,再删除容器

代码语言:javascript
复制
sudo docker ps -a
sudo docker stop CONTAINER_ID
sudo docker rm CONTAINER_ID
3.2 在python虚拟环境中安装scrapy-splash包

pip install scrapy-splash

4. 在scrapy中使用splash

以baidu为例

4.1 创建项目创建爬虫
代码语言:javascript
复制
scrapy startproject test_splash
cd test_splash
scrapy genspider no_splash baidu.com
scrapy genspider with_splash baidu.com
4.2 完善settings.py配置文件

在settings.py文件中添加splash的配置以及修改robots协议

代码语言:javascript
复制
# 渲染服务的url
SPLASH_URL = 'http://127.0.0.1:8050'
# 下载器中间件
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
# 去重过滤器
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
# 使用Splash的Http缓存
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False
4.3 不使用splash

在spiders/no_splash.py中完善

代码语言:javascript
复制
import scrapy


class NoSplashSpider(scrapy.Spider):
    name = 'no_splash'
    allowed_domains = ['baidu.com']
    start_urls = ['https://www.baidu.com/s?wd=13161933309']

    def parse(self, response):
        with open('no_splash.html', 'w') as f:
            f.write(response.body.decode())
4.4 使用splash
代码语言:javascript
复制
import scrapy
from scrapy_splash import SplashRequest # 使用scrapy_splash包提供的request对象

class WithSplashSpider(scrapy.Spider):
    name = 'with_splash'
    allowed_domains = ['baidu.com']
    start_urls = ['https://www.baidu.com/s?wd=13161933309']

    def start_requests(self):
        yield SplashRequest(self.start_urls[0],
                            callback=self.parse_splash,
                            args={'wait': 10}, # 最大超时时间,单位:秒
                            endpoint='render.html') # 使用splash服务的固定参数

    def parse_splash(self, response):
        with open('with_splash.html', 'w') as f:
            f.write(response.body.decode())
4.5 分别运行俩个爬虫,并观察现象
4.5.1 分别运行俩个爬虫
代码语言:javascript
复制
scrapy crawl no_splash
scrapy crawl with_splash
4.5.2 观察获取的俩个html文件

不使用splash

使用splash

4.6 结论
  1. splash类似selenium,能够像浏览器一样访问请求对象中的url地址
  2. 能够按照该url对应的响应内容依次发送请求
  3. 并将多次请求对应的多次响应内容进行渲染
  4. 最终返回渲染后的response响应对象

5. 了解更多

关于splash https://www.cnblogs.com/zhangxinqi/p/9279014.html

关于scrapy_splash(截屏,get_cookies等) https://www.e-learn.cn/content/qita/800748


小结

  1. scrapy_splash组件的作用
    1. splash类似selenium,能够像浏览器一样访问请求对象中的url地址
    2. 能够按照该url对应的响应内容依次发送请求
    3. 并将多次请求对应的多次响应内容进行渲染
    4. 最终返回渲染后的response响应对象
  2. scrapy_splash组件的使用
    1. 需要splash服务作为支撑
    2. 构造的request对象变为splash.SplashRequest
    3. 以下载中间件的形式使用
    4. 需要scrapy_splash特定配置
  3. scrapy_splash的特定配置 SPLASH_URL = 'http://127.0.0.1:8050' DOWNLOADER_MIDDLEWARES = { 'scrapy_splash.SplashCookiesMiddleware': 723, 'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, } DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter' HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/09/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • scrapy_splash组件的使用
    • 1. 什么是scrapy_splash?
      • 2. scrapy_splash的作用
        • 3. scrapy_splash的环境安装
          • 3.1 使用splash的docker镜像
          • 3.2 在python虚拟环境中安装scrapy-splash包
        • 4. 在scrapy中使用splash
          • 4.1 创建项目创建爬虫
          • 4.2 完善settings.py配置文件
          • 4.3 不使用splash
          • 4.4 使用splash
          • 4.5 分别运行俩个爬虫,并观察现象
          • 4.6 结论
        • 5. 了解更多
        • 小结
        相关产品与服务
        容器镜像服务
        容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档