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框架-下载中间件的更多相关文章

  1. 第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令

    第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令 Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --u ...

  2. 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码

    第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...

  3. Scrapy——6 APP抓包—scrapy框架下载图片

    Scrapy——6 怎样进行APP抓包 scrapy框架抓取APP豆果美食数据 怎样用scrapy框架下载图片 怎样用scrapy框架去下载斗鱼APP的图片? Scrapy创建下载图片常见那些问题 怎 ...

  4. Scrapy——5 下载中间件常用函数、scrapy怎么对接selenium、常用的Setting内置设置有哪些

    Scrapy——5 下载中间件常用的函数 Scrapy怎样对接selenium 常用的setting内置设置 对接selenium实战 (Downloader Middleware)下载中间件常用函数 ...

  5. Python爬虫进阶之Scrapy框架安装配置

    Python爬虫进阶之Scrapy框架安装配置 初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此 ...

  6. UA池 代理IP池 scrapy的下载中间件

    # 一些概念 - 在scrapy中如何给所有的请求对象尽可能多的设置不一样的请求载体身份标识 - UA池,process_request(request) - 在scrapy中如何给发生异常的请求设置 ...

  7. 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...

  8. 第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies

    第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于star ...

  9. 第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用

    第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用 xpath表达式 //x 表示向下查找n层指定标签,如://div 表示查找所有div标签 /x 表示向下查找一层指定的标签 ...

随机推荐

  1. ios下元素溢出设置 overflow:auto; 不能滑动解决办法

    ios下元素溢出设置 overflow:auto; 不能滑动解决办法: overflow:auto; overflow-y:scroll; -webkit-overflow-scrolling:tou ...

  2. 错误的另一个常见原因是默认的安全组规则。default security group默认情况下不允许ICMP(ping命令使用的协议)

    可以在openstack horizon界面中添加ICMP和ssh(TCP)规则,也可以通过命令行.命令行方式给默认安全组添加规则的方法如下: $ nova secgroup-add-rule def ...

  3. mpvue微信小程序开发随笔

    mpvue上手很快,学习成本低,目前是开源的,适合技术实力不是很强的公司采用. spring boot 做后台,开发效率杠杠的.建议会java的开发尽量使用spring boot 开发,省事. 最近用 ...

  4. 协议类接口 - NAND

    一.引脚的含义 先看下nand flash是怎么接的,如下所示便为某一款nand存储芯片的引脚图.发现其连地址信号都没有.那么是如何访问地址数据的呢? 查阅该nand flash的数据手册可得其各个引 ...

  5. 轻量ORM-SqlRepoEx (十七)SqlRepoEx 2.30 版本更新说明

    .Net平台下兼容.NET Standard 2.0,一个实现以Lambda表达式转转换标准SQL语句,支持MySQL.SQL Server数据库方言,使用强类型操作数据的轻量级ORM工具,在减少魔法 ...

  6. Notes 20180310 : String第二讲_String的声明与创建

    1  字符串的声明与创建 学习String的第一步就是创建(声明)字符串,我们在这里之所以分为创建和声明(其实是一个意思,都是创建字符串,但两者却有本质的区别)是因为String是一个很特殊的类,它的 ...

  7. iOS:位置相关(18-03-09更)

    1.定位设置 2.定位页面逻辑 1.定位设置 2.定位页面逻辑 1).第一次进入该VC,在 viewDidLoad 调用刷新页面 refreshLocationView .这时用户还没决定,会刷出“正 ...

  8. c++高精度计算(加法)

    本文提供给刚入坑的新手 关于高精度的计算网上百度一下可以了解到许多 今天我分享的只是一些自己的心得,更详细的可以去看原博主的原创文章(https://blog.csdn.net/fanyun_01/a ...

  9. Java Hibernate Validator

    Hibernate Validator是Hibernate提供的一个开源框架,使用注解方式非常方便的实现服务端的数据校验. 官网:http://hibernate.org/validator/ hib ...

  10. 使用xadmin更新数据时,报错expected string or bytes-like object

    expected string or bytes-like object 期望的字符串或类似字节的对象,一般为数据类型不匹配造成 本人在实际项目里发现的问题是: 数据库里的字段类型与django里mo ...