scrapy框架中介軟體,請求頭,IP代理
阿新 • • 發佈:2019-02-08
什麼下載器中介軟體?
引擎與下載器之間的一個元件,一個爬蟲可以有很多下載器中介軟體
為什麼要使用下載器中介軟體,功能
全域性修改Scrapy request和response
scrapy 下載器中介軟體:
編輯檔案middleware.py檔案
編寫處理方法
處理請求 process_request(self, request, spider)
新增:使用者頭 新增IP代理等功能
配置settings
在settings檔案中配置DOWNLOADER_MIDDLEWARES引數
為什麼模擬使用者頭、IP代理?
一句話:為了反反爬
(一)隨機請求自己構建請求ua池
from Douban.settings import USER_AGENT_LIST
import random
class RandomUserAgent(object):
# 定義一箇中間鍵類
# 使用者代理
def process_request(self, request, spider):
# 檢驗一下請求頭
# print(request.headers['User-Agent'])
# 獲取一個請求頭
ua = random.choice(USER_AGENT_LIST)
# 設定請求頭代理
request.headers['User-Agent'] = ua
setting配置
DOWNLOADER_MIDDLEWARES = {
# 'Douban.middlewares.MyCustomDownloaderMiddleware': 543,
#註冊請求頭使用者代理
'Douban.middlewares.RandomUserAgent': 543,
}
#自定義請求頭,使用者代理(自定)
USER_AGENT_LIST =[
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; HCI0449; .NET CLR 1.0.3705) " ,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; i-NavFourF; .NET CLR 1.1.4322) ",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon; "
]
解釋
請求頭(使用者)代理 隨機)
定一箇中間鍵類,重寫process_request(self,request, spider)方法,
對request的處理進行相應的配置,並把配置好以後,
並把響應的類註冊到setting檔案中。
引數[request,spider],並檢驗請求頭。Print(request.headers[‘User-Agent’])。
需要在setting中DOWNLOADER_MIDDLEWARES(自定義中間鍵)配置
`檢視使用者是用哪個代理請求頭,在爬蟲中parse_item方法下這裡`
print(response.request.headers[‘User-Agent’]
(二)隨機切換User-Agent的庫
安裝:pip install fake-useragent
class RandomUserAgentMiddleware(object):
def __init__(self,crawler):
super(RandomUserAgentMiddleware, self).__init__()
self.ua = UserAgent()
self.ua_type = crawler.settings.get('RANDOM_UA_TYPE','random')
@classmethod
def from_crawler(cls,crawler):
return cls(crawler)
def process_request(self,request,spider):
def get_ua():
return getattr(self.ua,self.ua_type)
request.headers.setdefault('User-Agent',get_ua()
setting配置
DOWNLOADER_MIDDLEWARES = {
'liebiao.middlewares.MyCustomDownloaderMiddleware': 543,
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}
RANDOM_UA_TYPE= 'random'
- 通過crawler.settings.get來獲取配置檔案中的配置,如果沒有配置則預設是random,如果配置了ie或者chrome等就會獲取到相應的配置
- 在process_request方法中我們嵌套了一個get_ua方法,get_ua其實就是為了執行ua.ua_type
- 但是這裡無法使用self.ua.self.us_type,所以利用了getattr方法來直接獲取,最後通過request.heasers.setdefault來設定User-Agent
(三)隨機切換IP代理
from scrapy import signals
import random
import base64
from Douban.settings import PROXY_LIST
class RandomProxy(object):
def process_request(self, request, spider):
# 隨機取出一個代理ip
proxy = random.choice(PROXY_LIST)
# 判斷是否為人民幣玩家
if 'user_passwd' in proxy:
#把賬號密碼轉換為b64編碼格式(字串先變成bytes型別)必須字串轉為bytes
b64_data = base64.b64encode(proxy['user_passwd'].encode())
# 設定賬號密碼認證 認證方式 編碼之後的賬號密碼
request.headers['Proxy-Authorization'] = 'Basic ' + b64_data.decode()
# 設定代理
else:
# 免費代理不用認證
request.meta['proxy'] = proxy['ip_port']
settings中設定
DOWNLOADER_MIDDLEWARES = {
# 'Douban.middlewares.MyCustomDownloaderMiddleware': 543,
#註冊ip代理
# 'Douban.middlewares.RandomProxy': 544,
}
ip代理(自定)
PROXY_LIST = [
{'ip_port': '121.232.148.85:9000'},
{'ip_port': '115.223.235.157:9000'},
#收費的ip, 埠 使用者名稱 密碼
{"ip_port": "ip:port", "user_passwd": "user:passwd"}
]
在setting中定義代理,
並將其匯入到middlewares中
隨機獲取一個隨機使用者代理random.choice(),
設定一個使用者頭代理request.headers[‘User-Agent’] = 隨機獲取的代理,