一、通過user-agent來控制訪問:
無論是瀏覽器還是爬蟲程式,在向伺服器發起網路請求的時候,都會發過去乙個標頭檔案:headers,比如知乎的requestsheaders:
accept-encoding:gzip, deflate, sdch, br
accept-language:zh-cn,zh;q=0.8,en;q=0.6,zh-tw;q=0.4,da;q=0.2,la;q=0.2
cache-control:max-age=0
connection:keep-alive
cookie: **********
host:
referer:ehco - 知乎
upgrade-insecure-requests:1
query string parameters
view source
view url encoded
這裡面的大多的數的字段都是瀏覽
這裡面的大多數的字段都是瀏覽器向伺服器」表明身份「用的
對於爬蟲程式來說,最需要注意的字段就是:user-agent
很多**都會建立 user-agent白名單,只有屬於正常範圍的user-agent才能夠正常訪問。
比如知乎:
import requests可以看到,這裡的請求被拒絕了,並且返回了乙個500的錯誤碼:import bs4
import random
def get_html(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status
return r.text
except:
return "someting wrong!"
print(get_html(''))
# out:
'''an internal server error occured.
'''
這裡就是因為requests庫本身的headers是這樣的:
這裡面並沒有user-agent欄位,自然不被知乎的伺服器所接受了。解決方法:
可以自己設定一下user-agent,或者更好的是,可以從一系列的user-agent裡隨機挑出乙個符合標準的使用,**如下:
def get_agent():二、通過ip限制來反爬蟲:'''模擬header的user-agent欄位,
返回乙個隨機的user-agent字典型別的鍵值對
'''agents = ['mozilla/5.0 (compatible; msie 9.0; windows nt 6.1; trident/5.0;',
'mozilla/5.0 (macintosh; intel mac os x 10.6; rv,2.0.1) gecko/20100101 firefox/4.0.1',
'opera/9.80 (macintosh; intel mac os x 10.6.8; u; en) presto/2.8.131 version/11.11',
'mozilla/4.0 (compatible; msie 7.0; windows nt 5.1; 360se)']
fakeheader = {}
fakeheader['user-agent'] = agents[random.randint(0, len(agents))]
return fakeheader
# 注意看新的請求函式:
def get_html(url):
try:
r = requests.get(url, timeout=30,headers=get_agent())
r.raise_for_status
return r.status_code
except:
return "someting wrong!"
'''out:
200'''
如果乙個固定的ip在短暫的時間內,快速大量的訪問乙個**,那自然會引起注意,管理員可以通過一些手段把這個ip給封了,爬蟲程式自然也就做不了什麼了。
解決方法:
比較成熟的方式是:ip**池
簡單的說,就是通過ip**,從不同的ip進行訪問,這樣就不會被封掉ip了。
可是ip**的獲取本身就是乙個很麻煩的事情,網上有免費和付費的,但是質量都層次不齊。如果是企業裡需要的話,可以通過自己購買集群雲服務來自建**池。
這裡實現了乙個簡單的**轉換,**如下:
def get_proxy():三、通過js指令碼來防止爬蟲:'''簡答模擬**池
返回乙個字典型別的鍵值對,
return fakepxs
這個可以說是終極的辦法了,因為,爬蟲終歸只是一段程式,它並不能像人一樣去應對各種變化,如驗證碼,滑動解鎖之類的。
舉個例子:如果想爬取某個**,但是在進入**之前,它會有乙個驗證頁面來驗證你是不是機器。
它是怎麼驗證的呢:
他會通過js**生成一大段隨機的數字,然後要求瀏覽器通過js的運算得出這一串數字的和,再返回給伺服器.可想而知,這麼簡單和最基礎的乙個驗證步驟,會是寫的**完成不了的。
解決方法:
這裡就要請出乙個大殺器:」phantomjs「
phantomjs是乙個python包,他可以在沒有圖形介面的情況下,完全模擬乙個」瀏覽器「,js指令碼驗證什麼的再也不是問題了。四、通過robots.txt來限制爬蟲:
世界上做爬蟲最大最好的就是google了,搜尋引擎本身就是乙個超級大的爬蟲,google開發出來爬蟲24h不間斷的在網上爬取著新的資訊,並返回給資料庫,但是這些搜尋引擎的爬蟲都遵守著乙個協議:robots.txt
robots.txt(統一小寫)是一種存放於**根目錄下的ascii編碼的文字檔案,它通常告訴網路搜尋引擎的漫遊器(又稱網路蜘蛛),此**中的哪些內容是不應被搜尋引擎的漫遊器獲取的,哪些是可以被漫遊器獲取的。因為一些系統中的url是大小寫敏感的,所以robots.txt的檔名應統一為小寫。robots.txt應放置於**的根目錄下。如果想單獨定義搜尋引擎的漫遊器訪問子目錄時的行為,那麼可以將自定的設定合併到根目錄下的robots.txt,或者使用robots元資料(metadata,又稱元資料)。wiki上說的已經很清楚了,這實際上只是乙個」君子協議「,遵守與否,都在於爬蟲的編寫者。robots.txt協議並不是乙個規範,而只是約定俗成的,所以並不能保證**的隱私。注意robots.txt是用字串比較來確定是否獲取url,所以目錄末尾有與沒有斜槓「/」表示的是不同的url。robots.txt允許使用類似"disallow: *.gif"這樣的萬用字元[1][2]。
來看一下京東的'robots.txt':
user-agent: *disallow: /?*
disallow: /pop/*.html
disallow: /pinpai/*.html?*
user-agent: etaospider
disallow: /
user-agent: huihuispider
disallow: /
user-agent: gwdangspider
disallow: /
user-agent: wochachaspider
disallow: /
8.3.1修改請求 header
hpuoj 1039 一二三四 同餘定理
時間限制 1 sec 記憶體限制 128 mb 提交 238 解決 88 經過乙個多月的學習生活,楊八方已經愛上了這個學校。這天她行走在老體育場旁的小路上,突然聽到了一陣口號聲。一二三四,二二三四,三二三四,再來一次。那麼問題來了,同學的口號組成了乙個序列 1234 2234 3234 1234 2...
聽!IBM中國的新佇列口號 一!二!三! 四!
2015年2月2日,ibm公司宣布任命陳黎明擔任ibm大中華區董事長。7月31日,ibm宣布錢大群先生將於2015年9月30日退休,同時任命王天義女士為ibm大中華區總經理,後者向陳黎明匯報。這也預示著,ibm大中華區正式進入陳黎明時代,開啟新的篇章。8月11日,陳黎明率領部分ibm大中華區業務高管...
書單記錄。生活不只有ABCD,還有一二三四
202已看書單 1 城南舊事 2 傲慢與偏見 3 乙個陌生女人的來信 剛看完的 乙個陌生女人的來信 不需要很多的歷史背景或者文化背景去理解這本書,對於我淺顯的閱讀和理解來看,只是把它當成了乙個愛情故事來讀,覺得它放在任何背景下都能讀懂,而且這本書的翻譯也特別符合中文的表達。最初是看聲臨其境的綜藝,知...