代理服務的介紹:
我們在做爬蟲的過程中經常最初爬蟲都正常運行,正常爬取數據,一切看起來都是美好,然而一杯茶的功夫就出現了錯誤。
如:403 Forbidden錯誤,“您的IP訪問頻率太高”錯誤,或者跳出一個驗證碼讓我們輸入,之后解封,但過一會又出現類似情況。
出現這個現象的原因是因為網站采取了一些反爬中措施,如:服務器檢測IP在單位時間內請求次數超過某個閥值導致,稱為封IP。
為了解決此類問題,代理就派上了用場,如:代理軟件、付費代理、ADSL撥號代理,以幫助爬蟲脫離封IP的苦海。
測試HTTP請求及響應的網站:http://httpbin.org/
GET地址 :http://httpbin.org/get
POST地址:http://httpbin.org/post
httpbin這個網站能測試 HTTP 請求和響應的各種信息,比如 cookie、ip、headers 和登錄驗證等.
且支持 GET、POST 等多種方法,對 web 開發和測試很有幫助。
代理的設置:
① urllib的代理設置
from urllib.error import URLError
from urllib.request import ProxyHandler, build_openerproxy = '127.0.0.1:8888'#需要認證的代理#proxy = 'username:password@127.0.0.1:8888'#使用ProxyHandler設置代理proxy_handler = ProxyHandler({ 'http': 'http://' + proxy, 'https': 'https://' + proxy})#傳入參數創建Opener對象opener = build_opener(proxy_handler)try: response = opener.open('http://httpbin.org/get') print(response.read().decode('utf-8'))except URLError as e: print(e.reason)
② requests的代理設置
import requests proxy = '127.0.0.1:8888'#需要認證的代理#proxy = 'username:password@127.0.0.1:8888'proxies = { 'http': 'http://' + proxy, 'https': 'https://' + proxy,}try: response = requests.get('http://httpbin.org/get', proxies=proxies) print(response.text)except requests.exceptions.ConnectionError as e: print('Error', e.args)
③ Selenium的代理使用
使用的是PhantomJS
from selenium import webdriver service_args = [ '--proxy=127.0.0.1:9743', '--proxy-type=http', #'--proxy-auth=username:password' #帶認證代理]browser = webdriver.PhantomJS(service_args=service_args)browser.get('http://httpbin.org/get')print(browser.page_source) 使用的是Chrome from selenium import webdriver proxy = '127.0.0.1:9743'chrome_options = webdriver.ChromeOptions()chrome_options.add_argument('--proxy-server=http://' + proxy)chrome = webdriver.Chrome(chrome_options=chrome_options)chrome.get('http://httpbin.org/get')
④ 在Scrapy使用代理
#在Scrapy的Downloader Middleware中間件里 ... def process_request(self, request, spider): request.meta['proxy'] = 'http://127.0.0.1:9743' ...
免費代理IP的使用
我們可以從互聯網中獲取免費的代理IP:
import requests,random #定義代理池proxy_list = [ '182.39.6.245:38634', '115.210.181.31:34301', '123.161.152.38:23201', '222.85.5.187:26675', '123.161.152.31:23127',]# 隨機選擇一個代理proxy = random.choice(proxy_list)proxies = { 'http': 'http://' + proxy, 'https': 'https://' + proxy,}try: response = requests.get('http://httpbin.org/get', proxies=proxies) print(response.text)except requests.exceptions.ConnectionError as e: print('Error', e.args)
收費代理IP的使用
收費代理還是很多的如:
芝麻代理
極光代理
太陽代理
在requests中使用收費代理
import requests # 從代理服務中獲取一個代理IPproxy = requests.get("http://tvp.daxiangdaili.com/ip/?tid=559775358931681&num=1").textproxies = { 'http': 'http://' + proxy, 'https': 'https://' + proxy,}try: response = requests.get('http://httpbin.org/get', proxies=proxies) print(response.text)except requests.exceptions.ConnectionError as e: print('Error', e.args)
