Python3 中代理使用方法總結

作者:崔慶才 請勿轉載

配套免費視頻教程:Python3爬蟲三大案例實戰分享:貓眼電影、今日頭條街拍美圖、淘寶美食 Python3爬蟲三大案例實戰分享

爬取知乎所有用戶詳細信息 edu.hellobi.com/course/ 知乎源碼:Germey/Zhihu

學爬蟲我們已經了解了多種請求庫,如 Requests、Urllib、Selenium 等。我們接下來首先貼近實戰,了解一下代理怎麼使用。

下面我們來梳理一下這些庫的代理的設置方法。

1. 獲取代理

在做測試之前,我們需要先獲取一個可用代理,搜索引擎搜索「代理」關鍵字,就可以看到有許多代理服務網站,在網站上會有很多免費代理,比如西刺:xicidaili.com/,這裡列出了很多免費代理,但是這些免費代理大多數情況下都是不好用的,所以比較靠譜的方法是購買付費代理,很多網站都有售賣,數量不用多,買一個穩定可用的即可,可以自行選購。

或者如果我們本機有相關代理軟體的話,軟體一般會在本機創建 HTTP 或 SOCKS 代理服務,直接使用此代理也可以。

在這裡我的本機安裝了一部代理軟體,它會在本地 9743 埠上創建 HTTP 代理服務,也就是代理為 127.0.0.1:9743,另外還會在 9742 埠創建 SOCKS 代理服務,也就是代理為 127.0.0.1:9742,我只要設置了這個代理就可以成功將本機 IP 切換到代理軟體連接的伺服器的 IP了。

所以本節下面的示例里我使用上述代理來演示其設置方法,你可以自行替換成自己的可用代理,設置代理後測試的網址是:httpbin.org/get,訪問該站點可以得到請求的一些相關信息,其中 origin 欄位就是客戶端的 IP,我們可以根據它來判斷代理是否設置成功,也就是是否成功偽裝了IP。

下面我們來看下各個庫的代理設置方式。

2. Urllib

首先我們以最基礎的 Urllib 為例,來看一下代理的設置方法,代碼如下:

from urllib.error import URLErrornfrom urllib.request import ProxyHandler, build_openernnproxy = 127.0.0.1:9743nproxy_handler = ProxyHandler({n http: http:// + proxy,n https: https:// + proxyn})nopener = build_opener(proxy_handler)ntry:n response = opener.open(http://httpbin.org/get)n print(response.read().decode(utf-8))nexcept URLError as e:n print(e.reason)n

運行結果如下:

{n "args": {}, n "headers": {n "Accept-Encoding": "identity", n "Connection": "close", n "Host": "httpbin.org", n "User-Agent": "Python-urllib/3.6"n }, n "origin": "106.185.45.153", n "url": "http://httpbin.org/get"n}n

在這裡我們需要藉助於 ProxyHandler 設置代理,參數是字典類型,鍵名為協議類型,鍵值是代理,注意此處代理前面需要加上協議,即 http 或者 https,此處設置了 http 和 https 兩種代理,當我們請求的鏈接是 http 協議的時候,它會調用 http 代理,當請求的鏈接是 https 協議的時候,它會調用https代理,所以此處生效的代理是:http://127.0.0.1:9743。

創建完 ProxyHandler 對象之後,我們需要利用 build_opener() 方法傳入該對象來創建一個 Opener,這樣就相當於此 Opener 已經設置好代理了,接下來直接調用它的 open() 方法即可使用此代理訪問我們所想要的鏈接。

運行輸出結果是一個 Json,它有一個欄位 origin,標明了客戶端的 IP,此處的 IP 驗證一下,確實為代理的 IP,而並不是我們真實的 IP,所以這樣我們就成功設置好代理,並可以隱藏真實 IP 了。

如果遇到需要認證的代理,我們可以用如下的方法設置:

from urllib.error import URLErrornfrom urllib.request import ProxyHandler, build_openernnproxy = username:password@127.0.0.1:9743nproxy_handler = ProxyHandler({n http: http:// + proxy,n https: https:// + proxyn})nopener = build_opener(proxy_handler)ntry:n response = opener.open(http://httpbin.org/get)n print(response.read().decode(utf-8))nexcept URLError as e:n print(e.reason)n

這裡改變的只是 proxy 變數,只需要在代理前面加入代理認證的用戶名密碼即可,其中 username 就是用戶名,password 為密碼,例如 username 為foo,密碼為 bar,那麼代理就是 foo:bar@127.0.0.1:9743。

如果代理是 SOCKS5 類型,那麼可以用如下方式設置代理:

import socksnimport socketnfrom urllib import requestnfrom urllib.error import URLErrornnsocks.set_default_proxy(socks.SOCKS5, 127.0.0.1, 9742)nsocket.socket = socks.socksocketntry:n response = request.urlopen(http://httpbin.org/get)n print(response.read().decode(utf-8))nexcept URLError as e:n print(e.reason)n

此處需要一個 Socks 模塊,可以通過如下命令安裝:

pip3 install PySocksn

本地我有一個 SOCKS5 代理,運行在 9742 埠,運行成功之後和上文 HTTP 代理輸出結果是一樣的:

{n "args": {}, n "headers": {n "Accept-Encoding": "identity", n "Connection": "close", n "Host": "httpbin.org", n "User-Agent": "Python-urllib/3.6"n }, n "origin": "106.185.45.153", n "url": "http://httpbin.org/get"n}n

結果的 origin 欄位同樣為代理的 IP,設置代理成功。

3. Requests

對於 Requests 來說,代理設置更加簡單,我們只需要傳入 proxies 參數即可。

還是以上例中的代理為例,我們來看下 Requests 的代理的設置:

import requestsnnproxy = 127.0.0.1:9743nproxies = {n http: http:// + proxy,n https: https:// + proxy,n}ntry:n response = requests.get(http://httpbin.org/get, proxies=proxies)n print(response.text)nexcept requests.exceptions.ConnectionError as e:n print(Error, e.args)n

運行結果:

{n "args": {}, n "headers": {n "Accept": "*/*", n "Accept-Encoding": "gzip, deflate", n "Connection": "close", n "Host": "httpbin.org", n "User-Agent": "python-requests/2.18.1"n }, n "origin": "106.185.45.153", n "url": "http://httpbin.org/get"n}n

可以發現 Requests 的代理設置比 Urllib 簡單很多,只需要構造代理字典即可,然後通過 proxies 參數即可設置代理,不需要重新構建 Opener。

可以發現其運行結果的 origin 也是代理的 IP,證明代理已經設置成功。

如果代理需要認證,同樣在代理的前面加上用戶名密碼即可,代理的寫法就變成:

proxy = username:password@127.0.0.1:9743n

和 Urllib 一樣,只需要將 username 和 password 替換即可。

如果需要使用 SOCKS5 代理,則可以使用如下方式:

import requestsnnproxy = 127.0.0.1:9742nproxies = {n http: socks5:// + proxy,n https: socks5:// + proxyn}ntry:n response = requests.get(http://httpbin.org/get, proxies=proxies)n print(response.text)nexcept requests.exceptions.ConnectionError as e:n print(Error, e.args)n

在這裡需要額外安裝一個 Socks 模塊,命令如下:

pip3 install "requests[socks]"n

運行結果是完全相同的:

{n "args": {}, n "headers": {n "Accept": "*/*", n "Accept-Encoding": "gzip, deflate", n "Connection": "close", n "Host": "httpbin.org", n "User-Agent": "python-requests/2.18.1"n }, n "origin": "106.185.45.153", n "url": "http://httpbin.org/get"n}n

另外還有一種設置方式,和 Urllib 中的方法相同,使用 socks 模塊,也需要像上文一樣安裝該庫,設置方法如下:

import requestsnimport socksnimport socketnnsocks.set_default_proxy(socks.SOCKS5, 127.0.0.1, 9742)nsocket.socket = socks.socksocketntry:n response = requests.get(http://httpbin.org/get)n print(response.text)nexcept requests.exceptions.ConnectionError as e:n print(Error, e.args)n

這樣也可以設置 SOCKS5 代理,運行結果完全相同,相比第一種方法,此方法是全局設置,不同情況可以選用不同的方法。

4. Selenium

Selenium 同樣也可以設置代理,在這裡分兩種介紹,一個是有界面瀏覽器,以 Chrome 為例介紹,另一種是無界面瀏覽器,以 PhantomJS 為例介紹。

Chrome

對於 Chrome 來說,用 Selenium 設置代理的方法也非常簡單,設置方法如下:

from selenium import webdrivernnproxy = 127.0.0.1:9743nchrome_options = webdriver.ChromeOptions()nchrome_options.add_argument(--proxy-server=http:// + proxy)nbrowser = webdriver.Chrome(chrome_options=chrome_options)nbrowser.get(http://httpbin.org/get)n

在這裡我們通過 ChromeOptions 來設置代理,在創建 Chrome 對象的時候通過 chrome_options 參數傳遞即可。

這樣在運行之後便會彈出一個 Chrome 瀏覽器,訪問目標鏈接之後輸出結果如下:

{n "args": {}, n "headers": {n "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", n "Accept-Encoding": "gzip, deflate", n "Accept-Language": "zh-CN,zh;q=0.8", n "Connection": "close", n "Host": "httpbin.org", n "Upgrade-Insecure-Requests": "1", n "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"n }, n "origin": "106.185.45.153", n "url": "http://httpbin.org/get"n}n

可以看到 origin 同樣為代理 IP 的地址,代理設置成功。

如果代理是認證代理,則設置方法相對比較麻煩,方法如下:

from selenium import webdrivernfrom selenium.webdriver.chrome.options import Optionsnimport zipfilennip = 127.0.0.1nport = 9743nusername = foonpassword = barnnmanifest_json = """n{n "version": "1.0.0",n "manifest_version": 2,n "name": "Chrome Proxy",n "permissions": [n "proxy",n "tabs",n "unlimitedStorage",n "storage",n "<all_urls>",n "webRequest",n "webRequestBlocking"n ],n "background": {n "scripts": ["background.js"]n }n}n"""nnbackground_js = """nvar config = {n mode: "fixed_servers",n rules: {n singleProxy: {n scheme: "http",n host: "%(ip)s",n port: %(port)sn }n }n }nnchrome.proxy.settings.set({value: config, scope: "regular"}, function() {});nnfunction callbackFn(details) {n return {n authCredentials: {n username: "%(username)s",n password: "%(password)s"n }n }n}nnchrome.webRequest.onAuthRequired.addListener(n callbackFn,n {urls: ["<all_urls>"]},n [blocking]n)n""" % {ip: ip, port: port, username: username, password: password}nnplugin_file = proxy_auth_plugin.zipnwith zipfile.ZipFile(plugin_file, w) as zp:n zp.writestr("manifest.json", manifest_json)n zp.writestr("background.js", background_js)nchrome_options = Options()nchrome_options.add_argument("--start-maximized")nchrome_options.add_extension(plugin_file)nbrowser = webdriver.Chrome(chrome_options=chrome_options)nbrowser.get(http://httpbin.org/get)n

在這裡需要在本地創建一個 manifest.json 配置文件和 background.js 腳本來設置認證代理,運行之後本地會生成一個 proxy_auth_plugin.zip 文件保存配置。

運行結果和上例一致,origin 同樣為代理 IP。

PhantomJS

對於 PhantomJS,代理設置方法可以藉助於 service_args 參數,也就是命令行參數,代理設置方法如下:

from selenium import webdrivernnservice_args = [n --proxy=127.0.0.1:9743,n --proxy-type=httpn]nbrowser = webdriver.PhantomJS(service_args=service_args)nbrowser.get(http://httpbin.org/get)nprint(browser.page_source)n

在這裡我們只需要使用 service_args 參數,將命令行的一些參數定義為列表,在初始化的時候傳遞即可。

運行結果:

{n "args": {}, n "headers": {n "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", n "Accept-Encoding": "gzip, deflate", n "Accept-Language": "zh-CN,en,*", n "Connection": "close", n "Host": "httpbin.org", n "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.0 Safari/538.1"n }, n "origin": "106.185.45.153", n "url": "http://httpbin.org/get"n}n

運行結果的 origin 同樣為代理的 IP,設置代理成功。

如果需要認證,那麼只需要再加入 --proxy-auth 選項即可,這樣參數就改為:

service_args = [n --proxy=127.0.0.1:9743,n --proxy-type=http,n --proxy-auth=username:passwordn]n

將 username 和 password 替換為認證所需的用戶名和密碼即可。

5. 本節代碼

本節代碼地址為:github.com/Python3WebSp

6. 結語

本節介紹了前文所介紹的請求庫的代理設置方法,稍作了解即可,後面我們會使用這些方法來搭建代理池和爬取網站,進一步加深印象。

自己動手,豐衣足食!Python3網路爬蟲實戰案例 自己動手,豐衣足食!Python3網路爬蟲實戰案例

雙11全場5折瘋搶12天 雙11全場5折瘋搶12天11.11狂歡

關鍵字:已有1200人學習 貓眼電影、今日頭條街拍、淘寶商品美食、微信文章、知乎用戶信息等案例,結合反爬策略,例例實戰 已連載完畢。



推薦閱讀:

TAG:Python3x | Python | Python教程 |