方法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中打開中間件