scrapy设置代理的方法
根據最新的scrapy官方文檔,scrapy爬蟲框架的代理配置有以下兩種方法:
1.使用中間件DownloaderMiddleware進行配置
在settings.py文件中,找到DOWNLOADER_MIDDLEWARES它是專門用來用配置scrapy的中間件.我們可以在這里進行自己爬蟲中間鍵的配置,配置后如下:
DOWNLOADER_MIDDLEWARES = {'WandoujiaCrawler.middlewares.ProxyMiddleware': 100, }其中WandoujiaCrawler是我們的項目名稱,后面的數字代表中間件執行的優先級。
官方文檔中默認proxy中間件的優先級編號是750,我們的中間件優先級要高于默認的proxy中間鍵。
中間件middlewares.py的寫法如下(scrapy默認會在這個文件中寫好一個中間件的模板,不用管它寫在后面即可):
# -*- coding: utf-8 -*- class ProxyMiddleware(object):def process_request(self, request, spider):request.meta['proxy'] = "http://proxy.yourproxy:8001"這里有兩個注意的問題:
-
1.是proxy一定是要寫成 http:// 前綴,否則會出現to_bytes must receive a unicode, str or bytes object, got NoneType的錯誤.
-
2.是官方文檔中寫到process_request方法一定要返回request對象,response對象或None的一種,但是其實寫的時候不用return,亂寫可能會報錯。另外如果代理有用戶名密碼等就需要在后面再加上一些內容:
此處配置參考:
http://www.pythontab.com/html/2014/pythonweb_0326/724.html
2.直接在爬蟲程序中設置proxy字段
我們可以直接在自己具體的爬蟲程序中設置proxy字段,代碼如下,直接在構造Request里面加上meta字段即可:
class QuotesSpider(scrapy.Spider):name = "quotes"def start_requests(self):urls = ['http://quotes.toscrape.com/page/1/','http://quotes.toscrape.com/page/2/',]for url in urls:yield scrapy.Request(url=url, callback=self.parse, meta={'proxy': 'http://proxy.yourproxy:8001'})def parse(self, response):for quote in response.css('div.quote'):yield {'text': quote.css('span.text::text').extract_first(),'author': quote.css('span small::text').extract_first(),'tags': quote.css('div.tags a.tag::text').extract(),}3:通過內置的環境變量
這是在我們的start_request里面,代碼如下:(該方法比較low ,不推薦使用)
def start_requests(self):# 這里是代理ipimport osos.environ["HTTPS_PROXY"] = '37.187.149.129:1080'os.environ["HTTP_PROXY"] = '202.29.212.213:443'# 重寫了start_requests一定要重寫這個不然不能爬取了。#方法一:#for url in self.start_urls:# yield Request(url=url)# 方法二:request_list = []for url in self.start_urls:request_list.append(Request(url=url))return request_list提示一下:meta的優先級要高于環境變量的。
總結
以上是生活随笔為你收集整理的scrapy设置代理的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: twisted.internet.err
- 下一篇: Scrapy中的get_project_