下载器中间件

Downloader Middlewares(下载器中间件)

下载器中间件是引擎和下载器之间通信的中间件。在这个中间件中我们可以设置代理、更换请求头等来达到反反爬虫的目的。要写下载器中间件,可以在下载器中实现两个方法。一个是process_request(self, spider),这个方法是在请求发送之前执行,还有一个是process_response(self, request, response, spider),这个方法是数据下载到引擎之前执行。

process_request(self, request, spider)

这个方法是下载器在发送请求之前会执行的。一般可以在这个里面设置随机代理ip等。

  1. 参数:

    • request:发送请求的request对象。
    • spider:发送请求的spider对象。
  2. 返回值:
    • 返回None:如果返回NoneScrapy将继续处理该request,执行其他中间件中的相应方法,直到合适的下载器处理函数被调用。
    • 返回Response对象:Scrapy将不会调用任何其他的process_request方法,将直接返回这个response对象。已经激活的中间件的process.response()方法则会在每个response返回时被调用。
    • 返回Request对象:不再使用之前的request对象去下载数据,而是根据现在返回的request对象返回数据。
    • 如果这个方法中抛出了异常,则会调用process_exception方法。

process_response(self, request, response, spider)

这个是下载器下载的数据到引擎中间会中心会执行的方法。

  1. 参数:

    • request:request对象。
    • response:被处理的response对象。
    • spider:spider对象。
  2. 返回值:
    • 返回Response对象:会将这个新的response对象传给其他中间件,最终传给爬虫。
    • 返回Request对象:下载链接切断,返回的request会重新被下载器调度下载。
    • 如果抛出一个异常,那么调用requesterrback方法,如果没有指定这个方法,那么会抛出一个异常。

随机请求头中间件:

爬虫在频繁访问一个页面的时候,这个请求头如果一直保持一致。那么很容易被服务器发现,从而禁止掉这个请求头的访问。因此我们要在访问这个页面之前随机的更改请求头,这样才可以避免爬虫被抓。随机更改请求头,可以在下载中间件中实现。在请求发送给服务器之前,随机的选择一个请求头。这样就可以避免总使用一个请求头了。示例代码如下:

class UserAgentDownloadMiddleware(object):
    # user-agent随机请求头中间件
    USER_AGENT = [
        ‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36‘,
        ‘Mozilla/5.0 (Macintosh; U; PPC Mac OS X; pl-PL; rv:1.0.1) Gecko/20021111 Chimera/0.6‘,
        ‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1‘,
        ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134‘,
        ‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201‘,
        ‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17 SE 2.X MetaSr 1.0‘,
    ]

    def process_request(self, request, spider):
        user_agent = random.choice(self.USER_AGENT)
        request.headers[‘User-Agent‘] = user_agent

user-agent列表:http://www.useragentstring.com/pages/useragentstring.php?typ=Browser

ip代理池中间件

购买代理:

在以下代理商中购买代理:

  1. 芝麻代理:http://http.zhimaruanjian.com
  2. 太阳代理:http://http.taiyangruanjian.com
  3. 快代理:http://www.kuaidaili.com
  4. 讯代理:http://www.xdaili.com
  5. 蚂蚁代理:http://www.mayidaili.com

使用代理池:

示例代码如下:

class IPProxyDownloadMiddleware(object):
    POXIES = [
        "178.44.170.152:8080",
        "110.44.113.182:8080",
        "209.126.124.73:8888"
    ]
    def process_request(self, request, spider):
        proxy = random.choice(self.PROXIES)
        request.meta[‘proxy‘] = proxy
  1. 独享代理池设置:
class IPProxyDownloadMiddleware(object):
    def process_request(self, request, spider)
        proxy = ‘121.199.6.124:16816‘
        user_password = ‘970138074:rcdj35ur‘
        request.meta[‘proxy‘] = proxy
        # byte
        b64_user_passwd = base64.b64encode(user_password.encode(‘utf-8‘))
        request.headers[‘proxy-Authorization‘] = ‘Basic‘ + b64_user_password.decode(‘utf-8‘)

原文地址:https://www.cnblogs.com/colden/p/9863815.html

时间: 2024-10-13 18:51:14

下载器中间件的相关文章

scrapy 下载器中间件

下载器中间件如下列表 ['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 'scrapy.downloadermiddlewares.defaultheade

scrapy学习2 爬虫中间件,下载器中间件之添加代理

中间件 注意:这些中间件都放在middleware中 下载中间件 作用 实例: 代理被封,添加代理 方式一:内置添加代理功能 import os # -*- coding: utf-8 -*- import os import scrapy from scrapy.http import Request class ChoutiSpider(scrapy.Spider): name = 'chouti' allowed_domains = ['chouti.com'] start_urls =

Python 10min 面试题解析丨Python实现多连接下载器

作者:蜗牛 shengxinjing (woniuppp) · GitHub 今天群里看到有人问关于 Python 多线程写文件的问题,联想到这是 Reboot 的架构师班的入学题.我想了一下,感觉坑和考察的点还挺多的,可以当成一个面试题来问,简单说一下我的想法和思路吧,涉及的代码和注释在 GitHub 上 (https://github.com/shengxinjing/my_blog/blob/master/downloader/downloader.py) 当年的网络蚂蚁"多点同时下载.并

网站下载器WebZip、Httrack及AWWWB.COM网站克隆器

 动机 闲扯节点,可略读. 下载并试用这些软件并非是为了一己之私,模仿他人网站以图利.鉴于国内网络环境之艰苦,我等屌丝级半罐水程序员,纵有百度如诸葛大神万般协力相助,也似后主般无能不能解决工作和娱乐中的诸多困难.就那如近段时间自学Android开发为例,不说下载Android SDK费了九牛二虎之力,想看看Android官网文档,每次都想尽一切办法,使用各种手段(fg742p.exe?fg752p.exe?goagent?  看官或许笑我,何须如此费力,VPS+VPN,带你装逼带你飞,so ea

自己动手写工具:百度图片批量下载器

开篇:在某些场景下,我们想要对百度图片搜出来的东东进行保存,但是一个一个得下载保存不仅耗时而且费劲,有木有一种方法能够简化我们的工作量呢,让我们在离线模式下也能爽爽地浏览大量的美图呢?于是,我们想到了使用网络抓取去帮我们去下载图片,并且保存到我们设定的文件夹中,现在我们就来看看如何来设计开发一个这样的图片批量下载器. 一.关于网络抓取与爬虫 网络蜘蛛的主要作用是从Internet上不停地下载网络资源.它的基本实现思想就是通过一个或多个入口网址来获取更多的URL,然后通过对这些URL所指向的网络资

python3写的腾讯漫画下载器

代码很稀烂,开坑后一个月的时间,断断续续总算是写完了,主体功能完成,顺便PYQT5写了个GUI,并用cx_freeze打包,可以在windows下用. 项目托管在github: https://github.com/abcfy2/getComic 预览效果 放几张预览图,支持不连续的章节选择下载. windows下的效果: deepin下效果: 算法描述 腾讯的漫画从PC版访问时看到的是flash,但是移动版的页面却是图片,用ipad的UA请求ac.qq.com可以发现跳转为m.ac.qq.co

Python实现多线程HTTP下载器

本文将介绍使用Python编写多线程HTTP下载器,并生成.exe可执行文件. 环境:windows/Linux + Python2.7.x 单线程 在介绍多线程之前首先介绍单线程.编写单线程的思路为: 解析url: 连接web服务器: 构造http请求包: 下载文件. 接下来通过代码进行说明. 解析url 通过用户输入url进行解析.如果解析的路径为空,则赋值为'/':如果端口号为空,则赋值为"80":下载文件的文件名可根据用户的意愿进行更改(输入'y'表示更改,输入其它表示不需要更

bigemap地图下载器安装

软件下载 本产品支持主流winodws操作系统(xp sp3,vista,windows 7,windows 8及windows 10), 可通过访问大地图官网(http://www.bigemap.com/)获取本产品,用户可根据需求下载相应的版本. 如下图所示为软件下载. 本产品所有版本都具备在线自动升级,以保证用户实时获取到最新的地图数据和增值软件服务. 软件下载 下载完成后,双击安装包按照安装向导即可完成安装.温馨提示:请尽量不要把软件装在系统盘,如:C盘. 安装过程如下所示:     

Python实战:美女图片下载器,海量图片任你下载

Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习Python这门语言. 本文是在前一部分Python基础之上Python实战:Python爬虫学习教程,获取电影排行榜,再次升级的Python网页爬虫实战课程. 1.项目概述. 利用XPath和requests模块进行网页抓取与分析,达到网页图片下载的效果. 抓爬图片地址:http://www.2c