爬虫2.5-scrapy框架-下载中间件
scrapy框架-下载中间件
middlewares.py中有两个类,一个是xxSpiderMiddleware类 一个是xxDownloaderMiddleware类,xx代表项目名,本次笔记主要记录DownloaderMiddleware类的一些知识点
1. process_request(self, request, spider):
这个方法会在请求之前执行,所以可以添加代理pi和随机请求头等
1.1 参数:
reuqest:发送的请求
spider:发送请求的spider对象,即request是哪个爬虫对象发过来的。
1.2 返回值:
1)如果返回的是None:scrapy将把request对象交给下一个中间件
2)如果返回的是response对象,则不会调用任何的process_request方法,而是将response对象直接返回给已激活的process_response()方法
3)返回request对象,不会调用下一个中间件,而是根据返回的request对象返回数据
4)抛出异常,调用process_exception方法。
2. process_response(self, request, response, spider):
2.1 参数:
1)request:之前发送的request请求对象
2)response:返回的数据对象
3)spider:爬虫对象
2.2 返回值:
1)返回response对象,会将这个新的response对象传给其他中间件,最终传给爬虫
2)返回request对象,下载器链被切断,返回的request会重新被下载器调度
3)抛出异常,调用request中的errback方法,没有就抛出异常
3. 设置请求头
专业请求头网站 http://www.useragentstring.com/pages/useragentstring.php?type=Browser
定义xxDownloaderMiddleware类,在写process_request()方法
class xxDownloaderMiddleware(object):
USER_AGENTS = [
'xxxx',
'xxxxx',
'xxxx',
'xxxxxx' # 请求头
]
def process_request(self, request, spider):
user_agent = random.choice(self.USER_AGENTS)
request.headers['user-agent'] = user_agent
然后在settings.py中打开中间件设置
DOWNLOADER_MIDDLEWARES = {
'projectname.middlewares.xxDownloaderMiddleware': 543
}
4. ip代理池
代理服务商:
快递代理、芝麻代理、太阳代理、讯代理、蚂蚁代理
当然是花钱买,免费的不好用
新建一个类
class XXXDownloaderMiddleware(object):
PROXIES = ['IP1','IP2','IP3']
def process_request(self, request, spider):
proxy = random.choice(self.PROXIES)
request.meta('proxy') = proxy
修改settings.py
DOWNLOADER_MIDDLEWARES = {
'project.middlewares.XXXDownloaderMiddleware':542 # 多个中间件的优先级自己设定,1为最高级
}
5. 一个略完善的代理思路
开启两个下载中间件,一个请求头代理,一个ip代理,添加到settings中间
ip代理中间件需要两个函数,
1 process_request(self, request, spider)
2 process_response(self, request, response, spider)
函数1 获取代理ip、端口、过期时间可以调用代理网站给的api获取
函数2 当ip被封,返回的是值是不一样的,所以可以return request对象 重新分配代理ip、端口
伪代码:
def process_request(self, request, spider):
if 'proxy' not in request.meta or 代理即将过期 or 代理被封:
更新代理
更新代理被封标志
request.meta['proxy'] = 代理ip
def process_response(self, request, response, spider):
if response.status != 200 or 验证码页面url特殊标志 in response.url:
代理被封标志
更新代理
return request
return response
因为scrapy框架下各个请求是异步的,所以更新代理的函数需要进行一定的更改,因为每次将一个ip使用到被封才使用下一个ip,所以每个异步请求都应该使用同一个ip,过期或被封之后才更换
def 更新代理:
加锁:
if 代理没有设置好 or 代理即将过期
请求代理ip
6. selenium+chromedriver中间件
这个中间件相当于使用chromedriver访问页面,并将各类ajax数据传回给爬虫进行解析,而scrapy框架负责调度url和数据解析存储。
当页面中ajax数据较多且复杂时,采用这种方式更方便。
~ meddlewares.py
from selenium import webdriver
from scrapy.http.response.html import HtmlResponse
class SeleniumDownloaderMiddleware(object):
def __init__(self):
self.driver = webdriver.Chrome(executable_path=r'D:\chromedriver\chromedriver.exe') # 创建driver
def process_request(self, request, spider):
self.driver.get(request.url) # 打开不同的页面
source = self.driver.page_source
response = HtmlResponse(self.driver.current_url, body=source, request=request, encoding='utf-8') # 传入的参数是按原本response对象需要的参数
return response # 必须返回response对象给爬虫
最后在settings.py中开启这个中间件
DOWNLOADER_MIDDLEWARES = {
'boss.middlewares.SeleniumDownloaderMiddleware': 543,
}
爬虫2.5-scrapy框架-下载中间件的更多相关文章
- 第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令
第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令 Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --u ...
- 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码
第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...
- Scrapy——6 APP抓包—scrapy框架下载图片
Scrapy——6 怎样进行APP抓包 scrapy框架抓取APP豆果美食数据 怎样用scrapy框架下载图片 怎样用scrapy框架去下载斗鱼APP的图片? Scrapy创建下载图片常见那些问题 怎 ...
- Scrapy——5 下载中间件常用函数、scrapy怎么对接selenium、常用的Setting内置设置有哪些
Scrapy——5 下载中间件常用的函数 Scrapy怎样对接selenium 常用的setting内置设置 对接selenium实战 (Downloader Middleware)下载中间件常用函数 ...
- Python爬虫进阶之Scrapy框架安装配置
Python爬虫进阶之Scrapy框架安装配置 初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此 ...
- UA池 代理IP池 scrapy的下载中间件
# 一些概念 - 在scrapy中如何给所有的请求对象尽可能多的设置不一样的请求载体身份标识 - UA池,process_request(request) - 在scrapy中如何给发生异常的请求设置 ...
- 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...
- 第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies
第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于star ...
- 第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用
第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用 xpath表达式 //x 表示向下查找n层指定标签,如://div 表示查找所有div标签 /x 表示向下查找一层指定的标签 ...
随机推荐
- String系列01 - String 60%
1.String简介 String类实现CharSequence接口.(同时,实现Serializable, Comparable 接口). String类使用final修饰符,为final类,不可被 ...
- jQuery 表单元素取值与赋值方法总结
一.普通文本框的赋值与取值 1.1.1赋值 <h2>jQuery 表单元素取值与赋值方法总结</h2> <input type="text" clas ...
- EF Core 2.1 支持数据库一对一关系
在使用EF Core和设计数据库的时候,通常一对多.多对多关系使用得比较多,但是一对一关系使用得就比较少了.最近我发现实际上EF Core很好地支持了数据库的一对一关系. 数据库 我们先来看看SQL ...
- 触发器 of oracle
. 本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行. 因此触发器不需要人为的去调用 ...
- c#将List转换成DataTable
前面写了一篇List<T>转换成DataTable,这里主要是完善了前面的代码. 同样使用了emit,我把代码整理后上传了git. 另外增加了特性的设计. 设计了三类特性ColumnTyp ...
- 在express中HMR(合并express和webpack-dev-server)
在学习react的时候,经常用create-react-app来创建web应用,然而写到后面总有连自己服务器和数据库的需求,create-react-app创建的是一个webpack-dev-serv ...
- Xquery的初步学习(一次Lab作业的总结)
Task 1: Open countries.xml, compose the following XQueries: 1. Return the area of Mongolia. 2. Retur ...
- $.ajax(),$.get(),$.post()的区别,以及一些参数注意规则
$.ajax()方法和$.get(),$.post()方法的对比 $.ajax()方法是最完整的写法,可以完成所有的ajax请求(包含get类型和post类型) $.get()和$.post()都是简 ...
- Immutable.js 以及在 react+redux 项目中的实践
来自一位美团大牛的分享,相信可以帮助到你. 原文链接:https://juejin.im/post/5948985ea0bb9f006bed7472?utm_source=tuicool&ut ...
- 课时14.DTD文档声明上(掌握)
1.什么是DTD文档声明? 由于HTML有很多格版本的规范,每个版本的规范之间又又一些差异,所以为了让浏览器能够正确的编译/解析/渲染我们的网页,我们需要在HTML文件的第一行告诉浏览器,我们当前这个 ...