scrapy框架中间件,请求头,IP代理
程序员文章站
2022-05-09 13:02:26
...
什么下载器中间件?
引擎与下载器之间的一个组件,一个爬虫可以有很多下载器中间件
为什么要使用下载器中间件,功能
全局修改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'
- 通过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代理
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’] = 随机获取的代理,
上一篇: scrapy 代理中间件,自动获取代理
下一篇: Windows下nmap配置