下載中間件
下載中間件是scrapy提供用于用于在爬蟲過程中可修改Request和Response地熄,用于擴(kuò)展scrapy的功能
使用方法:
編寫一個Download Middlewares和我們編寫一個pipeline一樣夫嗓,定義一個類抹镊,然后再settings中開啟
Download Middlewares默認(rèn)方法:
處理請求,處理響應(yīng),對應(yīng)兩個方法
process_request(self,request,spider):
? ? 當(dāng)每個request通過下載中間件時锰悼,該方法被調(diào)用
process_response(self,request,response,spider):
? ? 當(dāng)下載器完成http請求,傳遞響應(yīng)給引擎的時候調(diào)用
process_request(request, spider)
當(dāng)每個Request對象經(jīng)過下載中間件時會被調(diào)用,優(yōu)先級越高的中間件,越先調(diào)用称近;該方法應(yīng)該返回以下對象:None/Response對象/Request對象/拋出IgnoreRequest異常
返回None:scrapy會繼續(xù)執(zhí)行其他中間件相應(yīng)的方法;
返回Response對象:scrapy不會再調(diào)用其他中間件的process_request方法,也不會去發(fā)起下載,而是直接返回該Response對象
返回Request對象:scrapy不會再調(diào)用其他中間件的process_request()方法,而是將其放置調(diào)度器待調(diào)度下載
如果這個方法拋出異常,則會調(diào)用process_exception方法
process_response(request, response, spider)
當(dāng)每個Response經(jīng)過下載中間件會被調(diào)用哮塞,優(yōu)先級越高的中間件刨秆,越晚被調(diào)用,與process_request()相反忆畅;該方法返回以下對象:Response對象/Request對象/拋出IgnoreRequest異常衡未。
返回Response對象:scrapy會繼續(xù)調(diào)用其他中間件的process_response方法;
返回Request對象:停止中間器調(diào)用家凯,將其放置到調(diào)度器待調(diào)度下載缓醋;
拋出IgnoreRequest異常:Request.errback會被調(diào)用來處理函數(shù),如果沒有處理绊诲,它將會被忽略且不會寫進(jìn)日志改衩。
隨機(jī)請求頭中間件
爬蟲在頻繁訪問一個頁面的時候,這個請求如果一直保持一致。那么很容易被服務(wù)器發(fā)現(xiàn),從而禁止掉這個請求頭的訪問驯镊。因此我們要在訪問這個頁面之前隨機(jī)的更改請求頭,這樣才可以避免爬蟲被抓。隨機(jī)更改請求頭,可以在下載中間件實(shí)現(xiàn)竭鞍。在請求發(fā)送給服務(wù)器之前,隨機(jī)的選擇一個請求頭板惑。這樣就可以避免總使用一個請求頭
測試請求頭網(wǎng)址: http://httpbin.org/user-agent
在middlewares.py文件中
class RandomUserAgent(object):
? ? def process_request(self,request,spider):
? ? ? ? useragent = random.choice(spider.settings['USER_AGENTS'])
? ? ? ? request.headers['User-Agent'] = useragent
class CheckUserAgent(object):
? ? def process_response(self,request,response,spider):
? ? ? ? print(request.headers['User-Agent'])
? ? ? ? return response
隨機(jī)請求頭
請求頭網(wǎng)址:http://www.useragentstring.com/pages/useragentstring.php?typ=Browser
USER_AGENTS = [ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)", "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0", "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5" ]