本文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。
正文html
Python爬蟲反爬策略三部曲,擁有這三步曲就能夠在爬蟲界立足了:瀏覽器
- 瀏覽器假裝
- IP代理池和用戶代理池構建
- 動態頁面加載解決方法
注意:若是你Python基礎不夠紮實,建議先學好再來,缺Python最新教程的能夠點擊下方連接自行獲取
http://note.youdao.com/noteshare?id=a3a533247e4c084a72c9ae88c271e3d1
網站反爬機制經常使用的方法:服務器
一、經過識別訪問的headers來判斷是爬蟲仍是瀏覽器訪問,其中最經常使用和最重要的就是User-Agent用戶代理,服務器能夠從這個字段識別出客戶端瀏覽器類型和版本號、客戶端的操做系統,頁面排版等信息,正是由於這個緣由手機和電腦打開的同個網站的頁面的排版是不一樣的,經常使用的還有Referer等字段;cookie
二、經過用戶行爲,要是經過一個IP短期內大量訪問數據,該網站可能對這個IP進行短期的禁止訪問,這個能夠增長訪問延時時間,好比每訪問一次延時time.sleep(5),延時5秒,要是爬取的數據量大的話這個爬取時間是挺蛋疼的,最好的方法就是同時構建用戶代理池和IP代理池,每訪問幾回就換一個用戶代理和IP代理就完美解決了;網絡
三、動態頁面加載,能夠經過抓包分析出頁面加載的規律而後構造批量請求,若是文件是加密的,可使用selenium+phantomJS瀏覽器內核來訪問,這個是真實的用戶行爲,速度比較慢,能夠瀏覽器操做的部分交給selenium+phantomJS,爬取的功能交給爬蟲實現,雖然比純爬蟲慢,可是也沒辦法了。函數
先來第一部曲學習
瀏覽器假裝網站
- 經過Request添加headers
- 經過Opener添加headers
- 批量添加headers
經過Request添加headersui
-
-
url=
"https://qiushibaike.com"
-
headers={
"User-Agent":"Mozilla/5.0 (Windows NT6.1; WOW64) Apple\
-
WebKit/537.36 (KHTML, likeGecko) Chrome/69.0.3497.92 Safari/537.36"}
-
req=urllib.request.Request(url,headers=headers)
-
-
data=urllib.request.urlopen(req).read().decode(
"utf-8","ignore")
經過Opener添加headers加密
基本的urlopen()函數不支持驗證、cookie或其餘HTTP高級功能,要支持這些功能必須使用build_opener()函數來建立本身的自定義Opener對象
install_opener(opener)安裝opener做爲urlopen()使用的全局URL opener,即意味着之後調用urlopen()時都會使用安裝的opener對象。
-
-
url=
"https://www.qiushibaike.com/"
-
headers=(
"User-Agent":"Mozilla/5.0 (Windows NT6.1; WOW64) Apple\
-
WebKit/537.36 (KHTML, likeGecko) Chrome/69.0.3497.92 Safari/537.36")
-
opener=urllib.request.build_opener()
-
opener.addheaders=[headers]
-
data=opener.open(url).read()
-
-
urllib.request.install_opener(opener)
-
data=urllib.request.urlopen(url).read().decode(
"utf-8","ignore")
-
經過批量添加headers
-
-
url=
"https://qiushibaike.com"
-
-
"User-Agent":"Mozilla/5.0 (Windows NT6.1; WOW64) Apple\
-
WebKit/537.36 (KHTML, likeGecko) Chrome/69.0.3497.92 Safari/537.36",
-
"Referer":"https://qiushibaike.com"
-
-
-
opener=urllib.request.build_opener()
-
-
for key,value in headers.item():
-
-
-
-
opener.addheaders=headersall
-
urllib.request.install_opener(opener)
-
data=urllib.request.urlopen(url).read().decode(
"utf-8","ignore")
瀏覽器假裝能夠解決大部分網站的反爬機制,大型網站反爬機制就比較複雜點了,後面更新構建IP代理和用戶代理,動態頁面加載的解決方法