Scrapy中集成selenium
面对众多动态网站比如说淘宝等,一般情况下用selenium最好
那么如何集成selenium到scrapy中呢?
因为每一次request的请求都要经过中间件,所以写在中间件中最为合适
from selenium import webdriver
from scrapy.http import HtmlResponse
class JSPageMiddleware(object):
def process_request(self, request, spider):
if spider.name == "xinlang": # 这只是一个示例表示爬虫为新浪,当然可以自定义比如正则表达式对于某一种网址来进行过滤
browser = webdriver.Chrome()
browser.get(request.url)
import time
time.sleep(3)
print("访问:{0}".format(request.url)) # 如何在这里发送完成之后就不发送给scrapy下载器了呢?
return HtmlResponse(url=browser.current_url, body=browser.page_source, encoding="utf-8",request=request)
# 一旦遇到HTMLResponse,scrapy就不会向download发送了,而是直接返回给spider了,上面所有值都是必须的
注意别忘了 将中间件写入到settings中!
是不是可以优化的空间了呢?
每一次请求都要打开一次Chrome,这个就很烦了,因为速度比较慢
from selenium import webdriver
from scrapy.http import HtmlResponse
class JSPageMiddleware(object):
def __init__(self):
self.browser = webdriver.Chrome
super().__init__() def process_request(self, request, spider):
if spider.name == "xinlang": # 这只是一个示例表示爬虫为新浪,当然可以自定义比如正则表达式对于某一种网址来进行过滤
self.browser.get(request.url)
import time
time.sleep(3)
print("访问:{0}".format(request.url)) # 如何在这里发送完成之后就不发送给scrapy下载器了呢?
return HtmlResponse(url=self.browser.current_url, body=self.browser.page_source, encoding="utf-8", request=request)
# 一旦遇到HTMLResponse,scrapy就不会向download发送了,而是直接返回给spider了,上面所有值都是必须的
这样只需要打开一次Chrome了,但是,注意下,这样的话scrapy就不会关闭了,那怎么办?
我们把它放到spider中
那这样的话,中间件中改为
from scrapy.http import HtmlResponse
class JSPageMiddleware(object): def process_request(self, request, spider):
if spider.name == "xinlang":
spider.browser.get(request.url) # 利用spider来进行调用
import time
time.sleep(3)
print("访问:{0}".format(request.url)) # 如何在这里发送完成之后就不发送给scrapy下载器了呢?
return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8", request=request)
但是这样还是有问题,我咋知道什么时间关闭?
from selenium import webdriver
from scrapy.xlib.pydispatch import dispatcher # scrapy的分发器
from scrapy import signals
class LagouSpider(CrawlSpider):
name = 'lagou'
allowed_domains = ['www.lagou.com']
start_urls = ['https://www.lagou.com/'] rules = (
Rule(LinkExtractor(allow=('www.lagou.com/jobs/',)), callback='parse_job'),
) def __init__(self):
self.browser = webdriver.Chrome
super().__init__()
dispatcher.connect(self.spider_closed, signals.spider_closed) # 没有括号的 def spider_closed(self):
print("spider closed")
self.browser.quit()
是不是和django的用法非常一致?
但是异步处理的时候,则么办,现在是一个同步的请求!
那么重写download
git 搜索scrapy download一搜便知
Scrapy中集成selenium的更多相关文章
- 在Scrapy中使用selenium
在scrapy中使用selenium 在scrapy中需要获取动态加载的数据的时候,可以在下载中间件中使用selenium 编码步骤: 在爬虫文件中导入webdrvier类 在爬虫文件的爬虫类的构造方 ...
- scrapy中使用selenium来爬取页面
scrapy中使用selenium来爬取页面 from selenium import webdriver from scrapy.http.response.html import HtmlResp ...
- 如何优雅的在scrapy中使用selenium —— 在scrapy中实现浏览器池
1 使用 scrapy 做采集实在是爽,但是遇到网站反爬措施做的比较好的就让人头大了.除了硬着头皮上以外,还可以使用爬虫利器 selenium,selenium 因其良好的模拟能力成为爬虫爱(cai) ...
- scrapy中的selenium
引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们会发现 ...
- 爬虫之scrapy框架应用selenium
一.利用selenium 爬取 网易军事新闻 使用流程: ''' 在scrapy中使用selenium的编码流程: 1.在spider的构造方法中创建一个浏览器对象(作为当前spider的一个属性) ...
- 第三百五十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中
第三百五十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中 1.爬虫文件 dispatcher.connect()信号分发器,第一个参数信 ...
- scrapy架构与目录介绍、scrapy解析数据、配置相关、全站爬取cnblogs数据、存储数据、爬虫中间件、加代理、加header、集成selenium
今日内容概要 scrapy架构和目录介绍 scrapy解析数据 setting中相关配置 全站爬取cnblgos文章 存储数据 爬虫中间件和下载中间件 加代理,加header,集成selenium 内 ...
- selenium在scrapy中的使用、UA池、IP池的构建
selenium在scrapy中的使用流程 重写爬虫文件的构造方法__init__,在该方法中使用selenium实例化一个浏览器对象(因为浏览器对象只需要被实例化一次). 重写爬虫文件的closed ...
- 15.scrapy中selenium的应用
引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们会发现 ...
随机推荐
- Google瓦片地图URL
http://mt2.google.cn/vt/lyrs=y&scale=2&hl=zh-CN&gl=cn&x=6891&y=3040&z=13 //含 ...
- 我的es6笔记
变量 1. let 和 const 声明的变量不在window上了 2. es6中对于块级作用域里的函数声明实现不统一,要避免在大括号里声明函数,尽量用函数表达式来替代. 3. let和const声明 ...
- Windows 2012 安装 SQL Server 2012,.Net Framework 3.5安装不成的解决办法
This behavior can also be caused by a system administrator who configures the computer to use Window ...
- 记录2-在mac上安装ubuntu 16.04 LTS
前几天升级了我用了六七年mac硬件,内存由4G变为8G,硬盘也换成1T SSD,索性把一直想装的ubuntu也装了,方便温习下以前的工作环境. 我比较喜欢LTS的版本,所以安装了16.04. 主要步骤 ...
- Postman runner参数化
按照下面图片的顺序操作吧~ lets go 1.把要做参数化的字段的value用花括号标识起来,如:{{phone}} 2.准备一个csv的文件,把每次请求接口的参数按下图填写好,第一行写字段名称(p ...
- Linux在VirtualBox的网络设置
一.Linux系统版本:Centos7.4. 二.访问外网:在设置-网络-网卡1处选择 “网络地址置换(NAT)”即可.默认情况下,自动获取IP(DHCP),但要在配置中把开机启动选上. 文件位置: ...
- 单片机课程设计——课程设计之四位加法计算器(2)(C代码)
#include<reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; sbit rw=P2^5; sbit ...
- 微信授权获取用户openId等信息
在我们开发小程序的时候,需要通过授权获取用户的信息. 第一种使用wx.getUserInfo直接获取微信头像,昵称 // 必须是在用户已经授权的情况下调用 wx.getUserInfo({ succe ...
- Python paramiko模块基本使用(一)
使用paramiko模块登录远程主机,对日志进行统计分析. import paramiko def batch_count(days, hours, ips, user, passwd, source ...
- Centos7 操作系统 mysql5.7 配置远程登陆操作
Centos7 操作系统: mysql5.7 配置远程登陆操作: 首先登陆服务器,进入数据库: mysql -u root -p show databases; use mysql; show tab ...