热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【爬虫进阶JS自动渲染】Scrapy_splash组件的使用

原标题:【爬虫进阶-JS自动渲染】Scrapy_splash组件的使用Scrapy_splash组件的使用

原标题:【爬虫进阶-JS自动渲染】Scrapy_splash组件的使用


Scrapy_splash组件的使用



  • 1. 什么是scrapy_splash?

  • 2. scrapy_splash的作用

  • 3. scrapy_splash的环境安装


    • 3.1 使用splash的docker镜像


      • 3.1.1 安装并启动docker服务

      • 3.1.2 获取splash的镜像

      • 3.1.3 验证是否安装成功

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

      • 3.1.5 关闭splash服务


    • 3.2 在python虚拟环境中安装scrapy-splash包


  • 4. 文章来源站点https://www.yii666.com/在scrapy中使用splash


    • 4.1 创建项目创建爬虫

    • 4.2 完善settings.py配置文件

    • 4.3 不使用splash

    • 4.4 使用splash

    • 4.5 分别运行俩个爬虫,并观察现象


      • 4.5.1 分别运行俩个爬虫

      • 4.5.2 观察获取的俩个html文件


    • 4.6 结论


  • 5. 了解更多

  • 6. 小结






1. 什么是scrapy_splash?

scrapy_splashscrapy的一个组件


  • 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的镜像地址配置后保存退出

{
"registry-mirrors": ["https://registry.docker-cn.com"]
}


  1. 重启电脑或docker服务后重新获取splash镜像


  2. 这时如果还慢,请使用手机热点(流量orz)




3.1.5 关闭splash服务


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

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 创建项目创建爬虫

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协议

# 渲染服务的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中完善

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

import scrapy
from sc文章来源地址50236.htmlrapy_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 分别运行俩个爬虫

scrapy crawl no_splash
scrapy crawl with_splash


4.5.2 观察获取的俩个html文件

不使用splash

在这里插入图片描述

使用splash

在这里插入图片描述


4.6 结论



  1. splash类似selenwww.yii666.comium,能够像浏览器一样访问请求对象中的url地址

  2. 能够按照该url对应的响应内容依次发送请求

  3. 并将多次请求对应的多次响应内容进行渲染

  4. 最终返回渲染后的response响应对象



5. 了解更多

关于splash https://www.cnblogs.c文章来源地址50236.htmlom/zhangxinqi/p/9279014.html


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





6. 小结

  1. scrapy_splash组件的作用


    1. splaswww.yii666.comh类似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'




来源于:【爬虫进阶-JS自动渲染】Scrapy_splash组件的使用


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • mui框架offcanvas侧滑超出部分隐藏无法滚动如何解决
    web前端|js教程off-canvas,部分,超出web前端-js教程mui框架中off-canvas侧滑的一个缺点就是无法出现滚动条,因为它主要用途是设置类似于qq界面的那种格 ... [详细]
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • ORACLE空间管理实验5:块管理之ASSM下高水位的影响
    数据库|mysql教程ORACLE,空间,管理,实验,ASSM,下高,水位,影响,数据库-mysql教程易语言黑客软件源码,vscode左侧搜索,ubuntu怎么看上一页,ecs搭 ... [详细]
  • 电脑f5键是什么作用
    常见问题f5常见问题韩亚整形医院源码,vscode写前端代码,ubuntu低配,tomcat下载路径乱码,爬虫_gscu,php精粹pdf,广州快速seo优化排名,aspwap网站 ... [详细]
  • yii2 绑定框架事件
    后端开发|php教程php,yii2后端开发-php教程我想要添加自定义代码处理yii2框架的Application::EVENT_BEFORE_REQUEST时触发的事件,但是不 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Django学习笔记之djangodebugtoolbar使用指南
    介绍django-debug-toolbar是一组可配置的面板,可显示有关当前请求响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息。github地址文档地址安装配置1. ... [详细]
  • 以数据驱动品牌,为出海强势护航
                    原创
    原标题:以数 ... [详细]
  • 智商狂飙,问了ChatGPT几个数据库问题后,我的眼镜掉了
    原标题:智商狂飙,问了ChatGPT几个数据库问题后,我的眼镜掉了最近,ChatGPT火爆全网,介绍其产品、公司、作者、技术和应用等方面信息,占据着整个互联网,似乎不谈GPT好像 ... [详细]
  • 直击热门考点——结构体内存对齐
    原标题:直击热门考点——结构体内存对齐文章目录前言一、引例 ... [详细]
  • MySQL 的 NULL 值是怎么存储的?
    MySQL 的 NULL 值是怎么存储的? ... [详细]
author-avatar
点燃半吱煙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有