1. 程式人生 > >scrapy代理的配置方法

scrapy代理的配置方法

根據最新的scrapy官方文件,scrapy爬蟲框架的代理配置有以下兩種方法:

一.使用中介軟體DownloaderMiddleware進行配置

使用Scrapy預設方法scrapy startproject建立專案後項目目錄結構如下,spider中的crawler是已經寫好的爬蟲程式:
目錄結構
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"

這裡有兩個問題:
一是proxy一定是要寫號http://字首的否則會出現to_bytes must receive a unicode, str or bytes object, got NoneType的錯誤.
二是官方文件中寫到process_request方法一定要返回request物件,response物件或None的一種,但是其實寫的時候不用return,亂寫可能會報錯.
另外如果代理有使用者名稱密碼等就需要在後面再加上一些內容:

# Use the following lines if your proxy requires authentication
proxy_user_pass = "USERNAME:PASSWORD" # setup basic authentication for the proxy encoded_user_pass = base64.encodestring(proxy_user_pass) request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass

此處配置參考:

二.直接在爬蟲程式中設定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(),
            }