站在網站管理的角度,若是在同一時間段,你們所有利用爬蟲程序對本身的網站進行爬取操做,那麼這網站服務器能不能承受這種負荷?確定不能啊,若是嚴重超負荷則會時服務器宕機(死機)的,對於一些商業型的網站,宕機一秒鐘的損失都是不得了的,這不是一個管理員能承擔的,對吧?那管理員會網站服務器作什麼來優化呢?我想到的是,寫一個腳本,當檢測到一個IP訪問的速度過快,報文頭部並非瀏覽器的話,那麼就拒絕服務,或者屏蔽IP等,這樣就能夠減小服務器的負擔並讓服務器正常進行。html
那麼既然服務器作好了優化,但你知道這是對爬蟲程序的優化,若是你是用瀏覽器來做爲一個用戶訪問的話,服務器是不會攔截或者屏蔽你的,它也不敢攔你,爲何,你如今是客戶,它敢攔客戶,不想繼續經營了是吧?因此對於若是是一個瀏覽器用戶的話,是能夠正常訪問的。python
因此想到方法了嗎?是的,把程序僞形成一個瀏覽器啊,前面說過服務器會檢測報文頭部信息,若是是瀏覽器就不正常通行,若是是程序就拒絕服務。瀏覽器
那麼報文是什麼?頭部信息又是什麼?詳細的就不解釋了,這涉及到http協議和tcp/ip三次握手等等的網絡基礎知識,感興趣的本身百度或者谷歌吧。服務器
本篇博文不扯遠了,只說相關的重點——怎麼查看頭部信息。網絡
其實我想有些朋友可能有疑惑,服務器是怎麼知道咱們使用的是程序或者瀏覽器呢?它用什麼來判斷的?tcp
我使用的是火狐瀏覽器,鼠標右鍵-查看元素(有的瀏覽器是審查元素或者檢查)工具
網絡(有的是network):優化
出現報文:網站
雙擊它, 右邊則會出現詳細的信息,選擇消息頭(有的是headers)url
找到請求頭(request headers),其中的User-Agent就是咱們頭部信息:
看到是顯示的
# -*- coding:utf-8 -*- import urllib url='http://www.baidu.com' #百度網址 html=urllib.urlopen(url)#利用模塊urllib裏的urlopen方法打開網頁 print(dir(html)) #查看對象html的方法 print(urllib.urlopen) #查看對象urllib.urlopen的方法 print(urllib.urlopen()) #查看對象urllib.urlopen實例化後的方法
Traceback (most recent call last): File "D:\programme\PyCharm 5.0.3\helpers\pycharm\utrunner.py", line 121, in <module> modules = [loadSource(a[0])] File "D:\programme\PyCharm 5.0.3\helpers\pycharm\utrunner.py", line 41, in loadSource module = imp.load_source(moduleName, fileName) File "G:\programme\Python\python project\test.py", line 8, in <module> print(urllib.urlopen()) TypeError: urlopen() takes at least 1 argument (0 given) ['__doc__', '__init__', '__iter__', '__module__', '__repr__', 'close', 'code', 'fileno', 'fp', 'getcode', 'geturl', 'headers', 'info', 'next', 'read', 'readline', 'readlines', 'url'] <function urlopen at 0x0297FD30>
urlopen提供了以下方法:
好的,詳細的本身去研究了,本篇博文的重點終於來了,假裝一個頭部信息
因爲urllib沒有僞造頭部信息的方法,因此這裏得使用一個新的模塊,urllib2
# -*- coding:utf-8 -*- import urllib2 url='http://www.baidu.com' head={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0' } #頭部信息,必須是一個字典 html=urllib2.Request(url,headers=head) result=urllib2.urlopen(html) print result.read()
或者你也能夠這樣:
# -*- coding:utf-8 -*- import urllib2 url='http://www.baidu.com' html=urllib2.Request(url) html.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0') #此時注意區別格式 result=urllib2.urlopen(html) print result.read()
結果都同樣的,我也就不展現了。
按照上面的方法就能夠僞造請求頭部信息。
那麼你說,我怎麼知道僞形成功了?還有不僞造頭部信息時,顯示的究竟是什麼呢?介紹一個抓包工具——fidder,用這個工具就能夠查看到底報文頭部是什麼了。這裏就不展現了,本身下去常識了。而且我能夠確切的保證,確實僞形成功了。
這樣,咱們就把爬蟲代碼升級了一下,能夠搞定普通的反爬蟲限制