scrapy_splash基本使用

十、scrapy_splash

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

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

3.scrapy_splash的环境安装
3.1 使用splash的docker镜像

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

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

或者直接去splash的官方文档安装环境

3.1.1 安装并启动docker服务

https://blog.csdn.net/sanpic/article/details/81984683

3.1.2 获取splash的镜像

sudo docker pull scrapinghub/splash

3.1.3 验证

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

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

访问http://127.0.0.1:8050 看到splash即成功

3.2 关闭splash服务

sudo docker ps -a

sudo docker stop ID

sudo docker rm ID

3.3. pip install scrapy-splash
4.在scrapy中使用splash
4.1 创建项目创建爬虫
scrpay startproject test_splash
cd test_splash
scrapy genspider with_splash baidu.com
4.2 完善settings.py配置文件

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

# 渲染服务的url
SPLASH_URL = 'http://127.0.0.1:8050'
# 下载器中间件
DOWNLOADER_MIDDLEWARLES = {
    '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_OBBEY = False
4.3 使用splash
import scrapy
from scrapy_splash import SplashRequest

class WithSplashSpider(scrapy.Spider):
    name = 'with_splash'
    allowed_domains = ['baidu.com']
    start_urls = ['https://www.baidu.com/s?wd=15041890909']
    
    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.writer(response.body.decode())
            
4.4 总结
  • splash类似selenium,能够像浏览器一样访问请求对象中的ur地址
  • 能够按照该url对应的响应内容依次发送请求
  • 并将多次请求对应的多次响应内容进行渲染
  • 最终返回选然后的response响应对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值