scrapy中间件:

  • scrapy中间件介绍
  • 下载器中间件
    • 添加ip代理
    • UA中间件
    • cookies中间件
  • 爬虫中间件
    • 核心方法

scrapy中间件介绍

=

=
scrapy中间件是scrapy框架的重要组成部分
分为两大种类:下载器中间件(DownloaderMiddleware)和爬虫中间件(SpiderMiddleware
图中4、5为下载器中间件
图中6、7为爬虫中间件

下载器中间件是Scrapy请求/响应处理的钩子框架。这是一个轻,低层次的系统,全球范围内改变斯拉皮的请求和响应。

下载器中间件主要功能:
1、添加ip代理
2、添加cookie
3、添加UA
4、请求重试

Spider中间件是一个钩子框架,可以钩住Scrapy的Spider处理机制,在该机制中,您可以插入自定义功能来处理发送到的响应。 蜘蛛 用于处理和处理由spider生成的请求和项目。

爬虫中间件主要功能:
1、处理引擎传递给爬虫的响应
2、处理爬虫传递给引擎的请求
3、处理爬虫传递给引擎的数据项

其中,爬虫中间件在以下情况中会被调用:

1.当运行到 yield scrapy.Request()或者 yield item 的时候,爬虫中间件的
2.process_spider_output()方法被调用。 当爬虫本身的代码出现了 Exception 的时候,爬虫中间件的
3.process_spider_exception()方法被调用。 当爬虫里面的某一个回调函数 parse_xxx()被调用之前,爬虫中间件的
4. process_spider_input()方法被调用。 当运行到 start_requests()的时候,爬虫中间件的
5. process_start_requests()方法被调用。

=

=
首先,先创建一个spider用于学习middleware
打开其中的middlewares.py
初始化样子:

# Define here the models for your spider middleware
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/spider-middleware.htmlfrom scrapy import signals# useful for handling different item types with a single interface
from itemadapter import is_item, ItemAdapterclass MiddlewareproSpiderMiddleware:# Not all methods need to be defined. If a method is not defined,# scrapy acts as if the spider middleware does not modify the# passed objects.@classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s = cls()crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)return sdef process_spider_input(self, response, spider):# Called for each response that goes through the spider# middleware and into the spider.# Should return None or raise an exception.return Nonedef process_spider_output(self, response, result, spider):# Called with the results returned from the Spider, after# it has processed the response.# Must return an iterable of Request, or item objects.for i in result:yield idef process_spider_exception(self, response, exception, spider):# Called when a spider or process_spider_input() method# (from other spider middleware) raises an exception.# Should return either None or an iterable of Request or item objects.passdef process_start_requests(self, start_requests, spider):# Called with the start requests of the spider, and works# similarly to the process_spider_output() method, except# that it doesn’t have a response associated.# Must return only requests (not items).for r in start_requests:yield rdef spider_opened(self, spider):spider.logger.info('Spider opened: %s' % spider.name)class MiddlewareproDownloaderMiddleware:# Not all methods need to be defined. If a method is not defined,# scrapy acts as if the downloader middleware does not modify the# passed objects.@classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s = cls()crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)return sdef process_request(self, request, spider):# Called for each request that goes through the downloader# middleware.# Must either:# - return None: continue processing this request# - or return a Response object# - or return a Request object# - or raise IgnoreRequest: process_exception() methods of#   installed downloader middleware will be calledreturn Nonedef process_response(self, request, response, spider):# Called with the response returned from the downloader.# Must either;# - return a Response object# - return a Request object# - or raise IgnoreRequestreturn responsedef process_exception(self, request, exception, spider):# Called when a download handler or a process_request()# (from other downloader middleware) raises an exception.# Must either:# - return None: continue processing this exception# - return a Response object: stops process_exception() chain# - return a Request object: stops process_exception() chainpassdef spider_opened(self, spider):spider.logger.info('Spider opened: %s' % spider.name)

可以看到分为两类:

class MiddlewareproDownloaderMiddleware:
class MiddlewareproSpiderMiddleware:

以下依次介绍

=

=

=

下载器中间件

添加ip代理

测试ip地址可访问网站 http://httpbin.org/ip
方法一:
不用中间件。重写start_ requests方法,在发送请求时传入ip—proxy

yield scrapy.Request(self.start_urls[0], meta={"proxy": proxy})

方法二:
使用中间件。

第一种:静态ip中间件
test:

import scrapyclass MiddlewaretestSpider(scrapy.Spider):name = 'middlewareTest'# allowed_domains = ['http://httpbin.org/ip']start_urls = ['http://httpbin.org/ip']def parse(self, response):print('IP地址--> ', response.text)

在middlewares中重写编写一个类:

class TestProxyMiddleware(object):def process_request(self, request, spider):proxy = "http://113.57.26.117"request.meta["proxy"] = proxy

在settings中打开;

DOWNLOADER_MIDDLEWARES = {# 'middlewarePro.middlewares.MiddlewareproDownloaderMiddleware': 543,'middlewarePro.middlewares.TestProxyMiddleware':543,}

结果:

IP地址-->  {"origin": "113.57.26.117"
}

第二种:动态ip
动态ip的创建和静态ip创建原理相似,只是每次给request的meta赋予不同的proxy参数,这就要依靠代理池俩实现。
代理池就是有很多ip组成的字典,每次随机抽取一个ip,如果这个代理池足够大,就可以降低重复的概率
test不变
middlewares:
先导入两个类:

import random
from scrapy.utils.project import get_project_settings
class TestProxyMiddleware(object):def __init__(self):self.settings = get_project_settings()def process_request(self, request, spider):proxy = random.choice(self.settings['PROXIES'])request.meta["proxy"] = proxy

settings中接入一个代理池:

PROXIES = ['http://114.217.243.25:8118','http://125.37.175.233:8118','http://1.85.116.218:8118'
]

=

=

UA中间件

UA中间件的设置和代理的设置基本相同
middlewares中新建一个类UAMiddleware

class UAMiddleware(object):def process_request(self, request, spider):ua = random.choice(settings['USER_AGENT_LIST'])request.headers['User-Agent'] = ua

在settings中添加一个含UA数据的字典即可。

USER_AGENT_LIST = [
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36","Dalvik/1.6.0 (Linux; U; Android 4.2.1; 2013022 MIUI/JHACNBL30.0)","Mozilla/5.0 (Linux; U; Android 4.4.2; zh-cn; HUAWEI MT7-TL00 Build/HuaweiMT7-TL00) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","AndroidDownloadManager","Apache-HttpClient/UNAVAILABLE (java 1.4)","Dalvik/1.6.0 (Linux; U; Android 4.3; SM-N7508V Build/JLS36C)","Android50-AndroidPhone-8000-76-0-Statistics-wifi","Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI 3 MIUI/V7.2.1.0.KXCCNDA)","Dalvik/1.6.0 (Linux; U; Android 4.4.2; Lenovo A3800-d Build/LenovoA3800-d)","Lite 1.0 ( http://litesuits.com )","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727)","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0","Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; HTC T528t Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30; 360browser(securitypay,securityinstalled); 360(android,uppayplugin); 360 Aphone Browser (2.0.4)",
]

记得在settings中开启该通道;

DOWNLOADER_MIDDLEWARES = {# 'middlewarePro.middlewares.MiddlewareproDownloaderMiddleware': 543,'middlewarePro.middlewares.TestProxyMiddleware':543,'middlewarePro.middlewares.UAMiddleware' : 544,
}

=

=

cookies中间件

cookies值主要用于爬取一些需要登录的网站,保持登录状态。
设置cookies中间件首先要有若干cookies值,获取cookies可以用selenium登录要爬取的网址,然后下载cookies,多重复几遍就可得到多个cookies值

具体操作和上述类似

=

=

爬虫中间件

Spider middleware主要有三个作用:
1、在downloader生成request发送给spider之前,对request进行处理
2、在spider生成request发送给scheduler之前,对request进行处理
3、在spider生成request发送给item pipeline之前,对item进行处理

核心方法

# 返回None或一个异常。
#如果是None,就继续调用其他的spider middleware。
#如果是一个异常,调用request里的errback()方法,再抛出异常是交给process_spider_exception(response, exception, spider)处理
process_ spider _input(response, spider)# 必须返回一个包括request或item对象的可迭代对象
process_spider_output(response, result, spider)# 返回None 或
# 一个包括request或item对象的可迭代对象
process_spider_exception(response, exception, spider)#返回一个request对象的可迭代对象
process_start_requests(start_requests, spider)

上述只需要其中一个方法就可以定义一个spider middleware。

scrapy中间件详解相关推荐

  1. Django 2.0 学习(20):Django 中间件详解

    Django 中间件详解 Django中间件 在Django中,中间件(middleware)其实就是一个类,在请求到来和结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法. 1. ...

  2. 代理后台中间件_Golang Gin 实战(十三)| 中间件详解看这一篇就够了

    6000字大章带你死磕Golang Gin中间件 在Gin的整个实现中,中间件可谓是Gin的精髓.一个个中间件组成一条中间件链,对HTTP Request请求进行拦截处理,实现了代码的解耦和分离,并且 ...

  3. 爬虫框架 Scrapy 教程详解

    一. 下载scrapy windows: 方法一: 下载Anacoda, 在Anacoda中下载scrapy 方法二: 直接pip install scrapy:期间部分依赖的包可能会报错,此时需要我 ...

  4. asp.net core 中间件详解及项目实战

    前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World,如果你觉得本篇文章 ...

  5. 分布式数据层中间件详解:如何实现分库分表+动态数据源+读写分离

    分布式数据层中间件: 1.简介: 分布式数据访问层中间件,旨在为供一个通用数据访问层服务,支持MySQL动态数据源.读写分离.分布式唯一主键生成器.分库分表.动态化配置等功能,并且支持从客户端角度对数 ...

  6. python scrapy框架详解_Python爬虫知识点四--scrapy框架

    一.scrapy结构数据 解释: 1.名词解析: o 引擎(Scrapy Engine) o 调度器(Scheduler) o 下载器(Downloader) o 蜘蛛(Spiders) o ...

  7. python爬虫框架实例项目_python爬虫框架scrapy实例详解

    生成项目 scrapy提供一个工具来生成项目,生成的项目中预置了一些文件,用户需要在这些文件中添加自己的代码. 打开命令行,执行:scrapy start tutorial/ scrapy.cfg t ...

  8. php跨域请求解决方案_swoft2 -跨域与中间件详解

    本方案用于开发环境,在生产环境不建议使用,生产环境可以使用 nginx 的反向代理 一.什么是跨域? 同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS ...

  9. 三十四 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

    信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行一个函数 dispatcher.connect()信号分发器,第一个参数信号触发函数,第二 ...

最新文章

  1. 中小企业信息化--网页设计模拟题1
  2. python画曲线-python绘制动态曲线教程
  3. linux操作系统的特点包括什么,什么是Linux操作系统?有哪些主要特点?
  4. 任意长度的高精度大整数加法
  5. 以array开头的php函数,PHP 常用数组函数详解
  6. 【C】Natasha 插件编程
  7. mysql 查看表格scott_mysql查询学习第一天,针对scott
  8. 使用OpenCV在Python中进行人脸和眼睛检测
  9. Linux设备驱动程序学习(2)-调试技术
  10. python之模块copy_reg(在python3中为copyreg,功能基本不变)
  11. VB连接SQL SERVER实例
  12. 调试 MQL5 程序
  13. boost电路输出电流公式_BOOST电路参数计算公式
  14. CDP营销方案 不仅仅是数据整合
  15. 读书百客:《陋室铭》赏析
  16. 等保2.0三级移动互联安全扩展要求
  17. JavaScript(js)基础
  18. 怎样用Netfilter/IPtables控制P2P流量
  19. 光学定位与追踪技术_光学跟踪技术定位精准罗技M90鼠标仅32
  20. 网络封包分析软件-wireshark

热门文章

  1. Cannot resolve overloaded method 'addsink
  2. zabbix清理历史数据
  3. 发明专利实质审查需要多久?
  4. Windows自带强大的入侵检测工具——Netstat 命令 查询是否中木马
  5. 自己DIY台式机具体步骤
  6. python OpenCV 图像无缝连接合并
  7. Reportlab源码阅读之常见纸张大小含A0至A10等
  8. Web文本挖掘技术研究
  9. 电动儿童游乐设施的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. Auto - CAD 基础操作命令(一)