前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scrapy-Splash:学完秒变爬虫大佬

Scrapy-Splash:学完秒变爬虫大佬

作者头像
叫我阿柒啊
发布2022-12-18 16:36:54
1.2K0
发布2022-12-18 16:36:54
举报

前言

Scrapy-Splash的作用就是:「所见即所得」

开发爬虫的时候,因为网页中有数据动态加载(可参考之前文章)的部分,很多数据是后面渲染上的。爬虫程序只能爬取渲染前的数据,所以很多我们在网站上看到的数据,爬虫并不能直接获取。

而scrapy-splash担任了一个中间人的角色,程序通过splash服务请求网站,并获得splash返回的JS渲染后的网页。

原因

像selenium、phantomjs都是常用的渲染网页的工具。

就拿selenium来说,需要通过加载一个浏览器内核来进行渲染,效率有点低。而且与Scrapy集成需要实现一个downloder middleware,操作起来有些许的复杂,对我这种懒人来说简直折磨。

而scrapy-deltafetch的出现,仅仅几行配置就解决了这些问题。

安装

模块安装

安装scrapy-deltafetch模块。

代码语言:javascript
复制
pip3 install scrapy-splash

docker容器

这里首先要安装docker服务,然后执行命令拉取splash的镜像,启动容器即可。

代码语言:javascript
复制
docker pull scrapinghub/splash
docker run -d -p 8050:8050 scrapinghub/splash --disable-private-mode

拉取docker镜像:

开放8050端口,在浏览器输入你的ip:8050,访问到如下页面表示容器启动成功。

应用

配置

在settings.py中添加splash服务的参数。

代码语言:javascript
复制
SPLASH_URL = 'http://localhost:8050'
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

「SPLASH_URL」中的IP根据实际情况来填写。

请求

原本使用Request来请求网站,这里要修改成SplashRequst。

代码语言:javascript
复制
from scrapy_splash import SplashRequest
# 原本是yield Request()
yield SplashRequest()

这样,我们访问的url是先经过splash服务的。启动程序,查看日志。

测试

render

这里先在splash提供的页面上测试一把。

splash会请求这个网页的图片、js等,并会渲染后的网页返回给程序。

代码测试

对一个url同时进行普通请求和splash请求。

代码语言:javascript
复制
def start_requests(self):
    yield Request(url=self.start_urls[0], callback=self.parse)
    yield SplashRequest(url=self.start_urls[0], callback=self.parse_splash)

def parse(self, response):
    comment = response.css('div.at-feed-ellipsis__text::text').extract()
    print('Request', comment)

def parse_splash(self, response):
    comment = response.css('div.at-feed-ellipsis__text::text').extract()
    print('SplashRequest', comment)

同时对评论区进行爬取。运行结果如下:

上述样例仅用于学习用途。

结语

就我个人而言,依赖于插件总归不如自己去看看那些动态加载的API,分析之后可以直接模拟请求获取数据。

但是使用scrapy-splash会便利很多,也没有很高的技术门槛,所以还是值得一学的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 入门到放弃之路 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 原因
  • 安装
    • 模块安装
      • docker容器
      • 应用
        • 配置
          • 请求
          • 测试
            • render
              • 代码测试
              • 结语
              相关产品与服务
              容器镜像服务
              容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档