赞
踩
scrapy的下载器中间件位于调度器和下载器之间,可用于给请求头中添加user-agent等应用
在middleware.py文件中添加中间件类
from fake_useragent import UserAgent
#自建随机生成User-Agent的类
#任何一个被下载器中间件拦截的request,都得在这里执行随机生成user-agent,并赋值给headers中的参数User-Agent
class XxxxmiddleRandomUaMiddleware(object):
#形参request即为请求对象
def process_request(self,request,spider):
agent = UserAgent().random
#给请求对象request的headers属性(他是一个字典)的键:User-Agent赋值,就实现了user-agent的反爬
request.headers['User-Agent'] = agent
先在middlewares.py文件同级目录下新建proxies.py文件,存放User-Agent代理池
proxy_list = [
'http://'
'http://...'
'http://...'
...
]
middlewares.py中
import random
from .proxies import proxy_list
class BaidumiddleRandomProxyMiddleware(object):
def process_request(self,request,spider):
proxy = random.choice(proxy_list)
request.meta['proxy'] = proxy
#使用process_exception()处理异常
#有些proxy经常不能用了,需要处理异常:处理的方式是再让他选代理
def process_exception(self,request,exception,spider):
#将request请求对象再次交给中间件,继续找proxy,一直找到能用的proxy
return request
class BaiduCookieMiddleware(object):
def process_request(self,request,spider):
cookies = self.get_cookies()
#Request()中所有参数都是请求对象request的属性
request.cookies = cookies
#把cookie处理成字典
def get_cookies(self):
cookie = '...' #你的cookie(从前端ctrl+shift+i中获取)
cookies = {}
c_list = cookie.split(';')
for c in c_lsit:
cookies[c.split('=')[0]] = c.split('=')[1]
return cookies
settings.py中配置中间件
#将随机赋值user-agent的中间件添加上
DOWNLOADER_MIDDLEWARES = {
'Xxxxmiddle.middlewares.XxxxmiddleDownloaderMiddleware':500,
'Xxxxmiddle.middlewares.XxxxmiddleRandomUaMiddleware':200,
'Xxxxmiddle.middleware.XxxxmiddleRandomProxyMiddleware':249,
'Xxxxmiddle.middleware.XxxxCookieMiddleware':199
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。