Scrapy_splash

1. 简介

1.1 定义

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

1.2 作用

  • scrapy-splash能够模拟浏览器加载js,并返回js运行后的数据,获取渲染的网页

1.3 文档

2. 使用

  1. 修改docker的镜像源,加快获取镜像
  • 创建并编辑docker的配置文件
sudo vi /etc/docker/daemon.json
  • 写入国内docker-cn.com的镜像地址配置后保存退出
{ 
"registry-mirrors": ["https://registry.docker-cn.com"] 
}
  • 重启电脑或docker服务后重新获取splash镜像
  1. 在正确安装docker的基础上pullsplash的镜像
sudo docker pull scrapinghub/splash
  1. 验证是否安装成功
  • 运行splashdocker服务,并通过浏览器访问8050端口验证安装是否成功

  • 前台运行

 sudo docker run -p 8050:8050 scrapinghub/splash
  • 后台运行
sudo docker run -d -p 8050:8050 scrapinghub/splash
  • 访问 http://127.0.0.1:8050 看到如下截图内容则表示成功

Splash安装成功

  1. 关闭splash服务
  • 需要先关闭容器后,再删除容器
sudo docker ps -a
sudo docker stop CONTAINER_ID
sudo docker rm CONTAINER_ID
  1. python虚拟环境中安装scrapy-splash
pip install scrapy-splash

3. 应用

需求:以某度为例
步骤:

  1. 创建项目创建爬虫
scrapy startproject test_splash
cd test_splash
scrapy genspider no_splash baidu.com
scrapy genspider with_splash baidu.com
  1. 完善settings.py配置文件
  • settings.py文件中添加splash的配置以及修改robots协议
# 渲染服务的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
  1. 不使用splash
  • spiders/no_splash.py中完善
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())
  1. 使用splash
  • spiders/with_splash.py中完善
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())
  1. 运行
  • 分别运行俩个爬虫
scrapy crawl no_splash
scrapy crawl with_splash
  • 观察获取的俩个html文件

  • 不使用splash

不使用splash

  • 使用splash

使用splash

3. 结论

  • splash类似selenium,能够像浏览器一样访问请求对象中的url地址
  • 能够按照该url对应的响应内容依次发送请求
  • 并将多次请求对应的多次响应内容进行渲染
  • 最终返回渲染后的response响应对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值