为什么要学习Splash?

我们经常使用scrapy框架编写爬虫代码,站在巨人的肩膀上感觉很好,但是一旦遇到网站用JavaScript动态渲染,scrapy就显得有些力不从心了,我们了解的selenium可以完成动态加载,返回浏览器渲染后的页面,今天我们不讲selenium,Scrapy-Splash(是一个Scrapy中支持JavaScript渲染的工具)同样可以完成这件事,下面我们来说说Splash如何与Scrapy进行对接。

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

准备工作
  • 安装:https://splash.readthedocs.io/en/stable/install.html
    Scrapy-Splash 会使用Splash的HTTP API 进行页面渲染,所以我们需要安装Splash,这里需要通过Docker安装

Linux + Docker

  • Install Docker
  • Pull the image:

sudo docker pull scrapinghub/splash

  • Start the container:

sudo docker run -it -p 8050:8050 scrapinghub/splash

OS X + Docker

  • Install Docker for Mac (see https://docs.docker.com/docker-for-mac/).

  • Pull the image:

docker pull scrapinghub/splash

  • Start the container:

docker run -it -p 8050:8050 scrapinghub/splash

运行完毕后在浏览器中打开地址:http://0.0.0.0:8050 出现如下界面

安装scrapy-splash

pip3 install scrapy-splash

使用对比
step1: 使用scrapy创建项目:
  • 设置文件中修改如下:
# Obey robots.txt rules
ROBOTSTXT_OBEY = FalseDEFAULT_REQUEST_HEADERS = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
}
  • 爬虫文件中代码如下:
import scrapyclass SplashspiderSpider(scrapy.Spider):name = 'splashSpider'allowed_domains = ['douban.com']start_urls = ['https://movie.douban.com/subject_search?search_text=%E6%88%90%E9%BE%99&cat=1002']def parse(self, response):print(response.status,response.url)with open('page.html','w') as file:file.write(response.text)

将响应结果存储到本地后并没有页面展示的元数据

step2: 使用scrapy-splash完成请求
  • 在settings.py文件中,你需要额外的填写下面的一些内容:
# 渲染服务的url(本地或者远端服务器ip)
SPLASH_URL = 'http://127.0.0.1:8050'# 设置爬虫中间件
SPIDER_MIDDLEWARES = {#'splashpeoject.middlewares.SplashpeojectSpiderMiddleware': 543,'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}#设置相关下载器中间件
#这里配置了三个下载中间件( DownloadMiddleware),是scrapy-splash的核心部分,我们不需要
#像对接selenium那样自己定制中间件,scrapy-splash已经为我们准备好了,直接配置即可
DOWNLOADER_MIDDLEWARES = {#'splashpeoject.middlewares.SplashpeojectDownloaderMiddleware': 543,'scrapy_splash.SplashCookiesMiddleware': 723,'scrapy_splash.SplashMiddleware': 725,'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}# 配置去重组件类DUPEFILTER_CLASS
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
# 使用Splash的Http缓存
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
  • 在爬虫代码文件中做如下修改:
# -*- coding: utf-8 -*-
import scrapy
from scrapy_splash import SplashRequest,SplashFormRequestclass SplashspiderSpider(scrapy.Spider):name = 'splashSpider'allowed_domains = ['douban.com']start_urls = ['https://movie.douban.com/subject_search?search_text=%E6%88%90%E9%BE%99&cat=1002']def start_requests(self):for url in self.start_urls:#SplashRequest对象,前两个参数依然是请求的URL和回调函数。另外我们还可以#通过args传递一些渲染参数,例如等待时间wait等,还可以根据endpoint参数指定渲#染接口。更多参数可以参考文档说明:https://github.com/scrapy-plugins/scrapy-#splash#requests。yield SplashRequest(url=url,callback=self.parse,meta={'title':'xxxx'},args={'wait':1,})def parse(self, response):print(response.status,response.url,response.meta)with open('page.html','w') as file:file.write(response.text)

完成以上基本代码我们就可以使用Splash来抓取页面了,这里我们使用创建
SplashRequest对象构建请求,scrapy会将此请求转发给Splash,Splash对页面进行渲染,然后将渲染后的页面返回给spider进行解析即可。

在Spider里用SplashRequest对接Lua脚本,构建请求
  • 比如我们需要在页面加载出来后,自动点击下一页,则需要执行响应的js代码
# -*- coding: utf-8 -*-
import scrapy
from scrapy_splash import SplashRequest,SplashFormRequestclass SplashspiderSpider(scrapy.Spider):name = 'splashSpider'allowed_domains = ['douban.com']start_urls = ['https://movie.douban.com/subject_search?search_text=%E6%88%90%E9%BE%99&cat=1002']script = """function main(splash,args)splash.images_enabled = falseassert(splash:go(args.url))assert(splash:wait(args.wait))js = "document.querySelector('a.next').click()"splash:evaljs(js)assert(splash:wait(args.wait))return splash:html()end"""def start_requests(self):for url in self.start_urls:yield SplashRequest(url,callback=self.parse,endpoint='execute',args={'wait':1,'lua_source':self.script})def parse(self, response):print(response.status,response.url,response.meta,response.request.headers)with open('page.html','w') as file:file.write(response.text)

关于scrapy-splash使用以及如何设置代理ip

  • 方式一:现在我们需要给我们的scrapy添加代理中间件middlewares
class ProxyMiddleware(object):def process_request(self, request, spider):request.meta['splash']['args']['proxy'] = proxyServerproxy_user_pass = "USERNAME:PASSWORD"encoded_user_pass = base64.encodestring(proxy_user_pass)request.headers["Proxy-Authorization"] = 'Basic ' + encoded_user_pass

注意:这里我们需要注意的是设置代理不再是

request.meta[‘proxy’] = proxyServer而是request.meta[‘splash’] [‘args’][‘proxy’] = proxyServer

  • 方式二:在构造请求的时候设置代理
def start_requests(self):for url in self.start_urls:yield SplashRequest(url,url=url,callback=self.parse,args={'wait': 5,'proxy': 'http://proxy_ip:proxy_port'}
===============================================
splash+requests get请求示例
import requests
def splash_render(url):splash_url = "http://localhost:8050/render.html"args = {"url":url,"timeout": 5,"image": 0}headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',}response = requests.get(splash_url, params=args,headers=headers)return response.textif __name__ == '__main__':url = "https://movie.douban.com/subject_search?search_text=%E6%88%90%E9%BE%99&cat=1002"html = splash_render(url)with open('page1.html', 'w') as file:file.write(html)

args参数说明:

  • url: 需要渲染的页面地址
  • timeout: 超时时间
  • proxy:代理
  • wait:等待渲染时间
  • images: 是否下载,默认1(下载)
  • js_source: 渲染页面前执行的js代码

Splash其他参考文献:

https://www.cnblogs.com/lmx123/p/9989915.html

splash+requests get请求示例

https://blog.csdn.net/mouday/article/details/82843401

scrapy中关于Splash的使用相关推荐

  1. Scrapy中的splash的安装应用

    Scrapy中的splash的安装应用 因为要去抓取部分经过JavaScript渲染的网页数据,所以使用scrapy中的Request返回的是没有经过渲染的网页代码, 因此我们就要运用Scrapy中的 ...

  2. Scrapy爬虫框架(实战篇)【Scrapy框架对接Splash抓取javaScript动态渲染页面】

    (1).前言 动态页面:HTML文档中的部分是由客户端运行JS脚本生成的,即服务器生成部分HTML文档内容,其余的再由客户端生成 静态页面:整个HTML文档是在服务器端生成的,即服务器生成好了,再发送 ...

  3. 三十六、Scrapy 中的复写默认管道和Rule扩展

    @Author:Runsen scrapy中的强大媒体管道(二) 上文用scrapy 爬百度美女图片,补充如何重写默认管道知识点,当年爬取的网站是:http://www.27270.com/.但是这里 ...

  4. 三十五、Scrapy 中的杂知识总结和代理池的编写

    @Author:Runsen 上次 用scrapy爬了腾讯招聘网站,有两个job.json 和detail.json,针对一个item,其实有更简单的处理方法. 今天讲讲scrapy 中的杂知识,做一 ...

  5. 三十三、Scrapy中的强大媒体管道ImagesPipeline

    @Author:Runsen 三十一.Scrapy爬取百度图片 上文用了scrapy爬取了百度的美女图片,今天写写scrapy中的Image Pipeline. scrapy提供了很多中间组件可以让我 ...

  6. Scrapy框架的学习(9.Scrapy中的CrawlSpider类的作用以及使用,实现优化的翻页爬虫)

    1.CrawlSpider类通过一些规则(rules),使对于链接(网页)的爬取更具有通用性, 换句话说,CrawlSpider爬虫为通用性的爬虫, 而Spider爬虫更像是为一些特殊网站制定的爬虫. ...

  7. Scrapy框架的学习(7. 了解Scrapy中的debug信息以及Scrapy shell的使用)

    认识程序中的debug信息 https://blog.csdn.net/wei18791957243/article/details/86157707  这个博客里写了,怎么关闭这些debug信息 因 ...

  8. Scrapy中Request的回调函数不执行

    一. 举例 def parse(self, response):...yield Request(url=parse.urljoin(response.url, title_herf), meta=m ...

  9. MFC中添加Splash Screen

    1.  新建一个MFC项目SDI或MDI. 2.  新建或导入一个ID为IDB_SPLASH的位图. 3.  添加现有项SplashWnd.h和SplashWnd.cpp. SplashWnd.h源代 ...

最新文章

  1. python-装饰器实现pv-uv
  2. STM32F0xx_SPI读写(Flash)配置详细过程
  3. PetShop 中的字符串过滤
  4. HDU 3081Marriage Match II(二分法+并检查集合+网络流量的最大流量)
  5. IT技术人终究要走上管理职位吗?
  6. php替换局部大小写字母,php替换字符串中的一些字符(区分大小写)的函数str_replace()...
  7. 无线网卡的Master,Managed,ad-hoc,monitor模式
  8. Centos 6.3中安装KVM
  9. java大数阶乘_Java大数阶乘
  10. RestClient的简单介绍
  11. magisk核心功能模式是什么_HRT-Lin-荣耀V9 B347 自动接听Xposed 机型 Magisk 桌面设置 dpi等功能...
  12. qq西游服务器制作教程,QQ西游修罗版开区一键服务端+完整客户端+GM辅助工具+教程...
  13. wireshark推荐书籍
  14. 数据泄露,数据防泄密该怎么做?
  15. Filler Cell 与 Metal Fill差异
  16. 【Windows】怎么查看CUDA版本?Conda命令安装和NVIDIA官网安装包安装的CUDA有何区别?nvcc -V和nvidia-smi获得的CUDA版本有何区别?如何指定CUDA版本?
  17. 【数据结构】 八大排序实现简析+复杂度及稳定性分析
  18. qt vs中引用pri文件的问题
  19. 糗事百科 android源码,Android高仿糗事百科(含服务端)
  20. curl_操作nuetron下的mysql数据(资源数据)

热门文章

  1. 修复iis解析漏洞_修复典型的iis 10漏洞并进行安全审核
  2. 我不想忘记,我经历过的每一天都重要无比
  3. 跨境电商万圣节社媒营销:8个方法助你冲出重围
  4. java编写数字游戏大全_Java编写猜数字小游戏
  5. linux如何退出,Linux退出命令为初学者解释(附例)
  6. iPad使用iTunes下载慢
  7. 架构师的软实力之治理、技术诀窍
  8. 分页插件 - PageHelper的介绍和使用
  9. ZZNUOJ_C语言1112:进制转换(函数专题)(完整代码)
  10. 微信怎么发文字朋友圈?简单快捷的方法,只需1分钟