小白學 Python 爬蟲(30):代理基礎

人生苦短,我用 Pythonpython

前文傳送門:git

小白學 Python 爬蟲(1):開篇github

小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝web

小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門chrome

小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門數據庫

小白學 Python 爬蟲(5):前置準備(四)數據庫基礎瀏覽器

小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝安全

小白學 Python 爬蟲(7):HTTP 基礎服務器

小白學 Python 爬蟲(8):網頁基礎網絡

小白學 Python 爬蟲(9):爬蟲基礎

小白學 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 爬蟲(19):Xpath 基操

小白學 Python 爬蟲(20):Xpath 進階

小白學 Python 爬蟲(21):解析庫 Beautiful Soup(上)

小白學 Python 爬蟲(22):解析庫 Beautiful Soup(下)

小白學 Python 爬蟲(23):解析庫 pyquery 入門

小白學 Python 爬蟲(24):2019 豆瓣電影排行

小白學 Python 爬蟲(25):爬取股票信息

小白學 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 頭信息以下:

  • REMOTE_ADDR = 代理服務器IP
  • HTTP_VIA = 代理服務器IP
  • HTTPXFORWARDED_FOR = 咱們的真實IP

透明代理仍是將咱們的真實IP發送給了對方服務器,所以沒法達到隱藏身份的目的。

匿名代理

目標服務器能夠知道咱們使用了代理,但不知道咱們的真實 IP 。匿名代理訪問目標服務器所帶的 HTTP 頭信息以下:

  • REMOTE_ADDR = 代理服務器IP
  • HTTP_VIA = 代理服務器IP
  • HTTPXFORWARDED_FOR = 代理服務器IP

匿名代理隱藏了咱們的真實IP,可是向目標服務器透露了咱們是使用代理服務器訪問他們的。

高匿代理

目標服務器不知道咱們使用了代理,更不知道咱們的真實 IP 。高匿代理訪問目標服務器所帶的 HTTP 頭信息以下:

  • REMOTE_ADDR = 代理服務器IP
  • HTTP_VIA 不顯示
  • HTTPXFORWARDED_FOR 不顯示

高匿代理隱藏了咱們的真實 IP ,同時目標服務器也不知道咱們使用了代理,所以隱蔽度最高。

能夠看到,處於中間態的匿名代理,事情作了一半沒作完,反而是沒什麼用武之地的。

代理設置

上面咱們看到了一些代理服務,接下來咱們看一下各類 HTTP 請求庫設置代理的方式:

urllib

咱們先使用 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

對於 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

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 上,方便你們取用。

示例代碼-Github

示例代碼-Gitee

參考

https://www.jianshu.com/p/bb00a288ee5f

若是個人文章對您有幫助,請掃碼關注下做者的公衆號:獲取最新干貨推送:)
相關文章
相關標籤/搜索