0
点赞
收藏
分享

微信扫一扫

scrapy框架中间件,请求头,IP代理


什么下载器中间件?

引擎与下载器之间的一个组件,一个爬虫可以有很多下载器中间件

为什么要使用下载器中间件,功能

全局修改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’]

​​(二)随机切换User-Agent的库​​

安装:pip install fake-useragent

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'

  1. 通过crawler.settings.get来获取配置文件中的配置,如果没有配置则默认是random,如果配置了ie或者chrome等就会获取到相应的配置
  2. 在process_request方法中我们嵌套了一个get_ua方法,get_ua其实就是为了执行ua.ua_type
  3. 但是这里无法使用self.ua.self.us_type,所以利用了getattr方法来直接获取,最后通过request.heasers.setdefault来设置User-Agent
  4. 通过上面的配置我们就实现了每次请求随机更换User-Agent

(三)随机切换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’] = 随机获取的代理,


举报

相关推荐

0 条评论