請(qǐng)求與響應(yīng)

request,response:

爬蟲爬取信息的過(guò)程實(shí)質(zhì)上是一個(gè)請(qǐng)求與相應(yīng)的模型,即:
? ? ? ? ? ? ? ? ? ? ? ? 建立連接,發(fā)出請(qǐng)求信息,回送響應(yīng)信息,關(guān)閉連接
python中的urllib,urllib2庫(kù)中可以實(shí)現(xiàn)http功能,urllib2為主
那么接下來(lái),我們可以嘗試一下用python實(shí)現(xiàn)一下http協(xié)議過(guò)程:
import urllib2
request = urllib2.Request('http://www.zhihu.com')
response = urllib2.urlopen(request)
html = response.read()
print html
這是一段獲取知乎網(wǎng)站html信息的代碼,

咦,是不是發(fā)現(xiàn)哪里不對(duì)勁,出現(xiàn)了亂碼……
沒(méi)有關(guān)系,需要做的就是要decode一下:
? ? ? ? ?html = response.read().decode('utf-8')

看,一個(gè)簡(jiǎn)單的http過(guò)程就好了。
當(dāng)然,在這一個(gè)過(guò)程中,主要是用到了Get請(qǐng)求,即從服務(wù)器端獲取數(shù)據(jù),但是我們知道,除了Get請(qǐng)求,還有一種請(qǐng)求是Post請(qǐng)求,就好比client和Server端在戀愛,有所獲得也要有所付出,這樣關(guān)系才更為牢靠,當(dāng)然這不是絕對(duì)的,在這里只是打了一個(gè)比方,幫助更好理解。
來(lái)看一下下面的例子:
import urllib2
import urllib
url = 'http://www.zhihu.com/login'
postdata = {'username':'frank'
'password':'123456'
}
data = urllib.urlencode(postdata)#編碼用到了urllib庫(kù),為了使urllib2能看懂
request = urllib2.Request(url,data)#在request過(guò)程中實(shí)現(xiàn)了post過(guò)程,把用戶名和密碼傳過(guò)去
response.urllib2.urlopen(request)
html = response.read()
print html
可是,站在Server端考慮,我希望我的用戶是用戶的正常訪問(wèn),即通過(guò)瀏覽器正常訪問(wèn),而不是程序強(qiáng)行剛?cè)?,所以大部分網(wǎng)站服務(wù)器都會(huì)檢查請(qǐng)求頭,所以嘛,我們需要偽裝一下,就像使看特工影視劇,我們要潛伏之前,都要有一個(gè)身份,這樣才能夠方便我們通過(guò)檢驗(yàn)。于是乎,就有了
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? headers處理
其實(shí)做法也很簡(jiǎn)單:
? ? ? ? ? ?user_agent = 'Mozilla/4.0 (compatible;MSIE 5.5;Windows NT)'
然后在
? ? ? ? ? ? ? ? ?request = urllib2.Request(url, data,user_agent)
這里是舉一個(gè)例子,很多地方是這樣寫,
? ? ? ? ? ? ? ? ?headers = {‘user_agent’:user_agent,'Referer':referer}
? ? ? ? ? ? ? ? ?user_agent和Referer的定義寫在前面
還有另外一種,就是用add_header方法
? ? ? ? ? ? ? ? ?request = urllib2.Request(url)
? ? ? ? ? ? ? ? ?request.add_header('User-Agent',user_agent)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cookie處理

我對(duì)cookie的理解并不深刻,所以從網(wǎng)上找到了一種解釋:

由此我們可以看出cookie的作用,鑒于此:
import urllib2
import cookielib
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open('http://www.zhihu.com')
for item in cookie:
print item.name+':'+item.value
之后還需要設(shè)置time超時(shí),就像我們等人不能一直等,需要有一個(gè)時(shí)間限制一樣
只需要在urlopen(request,timeout=3)
在一些情況下,我們可能還需要用到HTTP響應(yīng)碼來(lái)判斷,以及當(dāng)返回的是HTTP3XX時(shí)候,要進(jìn)行重定向操作
最后一部分要強(qiáng)調(diào)的是代理服務(wù):
為啥要用代理,Server也不傻,一個(gè)地方頻繁的多次不合理的訪問(wèn),人家肯定就會(huì)注意到了,所以我們要偽裝一下。
import urllib2
proxy = urllib2.ProxyHandler({'http':'127.0.0.1:8087'})
opener = urllib2.build_opener([proxy,])
urllib2.install_opener(opener)
response =opener.open('http://www.zhihu.com/')
print response.read()