本文轉載自:Python 爬蟲的代理 IP 設置方法匯總 https://www.makcyun.top/web_scraping_withpython15.html
需要學習的地方:如何在爬蟲中使用代理IP
Requests 和 Scrapy 中的代理 IP 設置。
摘要:對於采取了比較強的反爬措施網站來說,要想順利爬取網站數據,設置隨機 User-Agent 和代理 IP 是非常有效的兩個方法,繼上一篇文章介紹了隨機 UserAgent 的設置方法之后,本文接着介紹如何在 Requests 和 Scrapy 中設置代理 IP。
上一篇文章見:
∞ Scrapy 中設置隨機 User-Agent 的方法匯總
本文的目標測試網頁選擇下面這個 URL,請求該網頁可以返回當前的 IP 地址:
下面,我們就先來說說 Requests 中如何設置代理 IP。
Requests
▌不使用代理
首先,先來看一下不使用代理 IP 的情況:
import requests |
運行上面的程序,會返回我們電腦本機的 IP,可以通過百度查詢 IP 地址對比一下就知道了。
200 |
▌使用代理
然后,我們測試一下使用代理后的情況。
常見的代理包括 HTTP 代理和 SOCKS5 代理,前者可以找一些免費代理 IP 進行測試,由於我電腦上使用的是 Shadowsocks,所以就介紹一下 SOCKS5 代理的設置。
首先,電腦上要安裝有 Shadowsocks ,如果你還沒聽過或者使用過這個神器,可以參考下我之前寫的篇文章:
啟動該軟件后默認會在 1080 端口下創建 SOCKS5 代理服務,代理為:127.0.0.1:1080
,然后我們在 Requests 中使用該代理,方法很簡單只需要添加一項 proxies 參數即可:
proxies = [ |
這里,proxies 參數是字典類型,鍵名'http'
表示協議類型,鍵值 'socks5://127.0.0.1:1080'
表示代理,這里添加了 http 和 https 兩個代理,這樣寫是因為有些網頁采用 http 協議,有的則是采用 https 協議,為了在這兩類網頁上都能順利使用代理,所以一般都同時寫上,當然,如果確定了某網頁的請求類型,可以只寫一種,比如這里我們請求的 url 使用的是 http 協議,那么使用 http 代理就可以,random 函數用來隨機選擇一個代理,我們來看一下結果:
{'http': 'socks5://127.0.0.1:1080'} |
可以看到,這里隨機選擇了 http 協議的代理后,返回的 IP 就是我真實的 IP 代理地址,成功代理后就可以爬一些牆外的網頁了。
延伸一下,假如隨機選擇的是 https 代理,那么返回的 IP 結果還一樣么?我們嘗試重復運行一下上面的程序:
{'https': 'socks5://127.0.0.1:1080'} |
可以看到這次使用了 https 代理,返回的 IP 卻是本機的真實 IP,也就是說代理沒有起作用。
進一步地,我們將 url 改為 https 協議 'https://icanhazip.com'
,然后再嘗試分別用 http 和 https 代理請求,查看一下結果:
#http 請求 |
可以看到,兩種請求的結果和之前的剛好相反了,由於 url 采用了 https 協議,則起作用的是 https 代理,而 http 代理則不起作用了,所以顯示的是本機 IP。
因此,可以得到這樣的一個結論:
HTTP 代理,只代理 HTTP 網站,對於 HTTPS 的網站不起作用,也就是說,用的是本機 IP。
HTTPS 代理則同理。
▌使用付費代理
上面,我們只使用了一個代理,而在爬蟲中往往需要使用多個代理,那有如何構造呢,這里主要兩種方法,一種是使用免費的多個 IP,一種是使用付費的 IP 代理,免費的 IP 往往效果不好,那么可以搭建 IP 代理池,但對新手來說搞一個 IP 代理池成本太高,如果只是個人平時玩玩爬蟲,完全可以考慮付費 IP,幾塊錢買個幾小時動態 IP,多數情況下都足夠爬一個網站了。
這里推薦一個付費代理「阿布雲代理」,最近使用了一下,效果非常不錯,5 塊錢買了 5個小時,爬完了一個網站,所以沒有必要為了省 5 塊錢,而費勁地去搞 IP 代理池。
首次使用的話,可以選擇購買一個小時的動態版試用下,點擊生成隧道代理信息作為憑證加入到代碼中。
將信息復制到官方提供的 Requests 代碼中,運行來查看一下代理 IP 的效果:
import requests |
可以看到每次請求都會使用不同的 IP,是不是很簡單?比搞 IP 代理池省事多了。
以上,介紹了 Requests 中設置代理 IP 的方法,下面我們接着介紹在 Scrapy 中如何設置。
Scrapy
▌middlewares.py 中設置
這種方法需要先在 middlewares.py 中設置代理 IP 中間件:
import random |
接着,需要在 settings.py 添加幾個在西刺上找的代理 IP,格式如下:
PROXIES = [ |
然后,我們仍然以 “http://icanhazip.com" 為目標網頁,運行 Scrapy 項目重復請求 5 次,查看一下每次返回的 IP 情況:
def start_requests(self): |
結果如下:
可以看到部分 IP 成功請求得到了相應,部分 IP 則無效請求失敗,因為這幾個 IP 是免費的 IP,所有失效很正常。
▌使用付費代理
接下來我們使用阿布雲付費代理,繼續嘗試一下,在 middlewares.py 中添加下面的代碼:
""" 阿布雲ip代理配置,包括賬號密碼 """ |
由於,在阿布雲購買的是最基礎的代理,即每秒 5 個請求,因為 Scrapy 默認的並發數是 16 個,所以需要對 Scrapy 請求數量進行一下限制,可以設置每個請求的延遲時間為 0.2s ,這樣一秒就剛好請求 5 個,最后啟用上面的代理中間件類即可:
""" 啟用限速設置 """ |
然后同樣地請求 5 次,查看每次請求返回的 IP :
可以看到,每個 IP 都順利請求成功了,所以說付費地效果還是好。
▌使用 scrapy-proxies 庫代理
除了上述兩種方法,我們還可以使用 GitHub 上的一個 IP 代理庫:scrapy-proxies,庫的使用方法很簡單, 三個步驟就可以開啟代理 IP。
首先,運行下面命令安裝好這個庫:
pip install scrapy_proxies |
然后,在 Scrapy 項目中的 settings.py 文件中,添加下面一段代碼:
RETRY_TIMES = 3 # 自定義請求失敗重試次數 |
最后,需要提供多個代理 IP,我們在西刺上隨便找幾個 IP,然后存放在 PROXY_LIST 指定的 txt 文件中即可,格式如下:
https://119.101.112.176:9999 |
然后重復之前的操作,查看代理 IP 的設置效果。
我在使用該庫的過程中,發現有一些問題,不知道是配置不對還是怎么回事,效果不是太好,所以推薦使用前兩種方法。
好,以上就是在 Requests 和 Scrapy 中使用代理 IP 的方法總結,如果爬蟲項目不大、追求穩定且不差錢的話,建議直接上付費代理。