[英]Scrapy sends an request using the specified network card python 3
我創建了一個scrapy項目,它運行良好,我希望它可以托管在服務器上以每天運行,並且可以正常運行,但是我的服務器有兩個網卡,其中一個專門為scrapy添加,仍然可以正常工作,但是我想僅將一張網卡用於scrapy或python,我可以指定此網卡Python或Scrapy可以使用。
伺服器:Windows 10
的Python:3.6
cra草:1.5
我一直在尋找解決方案,發現此Python使用 Internet上的指定網卡發送了HTTP請求 ,但實際上,我不知道如何使用它。
請幫助我解決此解決方案,例如將Network Card分配給python或將Network card分配給scrapy用於請求網站的套接字或核心庫。
我深挖的解決方案,我發現scrapy本身提供的請求元bindaddress
屬性來指定地址,通過綁定過程完成。
但是似乎草率的文檔沒有顯示如何使用它,但是我想出了一個下載中間件,該中間件可以修改請求並解決我的問題,因此我將其稱為BindAddressMiddleware
。
中間件做什么? 它使用設置
IS_MORE_NETWORK_CARDS = True
,如果為False
則使用特定的網卡,否則不會使用
BIND_ADDRESS = 127.0.0.1
要使用的網卡的IP
在settings.py
使用下載的中間件來抓取項目
DOWNLOADER_MIDDLEWARES = {
# Bindaddress
'scrapers22.middlewares.BindAddressMiddleware': 400,
}
BindAddressMiddleware
下載中間件
class BindAddressMiddleware(object):
def __init__(self, settings):
self.is_bindaddress = settings.get('IS_MORE_NETWORK_CARDS')
if self.is_bindaddress:
self.bindaddress = settings.get('BIND_ADDRESS')
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.settings)
def process_request(self, request, spider):
if self.is_bindaddress:
if self.bindaddress:
request.meta['bindaddress'] = (self.bindaddress, 0)
return None
def spider_opened(self, spider):
spider.logger.info('Using: %s as bindaddress' % self.bindaddress)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.