Scrapy使用代理爬取網(wǎng)站

timg.jpg

前言

在我們平時使用爬蟲程序采集數(shù)據(jù)時,往往會遇到,因采集速度過快導致的自己網(wǎng)絡ip被目標網(wǎng)站封禁,這種封禁有時候是封幾分鐘,有時候是封一天,封的時間不等,但是這樣會導致我們局域網(wǎng)內(nèi)其他人也無法訪問目標網(wǎng)站,最大的問題是我們無法進行數(shù)據(jù)采集。為了保證正常采集數(shù)據(jù)且本地ip不被封禁,引入代理ip。

代理ip

代理ip有很多種類型,這里我們爬蟲程序一般使用的是http或https的代理ip。
爬蟲使用的話最好用高匿代理

高匿名代理不改變客戶機的請求,這樣在服務器看來就像有個真正的客戶瀏覽器在訪問它,這時客戶的真實IP是隱藏的,服務器端不會認為我們使用了代理。

requests庫使用代理ip

# 準備好的代理ip
proxy = "127.0.0.1:8000"    
proxies = {
        "https": "https://{0}".format(proxy),
        "http": "http://{0}".format(proxy),
 }
res = requests.get(url, proxies=proxies)

以上代碼片段是最簡單的requests庫實現(xiàn)代理ip執(zhí)行g(shù)et請求

線上爬蟲使用代理ip方案

目前爬蟲使用代理的方法很多,這里我簡單說說我在線上環(huán)境使用代理的心得。
首先,我自己維護了一個代理ip池,這個ip池是放在redis中的,也就是說我的所有可使用的代理ip是放在redis中,使用redis的set數(shù)據(jù)結(jié)構(gòu),


image.png

當然了,這里列出的ip都是可使用的,因為在放入redis之前我會使用特定的程序去檢測代理ip的可用性。
代理ip的來源這里我要說一下,最好是越多越好,分好類,付費的,免費的,撥號的,全部拿來用,使用的時候隨機從redis中取一個出來用。代理ip的選擇大家自行查找,或者需要也可給我留言。

scrapy使用代理ip

class RandomProxyMiddleware(object):

    def __init__(self):
        settings = get_project_settings()
        self.PROXY_REDIS_HOST = settings.get('PROXY_REDIS_HOST')
        self.PROXY_REDIS_PORT = settings.get('PROXY_REDIS_PORT')
        self.PROXY_REDIS_PARAMS = settings.get('PROXY_REDIS_PARAMS')
        self.PROXY_REDIS_KEY = settings.get('PROXY_REDIS_KEY')
        self.pool = redis.ConnectionPool(host=self.PROXY_REDIS_HOST,
                                         port=self.PROXY_REDIS_PORT,
                                         db=self.PROXY_REDIS_PARAMS['db'],
                                         password=self.PROXY_REDIS_PARAMS['password'])
        self.conn = redis.StrictRedis(connection_pool=self.pool)

    def process_request(self, request, spider):
        proxy = self.conn.srandmember(self.PROXY_REDIS_KEY)
        proxy = proxy.decode('utf-8')
        proxy = json.loads(proxy)
        ip = proxy['proxy']
        request.meta['proxy'] = "https://%s" % ip

上圖代碼片段自定義一個代理中間件RandomProxyMiddleware,在scrapyprocess_request(self, request, spider)這個方法中使用redis的操作隨機獲取一個代理出來,加到request.meta['proxy']中,便完成了代理中間件的編寫。隨后把RandomProxyMiddleware加到setting文件中,

DOWNLOADER_MIDDLEWARES = {
   'crawl_spider.middlewares.RandomProxyMiddleware': 400,
}

便可完成scrapy增加代理的需求。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容