python中urllib和urllib2庫(kù)的使用

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

request,response:


http協(xié)議解析網(wǎng)頁(yè)過(guò)程

爬蟲爬取信息的過(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()


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、概述 urllib2是Python的一個(gè)針對(duì)URLs的庫(kù)。他以u(píng)rlopen函數(shù)的形式提供了一個(gè)非常簡(jiǎn)單的...
    MiracleJQ閱讀 1,561評(píng)論 0 5
  • urllib2是Python的一個(gè)獲取URLs的組件。他以u(píng)rlopen函數(shù)的形式提供了一個(gè)非常簡(jiǎn)單的接口,具有利...
    查無(wú)此人asdasd閱讀 1,626評(píng)論 0 3
  • 用python也差不多一年多了,python應(yīng)用最多的場(chǎng)景還是web快速開發(fā)、爬蟲、自動(dòng)化運(yùn)維:寫過(guò)簡(jiǎn)單網(wǎng)站、寫過(guò)...
    蝴蝶蘭玫瑰閱讀 537評(píng)論 0 1
  • Python學(xué)習(xí)網(wǎng)絡(luò)爬蟲主要分3個(gè)大的版塊:抓取,分析,存儲(chǔ) 另外,比較常用的爬蟲框架Scrapy,這里最后也詳細(xì)...
    楚江數(shù)據(jù)閱讀 1,532評(píng)論 0 6
  • 最近網(wǎng)上流傳一篇保溫杯的文章,戳中很多男人的內(nèi)心。人人都有中年的那一天。張愛玲曾寫道,“中年以后的男人,時(shí)常會(huì)覺得...
    有融網(wǎng)閱讀 355評(píng)論 0 0

友情鏈接更多精彩內(nèi)容