書目參考:精通Python網絡爬蟲和Python3網絡爬蟲實戰。
這里只給出正確的代碼。
首先,代理服務器ip的網址是:http://www.xicidaili.com/。這里面有大量的失效IP地址。
其次, http://httpbin.org/get或者https開通的網址可以對是否設置成功進行驗證。
實際代碼如下:
# -*- coding: utf-8 -*- """ Created on Wed Jul 11 15:54:09 2018 @author: a """ #設置正確的代理服務器 from urllib.error import URLError def use_proxy(proxy_addr,url): import urllib.request #proxy=urllib.request.ProxyHandler({"http":"http://"+proxy_addr,"https":"https://"+proxy_addr}) proxy=urllib.request.ProxyHandler({"http":"http://"+proxy_addr}) headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5193.400 QQBrowser/10.0.1066.400") opener=urllib.request.build_opener(proxy) opener.addheaders=[headers] #print (opener.open(url).getheaders()) #print (opener.open(url).info()) try: response=opener.open(url) data=response.read().decode('utf-8') print(data) except URLError as e: print("出現異常") print(e.reason) return data #獲取本機ip地址 import socket hostname = socket.gethostname() ip = socket.gethostbyname(hostname) print ("本機電腦名:",hostname) print ("本機Ip:",ip) proxy_addr="101.236.35.98:8866" data=use_proxy(proxy_addr,"http://httpbin.org/get") #print (data) print (len(data))
#也可以opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
#也可以注冊opener。
urllib.request.install_opener(opener)
response=urllib.request.urlopen(url)
為了確定是否使用的是代理服務器的ip地址,可以將目標url設為: http://httpbin.org/get因為該服務器的response會專門返回客戶端使用的ip地址。可以看到:
runfile('G:/精通python網絡爬蟲/6 代理服務器設置_2.py', wdir='G:/精通python網絡爬蟲')
本機電腦名: DESKTOP-090FKDS
本機Ip: 192.168.8.100
{"args":{},"headers":{"Accept-Encoding":"identity","Cache-Control":"max-age=259200","Connection":"close","Host":"httpbin.org","User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5193.400 QQBrowser/10.0.1066.400"},"origin":"101.236.35.98","url":"http://httpbin.org/get"}
352
幾個錯誤
第一個錯誤
Python3網絡爬蟲實戰書中的錯誤是:設置Proxyhandler的時候使用的是:
#proxy=urllib.request.ProxyHandler({"http":"http://"+proxy_addr,"https":"https://"+proxy_addr})
即將http和https都設置了。但是這樣總是會出現各種問題。
其中,http://www.xicidaili.com/對於各種類型的代理IP是有嚴格分類的。如果訪問http的網址,就用國內http代理IP即可。
第二個錯誤
寫代碼的時候沒有注意,反復open(url)就會導致報錯。
print (opener.open(url).getheaders())
print (opener.open(url).info())
data=opener.open(url).read().decode('utf-8')
print(data)
return data
第三個錯誤
如果設置的代理是http類型的,訪問的是https的網址。這個時候,代理是不起任何作用的。比如,有效的http代理服務器ip是:102.236.35.98:8866。這個時候,你隨便改動IP,使用下面的代碼,都能正常跑通。
def use_proxy(proxy_addr,url): import urllib.request proxy=urllib.request.ProxyHandler({"http":"http://"+proxy_addr}) print (proxy_addr) headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5193.400 QQBrowser/10.0.1066.400") opener=urllib.request.build_opener(proxy) opener.addheaders=[headers] data=opener.open(url).read().decode('utf-8') print (data) return data #獲取本機ip地址 import socket hostname = socket.gethostname() ip = socket.gethostbyname(hostname) print ("本機電腦名:",hostname) print ("本機Ip:",ip) #proxy_addr="101.236.35.98:8866" proxy_addr="104.236.35.98:8866"#隨便改動ip地址。 data=use_proxy(proxy_addr,"https://www.baidu.com") #print (data) print (len(data))
為了驗證一下ip地址沒有起到任何作用。我們修改url為:https://httpbin.org/get
因為這個url的response是客戶端的ip地址,可以看到結果如下:
可以看到本機的ip是192.168.8.100,設置的代理服務器的ip是
104.236.35.98:8866,而服務器端記錄的客戶端的ip地址是:117.61.138.21.
你繼續改動代理服務器的ip地址:可以看到,服務器端記錄的客戶端ip地址仍然是:117.61.138.21
為什么117.61.138.21和我的本機ip不一樣呢。
這是因為我的電腦連接的是wifi熱點。所以服務器實際記錄的客戶端ip地址就不是我的電腦顯示的。