一、scrapy 中间件
- 什么下载器中间件?
引擎与下载器之间的一个组件,一个爬虫可以有很多下载器中间件 - 为什么要使用下载器中间件功能
全局修改Scrapy request和response - scrapy 下载器中间件:
编辑文件middleware.py文件 - 编写处理方法
处理请求 process_request(self, request, spider)
添加:用户头 添加IP代理等功能 - 配置settings
在settings文件中配置DOWNLOADER_MIDDLEWARES参数 - 为什么模拟用户头、IP代理?
一句话:为了反反爬
二、自定义UA池构建自己的请求
-
from Douban.settings import USER_AGENT_LIST import random class RandomUserAgent(object): # 定义一个中间键类 # 用户代理 def process_request(self, request, spider): # 检验一下请求头 # print(request.headers['User-Agent']) # 获取一个请求头 ua = random.choice(USER_AGENT_LIST) # 设置请求头代理 request.headers['User-Agent'] = ua
-
setting配置
DOWNLOADER_MIDDLEWARES = { # 'Douban.middlewares.MyCustomDownloaderMiddleware': 543, #注册请求头用户代理 'Douban.middlewares.RandomUserAgent': 543, }
#自定义请求头,用户代理(自定) USER_AGENT_LIST =[ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; HCI0449; .NET CLR 1.0.3705) ", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; i-NavFourF; .NET CLR 1.1.4322) ", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon; " ]
请求头(用户)代理 随机) 定一个中间键类,重写process_request(self,request, spider)方法 对request的处理进行相应的配置,并把配置好以后 并把响应的类注册到setting文件中 参数[request,spider],并检验请求头。Print(request.headers[‘User-Agent’]) 需要在setting中DOWNLOADER_MIDDLEWARES(自定义中间键)配置 查看用户是用哪个代理请求头,在爬虫中parse_item方法下这里 print(response.request.headers[‘User-Agent’]
三、 使用第三方库构建UA池
- useragent 基本用法
调用库 fake-useragent 安装:pip install fake_useragent 导入:from fake_useragent import UserAgent headers = {"User-Agent": UserAgent().chrome} print(UserAgent().ie) #随机打印ie浏览器任意版本 print(UserAgent().firefox) #随机打印firefox浏览器任意版本 print(UserAgent().chrome) #随机打印chrome浏览器任意版本 print(UserAgent().random) #随机打印任意厂家的浏览器 ``
-
class RandomUserAgentMiddleware(object): def __init__(self,crawler): super(RandomUserAgentMiddleware, self).__init__() self.ua = UserAgent() self.ua_type = crawler.settings.get('RANDOM_UA_TYPE','random') @classmethod def from_crawler(cls,crawler): return cls(crawler) def process_request(self,request,spider): def get_ua(): return getattr(self.ua,self.ua_type) request.headers.setdefault('User-Agent',get_ua()
- setting配置
DOWNLOADER_MIDDLEWARES = { 'liebiao.middlewares.MyCustomDownloaderMiddleware': 543, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, } RANDOM_UA_TYPE= 'random'
- 通过crawler.settings.get来获取配置文件中的配置,如果没有配置则默认是random,如果配置了IE或者chrome等就会获取到相应的配置
- 在process_request方法中我们嵌套了一个get_ua方法,get_ua其实就是为了执行ua.ua_type
- 但是这里无法使用self.ua.self.us_type,所以利用了getattr方法来直接获取,最后通过request.heasers.setdefault来设置User-Agent
- 通过上面的配置我们就实现了每次请求随机更换User-Agent
转https://blog.csdn.net/javakklam/article/details/79984126
四、随机切换IP代理
-
让目标服务器以为不是同一个客户端在请求,防止因为ip发送过多而被反爬。防止我们的真实ip被泄露,防止被追究责任
from scrapy import signals import random import base64 from Douban.settings import PROXY_LIST class RandomProxy(object): def process_request(self, request, spider): # 随机取出一个代理ip proxy = random.choice(PROXY_LIST) # 判断是否为人民币玩家 if 'user_passwd' in proxy: #把账号密码转换为b64编码格式(字符串先变成bytes类型)必须字符串转为bytes b64_data = base64.b64encode(proxy['user_passwd'].encode()) # 设置账号密码认证 认证方式 编码之后的账号密码 request.headers['Proxy-Authorization'] = 'Basic ' + b64_data.decode() # 设置代理 else: # 免费代理不用认证 request.meta['proxy'] = proxy['ip_port']
-
settings中设置
DOWNLOADER_MIDDLEWARES = { # 'Douban.middlewares.MyCustomDownloaderMiddleware': 543, #注册ip代理 # 'Douban.middlewares.RandomProxy': 544, }
ip代理(自定) PROXY_LIST = [ {'ip_port': '121.232.148.85:9000'}, {'ip_port': '115.223.235.157:9000'}, #收费的ip, 端口 用户名 密码 {"ip_port": "ip:port", "user_passwd": "user:passwd"} ]
在setting中定义代理, 并将其导入到middlewares中 随机获取一个随机用户代理random.choice(), 设置一个用户头代理request.headers[‘User-Agent’] = 随机获取的代理,
五、正向代理与反向代理的区别
-
正向代理:
它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求
在天朝用浏览器访问 www.google.com 时,被残忍的拒绝了,于是你在国外搭建一台代理服务器,让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。 -
反向代理:
隐藏了真实的服务端,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。eg:拨打10086客服电话,可能一个地区的10086客服有几个或者几十个,你永远都不需要关心在电话那头的是哪一个,叫什么,男的,还是女的,漂亮的还是帅气的,你都不关心,你关心的是你的问题能不能得到专业的解答,你只需要拨通了10086的总机号码,电话那头总会有人会回答你,只是有时慢有时快而已。那么这里的10086总机号码就是我们说的反向代理。客户不知道真正提供服务人的是谁。
两者的区别在于代理的对象不一样:
正向代理代理的对象是客户端,反向代理代理的对象是服务端