scrapy中关于Splash的使用
为什么要学习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的使用相关推荐
- Scrapy中的splash的安装应用
Scrapy中的splash的安装应用 因为要去抓取部分经过JavaScript渲染的网页数据,所以使用scrapy中的Request返回的是没有经过渲染的网页代码, 因此我们就要运用Scrapy中的 ...
- Scrapy爬虫框架(实战篇)【Scrapy框架对接Splash抓取javaScript动态渲染页面】
(1).前言 动态页面:HTML文档中的部分是由客户端运行JS脚本生成的,即服务器生成部分HTML文档内容,其余的再由客户端生成 静态页面:整个HTML文档是在服务器端生成的,即服务器生成好了,再发送 ...
- 三十六、Scrapy 中的复写默认管道和Rule扩展
@Author:Runsen scrapy中的强大媒体管道(二) 上文用scrapy 爬百度美女图片,补充如何重写默认管道知识点,当年爬取的网站是:http://www.27270.com/.但是这里 ...
- 三十五、Scrapy 中的杂知识总结和代理池的编写
@Author:Runsen 上次 用scrapy爬了腾讯招聘网站,有两个job.json 和detail.json,针对一个item,其实有更简单的处理方法. 今天讲讲scrapy 中的杂知识,做一 ...
- 三十三、Scrapy中的强大媒体管道ImagesPipeline
@Author:Runsen 三十一.Scrapy爬取百度图片 上文用了scrapy爬取了百度的美女图片,今天写写scrapy中的Image Pipeline. scrapy提供了很多中间组件可以让我 ...
- Scrapy框架的学习(9.Scrapy中的CrawlSpider类的作用以及使用,实现优化的翻页爬虫)
1.CrawlSpider类通过一些规则(rules),使对于链接(网页)的爬取更具有通用性, 换句话说,CrawlSpider爬虫为通用性的爬虫, 而Spider爬虫更像是为一些特殊网站制定的爬虫. ...
- Scrapy框架的学习(7. 了解Scrapy中的debug信息以及Scrapy shell的使用)
认识程序中的debug信息 https://blog.csdn.net/wei18791957243/article/details/86157707 这个博客里写了,怎么关闭这些debug信息 因 ...
- Scrapy中Request的回调函数不执行
一. 举例 def parse(self, response):...yield Request(url=parse.urljoin(response.url, title_herf), meta=m ...
- MFC中添加Splash Screen
1. 新建一个MFC项目SDI或MDI. 2. 新建或导入一个ID为IDB_SPLASH的位图. 3. 添加现有项SplashWnd.h和SplashWnd.cpp. SplashWnd.h源代 ...
最新文章
- python-装饰器实现pv-uv
- STM32F0xx_SPI读写(Flash)配置详细过程
- PetShop 中的字符串过滤
- HDU 3081Marriage Match II(二分法+并检查集合+网络流量的最大流量)
- IT技术人终究要走上管理职位吗?
- php替换局部大小写字母,php替换字符串中的一些字符(区分大小写)的函数str_replace()...
- 无线网卡的Master,Managed,ad-hoc,monitor模式
- Centos 6.3中安装KVM
- java大数阶乘_Java大数阶乘
- RestClient的简单介绍
- magisk核心功能模式是什么_HRT-Lin-荣耀V9 B347 自动接听Xposed 机型 Magisk 桌面设置 dpi等功能...
- qq西游服务器制作教程,QQ西游修罗版开区一键服务端+完整客户端+GM辅助工具+教程...
- wireshark推荐书籍
- 数据泄露,数据防泄密该怎么做?
- Filler Cell 与 Metal Fill差异
- 【Windows】怎么查看CUDA版本?Conda命令安装和NVIDIA官网安装包安装的CUDA有何区别?nvcc -V和nvidia-smi获得的CUDA版本有何区别?如何指定CUDA版本?
- 【数据结构】 八大排序实现简析+复杂度及稳定性分析
- qt vs中引用pri文件的问题
- 糗事百科 android源码,Android高仿糗事百科(含服务端)
- curl_操作nuetron下的mysql数据(资源数据)