
800819103
在線客服,實時響應
qq群
在線客服,實時響應
客服電話
13318873961
對于爬蟲而言,要獲得大量的信息,要了解對方的反爬蟲機制情況,預防在采集過程中被批量封殺IP,那么網絡爬蟲怎么預防被封殺?
對方是怎么檢測你是用戶還是爬蟲的呢?下文總結了一些網絡爬蟲怎么預防被封殺的方法。
一、設置等待時間
有一些網站的防范措施可能會因為你快速提交表單而把你當做機器人爬蟲,比如說以非常人的速度下載圖片,登錄網站,爬取信息。
常見的設置等待時間有兩種,一種是顯性等待時間(強制停幾秒),一種是隱性等待時間(看具體情況,比如根據元素加載完成需要時間而等待)
1.顯性等待時間
import time#導入包time.sleep(3)#設置時間間隔為3秒
而且盡量在夜深人靜的時候進行數據的采集,切記采集不要太快,不然容易讓網站識別出你個非人類
2.隱式等待
這里用到的主要語句,以wait.until()為例
比如說形式如下
wait1.until(lambda driver: driver.find_element_by_xpath("//div[@id='link-report']/span"))
上面的語句就是在等待頁面元素加載全部完成后才進行下一步操作,因為爬蟲速度太快,導致一些元素沒有被加載完全就進行下一步操作而導致沒有查找到元素或者被網站認為是機器人在進行瀏覽。
二、修改請求頭
識別你是機器人還是人類瀏覽器瀏覽的重要依據就是User-Agent,比如人類用瀏覽器瀏覽就會使這個樣子的User-Agent:'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
這里拿urllib2來說,默認的User-Agent是Python-urllib2/2.7,所以要進行修改。
import urllib2
req = urllib2.Request(url)
#多了以下一這一步而已
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')
response = urllib2.urlopen(req)
三、采用代理ip
當自己的ip被網站封了之后,只能采取換代理ip的方式進行爬取,所以,我建議,每次爬取的時候盡量用代理來爬,封了代理,還有代理,無窮無盡啊。代理的實現程序:
# -*- coding: utf-8 -*-import urllib2
url = "http://www.ip181.com/"proxy_support = urllib2.ProxyHandler({'http':'121.40.108.76'})#參數是一個字典{'類型':'代理ip:端口號'}opener = urllib2.build_opener(proxy_support)#定制openeropener.add_handler=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')]#add_handler給加上偽裝urllib2.install_opener(opener)
response = urllib2.urlopen(url)print response.read().decode('gbk')
檢驗自己是否用代理ip成功:
使用代理ip訪問
從結果中可以看出,檢測出了代理ip,正是我自己加上的ip值,此乃最后一招,當自己ip被封后,采用代理ip進行訪問。
要是一個代理ip掛了怎么辦,那你可以做個ip池啊,就是把一堆代理ip放在一起,每次運行時從ip池挑一個代理ip當做訪問ip就可以了!
采用ip池的方法~~~~~舉個栗子
# -*- coding: utf-8 -*-
import urllib2
import random
ip_list=['119.6.136.122','114.106.77.14']
#使用一組ip調用random函數來隨機使用其中一個ip
url = "http://www.ip181.com/"proxy_support = urllib2.ProxyHandler({'http':random.choice(ip_list)})
#參數是一個字典{'類型':'代理ip:端口號'}opener = urllib2.build_opener(proxy_support)
#定制opener
opener.add_handler=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')]
#add_handler給加上偽裝
urllib2.install_opener(opener)
response = urllib2.urlopen(url)
print response.read().decode('gbk')
使用ip池抽取ip訪問
采用代理ip池的方法,可以看出,檢測出的ip是ip池中的一個,對吧,很簡單對不對,那么怎么來創建ip池呢,也很簡單,用動態或者靜態方法隨便找個匿名ip的網站進行代理ip爬取,然后清洗一下ip,把能用的(測試一個簡單的返回狀態網頁)留下來寫到列表里,然后就可以形成ip池啦,最后當某個ip不能用了,那就從池中剔除!
四、避開不可見元素陷阱
自己爬著爬著就把隱藏元素都爬出來了,你說你自己是不是爬蟲吧,這是網站給爬蟲的陷阱,只要發現,立馬封IP,所以請查看一下元素再進行爬??!
比如說這個網址,一個簡單的登錄頁面,從審查元素中我們可以看到有一些元素是不可見的!
上述中可以看到隱藏的value和不顯示的url
查找出陷阱url和不可見的value代碼
結果就是
the link http://pythonscraping.com/dontgohereis a trap do not change value of phone do not change value of email
五、采用分布式爬取
分布式爬取,針對比較大型爬蟲系統,實現步驟如下所示
1.基本的http抓取工具,如scrapy
2.避免重復抓取網頁,如Bloom Filter
3.維護一個所有集群機器能夠有效分享的分布式隊列
4.將分布式隊列和Scrapy結合
5.后續處理,網頁析?。╬ython-goose),存儲(Mongodb)
(知乎上看到的補充一下)
通過上文,大家其實可以發現,爬蟲預防被封殺的方法比較多,而且大部分的方法都是可以通用的,盡量把爬蟲從頭偽裝到底,這樣可以降低被封殺的幾率。