在Python3爬虫中,使用代理是一種防止IP被禁或者提高爬取速度的常用方法,主要用於模拟多個IP地址進行訪問。代理可以分為免费代理和付费代理兩種,其中免费代理不穩定,而付费代理相對比較穩定可靠。

以下是 Python3 爬虫代理的使用场景和應用:

防止 IP 被封鎖:有些網站會設置 IP 訪問頻率限制,如果訪問次数超過限制,則該 IP 將被禁止訪問網站,使用代理能夠避免這種情況發生。

提高爬取速度:使用代理可以同時建立多個连接,從而實現快速爬取目标數據的目的。

绕過地域限制:某些網站在不同的区域提供的服務不同,如果你需要訪問某些只针對特定地区開放的網站,使用代理可以绕過這種限制,使你可以得到所需的數據。

總之,代理IP在 Python3 爬虫中扮演着非常重要的角色。由於使用代理也會带來一些安全問题,因此在使用代理時,需要注意選择合適的代理服務商,並嚴格遵守網絡安全规定。

准备工作

我們需要先获取一個可用代理,代理就是 IP 地址和端口的組合,就是 ip:端口 這樣的格式。如果代理需要訪問認證,那就還需要额外的用戶名密碼兩個資訊。

這裡我的本機安裝了一部代理軟件,它會在本地 7890 端口上创建 HTTP 代理服務,即代理為 127.0.0.1:7890。另外,該軟件還會在 7891 端口上创建 SOCKS 代理服務,即代理為 127.0.0.1:7891,所以只要設置了這個代理,就可以成功將本機 IP 切换到代理軟件连接的服務器的 IP 了。

在本章下面的示例裡,我使用上述代理來演示其設置方法,你也可以自行替换成自己的可用代理。

設置代理後,測試的網址是 http://httpbin.org/get 訪問該鏈接我們可以得到請求的相關資訊,其中返回結果的 origin 字段就是客戶端的 IP,我們可以根据它來判断代理是否設置成功,即是否成功伪装了 IP。

好,接下來我們就來看下各個請求库的代理設置方法吧。

获取Python3爬虫代理

一些網站會檢測對其數據的频繁訪問,並采取措施阻止這些訪問。使用代理服務器可以分散訪問來源,减少被檢測的可能性,從而增加爬取成功率。

最佳美國静态代理IP

IPRoyal是一家對中國地区极其友好的代理服務提供商其住宅代理解決方案极具吸引力

查看IPRoyal
最便宜的静态代理

Proxy-seller 是一個數據中心代理提供商,受到許多小型互聯網營销人員的歡迎。

查看Proxy-seller
最實惠的静态代理

Shifter.io是一家知名的代理服務提供商,旨在為用戶提供隱私保護和更好的互聯網体验。

查看Shifter.io

2. urllib

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

 from urllib.error import URLError
 from urllib.request import ProxyHandler, build_opener

 proxy = '127.0.0.1:7890'
 proxy_handler = ProxyHandler({
    'http': 'http://' + proxy,
    'https': 'http://' + proxy
 })
 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",
    "X-Amzn-Trace-Id": "Root=1-60e9a1b6-0a20b8a678844a0b2ab4e889"
  },
  "origin": "210.173.1.204",
  "url": "https://httpbin.org/get"
 }
 

這裡我們需要借助 ProxyHandler 設置代理,參數是字典類型,键名為协议類型,键值是代理。注意,此處代理前面需要加上协议,即 http:// 或者 https://,当請求的鏈接是 HTTP 协议的時候,會使用 http 键名對應的代理,当請求的鏈接是 HTTPS 协议的時候,會使用 https 键名對應的代理。不過這裡我們把代理本身設置為了 HTTP 协议,即前缀統一設置為了 http://,所以不論訪問 HTTP 還是 HTTPS 协议的鏈接,都會使用我們配置的 HTTP 协议的代理進行請求。

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

運行输出結果是一個 JSON,它有一個字段 origin,标明了客戶端的 IP。驗證一下,此處的 IP 确實為代理的 IP,並不是真實的 IP。這樣我們就成功設置好代理,並可以隱藏真實 IP 了。

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

 from urllib.error import URLError
 from urllib.request import ProxyHandler, build_opener

 proxy = 'username:password@127.0.0.1:7890'
 proxy_handler = ProxyHandler({
    'http': 'http://' + proxy,
    'https': 'http://' + proxy
 })
 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)
 

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

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

 import socks
 import socket
 from urllib import request
 from urllib.error import URLError

 socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 7891)
 socket.socket = socks.socksocket
 try:
    response = request.urlopen('https://httpbin.org/get')
    print(response.read().decode('utf-8'))
 except URLError as e:
    print(e.reason)
 

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

 pip3 install PySocks