方法1
在生成Request请求对象的时候,把代理ip以字典的形式传递给meta
# 爬虫.py class T1Spider(scrapy.Spider): name = 't1' allowed_domains = ['baidu.com'] start_urls = ['https://baidu.com/'] def parse(self, response): proxyip = get_ip() # 这个是获取ip的函数,返回类似 '127.0.0.1:8000'的字符串 yield scrapy.Request( url = 'https://baidu.com/', callback= self.p1, # 回调函数 meta={'proxy':'https://' + proxyip}, # 这个的meta接收的对象需要是个字典 # 协议类型需要看请求对应需要的协议头 )
方法2
在中间件的中 process_request 方法中 把代理ip 传递给Request对象的meta属性
# 中间件.py
class Test1DownloaderMiddleware: def process_request(self, request, spider): # 这个是获取ip的函数,返回类似 '127.0.0.1:8000'的字符串 def get_ip(): '''获取代理ip''' url = 'http://192.168.3.249:9999/api/v1/getIp' return (requests.get(url).json()['ip']) def change_proxy_in_middleware(): '''下载器中间件中设置代理 定义在process_request内部可以直接使用request这个实例对象 ''' ht = (re.search(r'(.*?)://', request.url).group()) # 获取协议类型 proxy_ip = ht + get_ip() # 协议 + ip ---> 代理 request.meta['proxy'] = proxy_ip # 把代理传递给request change_proxy_in_middleware() # 把过程封装在了函数内部,所以这也一定要进行调用 return None
记得在settings.py中打开中间件
