創建middlewares.py文件。
Scrapy代理IP、Uesr-Agent的切換都是通過DOWNLOADER_MIDDLEWARES進行控制,我們在settings.py同級目錄下創建middlewares.py文件,包裝所有請求。
#middlewares.py
#!/usr/bin/env python3
import random
import base64
from settings import USER_AGENTS
from settings import PROXIES
#隨機的user_Agent
class RandomUserAgent(object):
def process_request(self,request,spider):
useragent = random.choice(USER_AGENTS)
request.headers.setdefault("User-Agent",useragent)
class RandomProxy(object):
proxy = random.choice(PROXIES)
if proxy['proxy'] is None:
request.meta['proxy'] = "http://"+proxy['ip_port']
else:
#對賬戶進行加密
base64_userpasswd = base64.b64encode(proxy['user_passwd'])
#對應到代理服務器的信令格式裡
request.hearers['Proxy-Authorization'] = 'Basic'+base64_userpasswd
request.meta['proxy'] = "http://"+proxy['ip_port']
為什麼HTTP代理要使用base64編碼:
HTTP代理的原理很簡單,就是通過HTTP協議與代理服務器建立連接,協議信令中包含要連接到的遠程主機的IP和端口號,如果有需要身份驗證的話還需要加上授權信息,服務器收到信令後首先進行身份驗證,通過後便與遠程主機建立連接,連接成功之後會返回給客戶端200,表示驗證通過,就這麼簡單,下面是具體的信令格式:
CONNECT 59.64.128.198:21
HTTP/1.1 Host: 59.64.128.198:21
Proxy-Authorization: Basic bGV2I1TU5OTIz
User-Agent: OpenFetion
其中Proxy-Authorization是身份驗證信息,Basic後面的字符串是用戶名和密碼組合後進行base64編碼的結果,也就是對username:password進行base64編碼。
HTTP/1.0 200 Connection established
OK,客戶端收到收面的信令後表示成功建立連接,接下來要發送給遠程主機的數據就可以發送給代理服務器了,代理服務器建立連接後會在根據IP地址和端口號對應的連接放入緩存,收到信令後再根據IP地址和端口號從緩存中找到對應的連接,將數據通過該連接轉發出去。
2. 修改settings.py配置USER_AGENTS和PROXIES
- 添加USER_AGENTS:
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)"
]
- 添加代理IP設置PROXIES:
- 免費代理IP可以網上搜索,或者付費購買一批可用的私密代理IP:
PROXIES = [
{'ip_port':'111.8.60.91:8123','user_passwd','user1:pass1'},
{'ip_port':'111.8.60.92:80','user_passwd','user1:pass1'},
{'ip_port':'111.8.60.93:8000','user_passwd','user1:pass1'}
]
- 除非特殊需要,禁用cookies,防止某些網站根據Cookie來封鎖爬蟲。
COOKIES_ENABLED = False
- 設置下載延遲
DOWNLOAD_DELAY = 3
- 最後設置setting.py裡的DOWNLOADER_MIDDLEWARES,添加自己編寫的下載中間件類。
DOWNLOADER_MIDDLEWARES = {
#'mySpider.middlewares.MyCustomDownloaderMiddleware': 543,
'mySpider.middlewares.RandomUserAgent':1,
'mySpider.middlewares.ProxyMiddleware':100
}
Settings
Scrapy設置(settings)提供了定製Scrapy組件的方法。可以控制包括核心(core),插件(extension),pipeline及spider組件。比如 設置Json Pipeliine、LOG_LEVEL等。
內置設置參考手冊
- BOT_NAME
- 默認: 'scrapybot'
- 當您使用 startproject 命令創建項目時其也被自動賦值。
- CONCURRENT_ITEMS
- 默認: 100
- Item Processor(即 Item Pipeline) 同時處理(每個response的)item的最大值。
- CONCURRENT_REQUESTS
- 默認: 16
- Scrapy downloader 併發請求(concurrent requests)的最大值。
- DEFAULT_REQUEST_HEADERS
- 默認: 如下
{
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
- Scrapy HTTP Request使用的默認header。
- DEPTH_LIMIT
- 默認: 0
- 爬取網站最大允許的深度(depth)值。如果為0,則沒有限制。
- DOWNLOAD_DELAY
- DOWNLOAD_DELAY = 0.25 # 250 ms of delay
- 默認情況下,Scrapy在兩個請求間不等待一個固定的值, 而是使用0.5到1.5之間的一個隨機值 * DOWNLOAD_DELAY 的結果作為等待間隔。
- 默認: 0
- 下載器在下載同一個網站下一個頁面前需要等待的時間。該選項可以用來限制爬取速度, 減輕服務器壓力。同時也支持小數:
- DOWNLOAD_TIMEOUT
- 默認: 180
- 下載器超時時間(單位: 秒)。
- ITEM_PIPELINES
- 默認: {}
- 保存項目中啟用的pipeline及其順序的字典。該字典默認為空,值(value)任意,不過值(value)習慣設置在0-1000範圍內,值越小優先級越高。
- ITEM_PIPELINES = {
- 'mySpider.pipelines.SomethingPipeline': 300,
- 'mySpider.pipelines.ItcastJsonPipeline': 800,
- }
- LOG_ENABLED
- 默認: True
- 是否啟用logging。
- LOG_LEVEL
- 默認: 'DEBUG'
- log的最低級別。可選的級別有: CRITICAL、 ERROR、WARNING、INFO、DEBUG 。
- USER_AGENT
- 默認: "Scrapy/VERSION (+http://scrapy.org)"
- 爬取的默認User-Agent,除非被覆蓋。
點擊關注發私信(基礎視頻),即可獲取下載鏈接:
閱讀更多 互聯網奇點 的文章