人生苦短,我用 Pythonpython
前文傳送門:git
小白學 Python 爬蟲(1):開篇github
小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝web
小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門chrome
小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門數據庫
小白學 Python 爬蟲(5):前置準備(四)數據庫基礎瀏覽器
小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝安全
小白學 Python 爬蟲(10):Session 和 Cookies
小白學 Python 爬蟲(11):urllib 基礎使用(一)
小白學 Python 爬蟲(12):urllib 基礎使用(二)
小白學 Python 爬蟲(13):urllib 基礎使用(三)
小白學 Python 爬蟲(14):urllib 基礎使用(四)
小白學 Python 爬蟲(15):urllib 基礎使用(五)
小白學 Python 爬蟲(16):urllib 實戰之爬取妹子圖
小白學 Python 爬蟲(17):Requests 基礎使用
小白學 Python 爬蟲(18):Requests 進階操做
小白學 Python 爬蟲(21):解析庫 Beautiful Soup(上)
小白學 Python 爬蟲(22):解析庫 Beautiful Soup(下)
小白學 Python 爬蟲(23):解析庫 pyquery 入門
小白學 Python 爬蟲(26):爲啥買不起上海二手房你都買不起
小白學 Python 爬蟲(27):自動化測試框架 Selenium 從入門到放棄(上)
小白學 Python 爬蟲(28):自動化測試框架 Selenium 從入門到放棄(下)
小白學 Python 爬蟲(29):Selenium 獲取某大型電商網站商品信息
咱們在使用爬蟲的時候,常常遇到一種狀況,剛開始的運行的時候,都如絲般順滑,可能一杯茶的功夫,就完犢子了,可能會出現各類各樣的限制,好比 403 Forbidden 、 429 Too Many Request 等等。
這時候,頗有可能就是咱們的 IP 被限制了。
出現以上問題通常是由於網站的安全限制或者是機房的安全限制,有時候實在服務器上作檢測,有時候是在網關處作檢測,一旦發現某個 IP 在單位時間內的訪問次數超過了當前限定的某個閥值,就會直接拒絕服務,這種狀況咱們統稱爲:封 IP 。
對於上面這種狀況難道咱們就這麼認了麼,固然不!
代理就是爲了解決這個問題的。
代理解決上面這個問題的方式就是請求中間增長的代理服務器作轉發,原本請求是由 A 直接訪問到服務器 C 的,如: A -> C ,加了代理 B 以後就變成了這個樣子: A -> B -> C 。
在作實戰以前,咱們先了解下如何獲取代理。
首先在百度上輸入 「代理」 兩個字進行查詢,能夠看到有不少提供代理服務的網站,固然哈,大多數都是收費的。可是其中不乏會有一部分免費的代理。
固然免費的代理會有各類各樣的坑,好比常常性連不通,好比網絡延遲很是高等等等等。
可是,人家免費啊,還要啥自行車。
固然若是想要得到穩定的、網絡延時低的代理服務,建議付費使用,畢竟用的少也花不了多少鈔票。
代理的站點小編就不列舉了,是在太多,咱們隨便打開一個免費代理的網站:
能夠發現,代理好像分兩種,一種是高匿代理,還有一種是透明代理,這兩個有什麼區別呢?
其實,除了高匿代理和透明代理之外,還有一種中間形態叫作匿名代理。
這幾種代理之間的區別在於轉發請求的頭部參數不一樣。
目標服務器能夠知道咱們使用了代理,而且也知道咱們的真實 IP 。 透明代理訪問目標服務器所帶的 HTTP 頭信息以下:
透明代理仍是將咱們的真實IP發送給了對方服務器,所以沒法達到隱藏身份的目的。
目標服務器能夠知道咱們使用了代理,但不知道咱們的真實 IP 。匿名代理訪問目標服務器所帶的 HTTP 頭信息以下:
匿名代理隱藏了咱們的真實IP,可是向目標服務器透露了咱們是使用代理服務器訪問他們的。
目標服務器不知道咱們使用了代理,更不知道咱們的真實 IP 。高匿代理訪問目標服務器所帶的 HTTP 頭信息以下:
高匿代理隱藏了咱們的真實 IP ,同時目標服務器也不知道咱們使用了代理,所以隱蔽度最高。
能夠看到,處於中間態的匿名代理,事情作了一半沒作完,反而是沒什麼用武之地的。
上面咱們看到了一些代理服務,接下來咱們看一下各類 HTTP 請求庫設置代理的方式:
咱們先使用 urllib 來作測試,測試的連接就選擇:https://httpbin.org/get 這個咱們以前用過的測試連接,訪問該站點能夠獲得請求的一些相關信息,其中 origin 字段就是請求來源的 IP,咱們能夠根據它來判斷代理是否設置成功,也就是是否成功假裝了 IP ,代理嘛小編就在網上隨便找了個免費的高匿代理,示例以下:
from urllib.error import URLError
from urllib.request import ProxyHandler, build_opener
proxy_handler = ProxyHandler({
'http': 'http://182.34.37.0:9999',
'https': 'https://117.69.150.84:9999'
})
opener = build_opener(proxy_handler)
try:
response = opener.open('https://httpbin.org/get')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)複製代碼
代碼很簡單,咱們看下執行結果:
{
"args": {},
"headers": {
"Accept-Encoding": "identity",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.7"
},
"origin": "117.69.150.84, 117.69.150.84",
"url": "https://httpbin.org/get"
}複製代碼
能夠看到,目標服務器已經認爲咱們是由代理訪問的了, origin 參數顯示的是咱們的代理服務器的 IP 。
注意: 這裏咱們使用了 ProxyHandler 來進行代理設置,ProxyHandler 的參數類型是字典類型, key 是咱們使用的協議,而值是咱們具體所使用的代理,小編這裏設置了兩個代理,一個是 http 的還有一個是 https 的,當咱們請求的連接是 http 的會自動的選擇咱們的 http 的代理,當咱們的請求的連接是 https 的時候則會自動的選擇咱們設置的 https 的代理。
對於 Requests 來說,代理的設置更加的簡單加直白。示例代碼以下:
import requests
proxies = {
'http': 'http://59.52.186.117:9999',
'https': 'https://222.95.241.6:3000',
}
try:
response = requests.get('https://httpbin.org/get', proxies = proxies)
print(response.text)
except requests.exceptions.ConnectionError as e:
print('Error', e.args)複製代碼
結果以下:
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0"
},
"origin": "222.95.241.6, 222.95.241.6",
"url": "https://httpbin.org/get"
}複製代碼
小編這裏選擇的仍是高匿代理,因此這裏顯示出來的 IP 仍是咱們代理的 IP 。
Selenium 一樣能夠設置代理,同時也很是簡單,示例以下:
from selenium import webdriver
proxy = '222.95.241.6:3000'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=https://' + proxy)
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get('https://httpbin.org/get')複製代碼
結果以下:
設置 FireFox 瀏覽器和設置 Chrome 瀏覽器近乎同樣,惟一的區別就是在初始化的時候初始化一個 FireFox ,而且在這是啓動參數的是時候使用 FirefoxOptions()
方法,其餘的無任何區別,同窗們能夠本身嘗試下。
由於免費代理的連通率和穩定性確實不高,小編這裏找了幾個免費代理的網站,僅供你們參考使用:
http://www.ip3366.net/
https://www.kuaidaili.com/free/
https://www.xicidaili.com/
本系列的全部代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,方便你們取用。
https://www.jianshu.com/p/bb00a288ee5f