————————————————————————————————————————
代理的作用與原理
代理服務器在寫爬蟲的時候會經常用到,主要作用有隱藏真實IP和提高訪問速度等。其原理是這樣一回事:形象地說,它是網絡信息的中轉站。在我們正常請求一個網站時,是發送了請求給Web服務器,Web服務器把響應傳回給我們。如果設置了代理服務器,實際上就是在本機和服務器之間搭建了一個橋,此時本機不是直接向Web服務器發起請求,而是向代理服務器發出請求,請求會發送給代理服務器,然後由代理服務器再發送給Web服務器,接着由代理服務器再把Web服務器返回的響應轉發給本機。這樣我們同樣可以正常訪問網頁,但這個過程中Web服務器識別出的真實IP就不再是我們本機的IP了,就成功實現了IP僞裝,這就是代理的基本原理。
本地搭建代理
from urllib.error import URLError
from urllib.request import ProxyHandler,build_opener
proxy_handler = ProxyHandler({
'http':'http://127.0.0.1:63342',
#'https':'https//127.0.0.1:63342'
})
opener = build_opener(proxy_handler)
try:
response = opener.open('https://www.baidu.com')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
這裏使用了ProxyHandler,其參數是一個字典,鍵名是協議類型(比如HTTP或者HTTPS等),鍵值是代理鏈接,可以添加多個代理。
然後,利用這個Handler及build_opener()方法構造一個Opener,之後發送請求即可。
一個小坑
上述代碼中https參數部分容易被新手忽略,因爲這裏是本地代理服務器,而你的本地服務器並沒有取得SSl證書,也就並沒有https協議(https是http的一個安全版本)。如果上面並沒有註釋的話(http和https兩個參數同時存在)就會報錯“Tunnel connection failed: 404 Not Found”,如下:
註釋掉https參數就可以,如:
#'https':'https//127.0.0.1:63342'
端口未打開報錯
“[WinError 10061] 由於目標計算機積極拒絕,無法連接。”如下:
報錯原因:9743端口在我們的電腦並沒有開放(因每個人的電腦而異),以至於無法對外進行連接。
如何查詢端口在個人電腦是否開放?
查看端口信息狀態
補個知識
快捷鍵“win+R”打開cmd,鍵入
netstat -ano
然後可以得到以下圖片的ip和端口信息:
LISTENING爲電腦已經開放了的監聽端口。
查看指定端口的佔用情況:
以上面搭建的端口(63342)爲例
netstat -aon|findstr "63342"
可以看到“63342”端口被進程號爲18220的進程所佔用,我們可以根據進程號查看多應的進程。
tasklist|findstr “18220”
可以看到是我剛剛進行連接的pycharm佔用了改端口。
如果我們不想它佔用就把改程序kill了以結束該進程:
taskkill /f /t /im pycharm64.exe
(我這裏就不演示結束進程了,懶得再開了,哈哈哈!)
服務器代理
剛剛演示的是是用我的主機搭建本地服務器代理,現在我用的自己的服務器進行代理,在這我的服務器是已經取得了SSL證書了,即可以使用https參數。
一個程序員雜談公衆號,歡迎關注。
有不足之處望留言指正
——————END——————
Programmer:柘月十七