原做者及原文連接:blog.csdn.net/c406495762/…html
運行平臺:Windows Python版本:Python3.x IDE:Sublime text3python
有一些網站不喜歡被爬蟲程序訪問,因此會檢測鏈接對象,若是是爬蟲程序,也就是非人點擊訪問,它就會不讓你繼續訪問,因此爲了要讓程序能夠正常運行,須要隱藏本身的爬蟲程序的身份。此時,咱們就能夠經過設置User Agent的來達到隱藏身份的目的,User Agent的中文名爲用戶代理,簡稱UA。正則表達式
User Agent存放於Headers中,服務器就是經過查看Headers中的User Agent來判斷是誰在訪問。在Python中,若是不設置User Agent,程序將使用默認的參數,那麼這個User Agent就會有Python的字樣,若是服務器檢查User Agent,那麼沒有設置User Agent的Python程序將沒法正常訪問網站。瀏覽器
Python容許咱們修改這個User Agent來模擬瀏覽器訪問,它的強大毋庸置疑。bash
上面列舉了Andriod、Firefox、Google Chrome、iOS的一些User Agent,直接copy就能用。服務器
先看下urllib.request.Request()學習
從上圖能夠看出,在建立Request對象的時候,能夠傳入headers參數。 所以,想要設置User Agent,有兩種方法:測試
1.在建立Request對象的時候,填入headers參數(包含User Agent信息),這個Headers參數要求爲字典;網站
2.在建立Request對象的時候不添加headers參數,在建立完成以後,使用add_header()的方法,添加headers。ui
建立文件urllib_test09.py,使用上面提到的Android的第一個User Agent,在建立Request對象的時候傳入headers參數,編寫代碼以下:
# -*- coding: UTF-8 -*-
from urllib import request
if __name__ == "__main__":
#以CSDN爲例,CSDN不更改User Agent是沒法訪問的
url = 'http://www.csdn.net/'
head = {}
#寫入User Agent信息
head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
#建立Request對象
req = request.Request(url, headers=head)
#傳入建立好的Request對象
response = request.urlopen(req)
#讀取響應信息並解碼
html = response.read().decode('utf-8')
#打印信息
print(html)
複製代碼
運行結果以下:
建立文件urllib_test10.py,使用上面提到的Android的第一個User Agent,在建立Request對象時不傳入headers參數,建立以後使用add_header()方法,添加headers,編寫代碼以下:
# -*- coding: UTF-8 -*-
from urllib import request
if __name__ == "__main__":
#以CSDN爲例,CSDN不更改User Agent是沒法訪問的
url = 'http://www.csdn.net/'
#建立Request對象
req = request.Request(url)
#傳入headers
req.add_header('User-Agent', 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19')
#傳入建立好的Request對象
response = request.urlopen(req)
#讀取響應信息並解碼
html = response.read().decode('utf-8')
#打印信息
print(html)
複製代碼
運行結果和上一個方法是同樣的。
User Agent已經設置好了,可是還應該考慮一個問題,程序的運行速度是很快的,若是咱們利用一個爬蟲程序在網站爬取東西,一個固定IP的訪問頻率就會很高,這不符合人爲操做的標準,由於人操做不可能在幾ms內,進行如此頻繁的訪問。因此一些網站會設置一個IP訪問頻率的閾值,若是一個IP訪問頻率超過這個閾值,說明這個不是人在訪問,而是一個爬蟲程序。
一個很簡單的解決辦法就是設置延時,可是這顯然不符合爬蟲快速爬取信息的目的,因此另外一種更好的方法就是使用IP代理。使用代理的步驟:
(1)調用urlib.request.ProxyHandler(),proxies參數爲一個字典。
(2)建立Opener(相似於urlopen,這個代開方式是咱們本身定製的)
(3)安裝Opener
使用install_opener方法以後,會將程序默認的urlopen方法替換掉。也就是說,若是使用install_opener以後,在該文件中,再次調用urlopen會使用本身建立好的opener。若是不想替換掉,只是想臨時使用一下,可使用opener.open(url),這樣就不會對程序默認的urlopen有影響。
在寫代碼以前,先在代理IP網站選好一個IP地址,推薦西刺代理IP。
URL:http://www.xicidaili.com/
注意:固然也能夠寫個正則表達式從網站直接爬取IP,可是要記住不要太頻繁爬取,加個延時什麼的,太頻繁給服務器帶來壓力了,服務器會直接把你block,不讓你訪問的,我就被封了兩天。
從西刺網站選出信號好的IP,個人選擇以下:(106.46.136.112:808)
編寫代碼訪問http://www.whatismyip.com.tw/,該網站是測試本身IP爲多少的網址,服務器會返回訪問者的IP。
建立文件urllib_test11.py,編寫代碼以下:
# -*- coding: UTF-8 -*-
from urllib import request
if __name__ == "__main__":
#訪問網址
url = 'http://www.whatismyip.com.tw/'
#這是代理IP
proxy = {'http':'106.46.136.112:808'}
#建立ProxyHandler
proxy_support = request.ProxyHandler(proxy)
#建立Opener
opener = request.build_opener(proxy_support)
#添加User Angent
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36')]
#安裝OPener
request.install_opener(opener)
#使用本身安裝好的Opener
response = request.urlopen(url)
#讀取相應信息並解碼
html = response.read().decode("utf-8")
#打印信息
print(html)
複製代碼
運行結果以下:
從上圖能夠看出,訪問的IP已經假裝成了106.46.136.112。
圓方圓學院聚集 Python + AI 名師,打造精品的 Python + AI 技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。 公開課地址: ke.qq.com/course/3627…
加入python學習討論羣 78486745 ,獲取資料,和廣大羣友一塊兒學習。