在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ Urllib 庫的高級(jí)用法
綜述
Cookie 的使用
爬蟲基礎(chǔ)了解
計(jì)算大學(xué)本學(xué)期績點(diǎn)
抓取淘寶 MM 照片
爬蟲框架 Scrapy 安裝配置
模擬登錄淘寶并獲取所有訂單
Urllib 庫的高級(jí)用法
URLError 異常處理
正則表達(dá)式
Beautiful Soup 的用法
爬取糗事百科段子
爬取百度貼吧帖子
Urllib 庫的基本使用

Urllib 庫的高級(jí)用法

設(shè)置 Headers

有些網(wǎng)站不會(huì)同意程序直接用上面的方式進(jìn)行訪問,如果識(shí)別有問題,那么站點(diǎn)根本不會(huì)響應(yīng),所以為了完全模擬瀏覽器的工作,我們需要設(shè)置一些 Headers 的屬性。

首先,打開我們的瀏覽器,調(diào)試瀏覽器 F12,我用的是 Chrome,打開網(wǎng)絡(luò)監(jiān)聽,示意如下,比如知乎,點(diǎn)登錄之后,我們會(huì)發(fā)現(xiàn)登陸之后界面都變化了,出現(xiàn)一個(gè)新的界面,實(shí)質(zhì)上這個(gè)頁面包含了許許多多的內(nèi)容,這些內(nèi)容也不是一次性就加載完成的,實(shí)質(zhì)上是執(zhí)行了好多次請求,一般是首先請求HTML文件,然后加載 JS,CSS 等等,經(jīng)過多次請求之后,網(wǎng)頁的骨架和肌肉全了,整個(gè)網(wǎng)頁的效果也就出來了。

http://wiki.jikexueyuan.com/project/python-crawler-guide/images/02.png" alt="" />

拆分這些請求,我們只看一第一個(gè)請求,你可以看到,有個(gè) Request URL,還有 headers,下面便是 response,圖片顯示得不全,小伙伴們可以親身實(shí)驗(yàn)一下。那么這個(gè)頭中包含了許許多多是信息,有文件編碼啦,壓縮方式啦,請求的 agent 啦等等。

其中,agent 就是請求的身份,如果沒有寫入請求身份,那么服務(wù)器不一定會(huì)響應(yīng),所以可以在 headers 中設(shè)置agent,例如下面的例子,這個(gè)例子只是說明了怎樣設(shè)置的 headers,小伙伴們看一下設(shè)置格式就好。

import urllib  
import urllib2  
url = 'http://www.server.com/login'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  
values = {'username' : 'cqc',  'password' : 'XXXX' }  
headers = { 'User-Agent' : user_agent }  
data = urllib.urlencode(values)  
request = urllib2.Request(url, data, headers)  
response = urllib2.urlopen(request)  
page = response.read()   

這樣,我們設(shè)置了一個(gè) headers,在構(gòu)建 request 時(shí)傳入,在請求時(shí),就加入了 headers 傳送,服務(wù)器若識(shí)別了是瀏覽器發(fā)來的請求,就會(huì)得到響應(yīng)。

另外,我們還有對付”反盜鏈”的方式,對付防盜鏈,服務(wù)器會(huì)識(shí)別 headers 中的 referer 是不是它自己,如果不是,有的服務(wù)器不會(huì)響應(yīng),所以我們還可以在 headers 中加入 referer

例如我們可以構(gòu)建下面的headers

headers = { 'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  ,
                        'Referer':'http://www.zhihu.com/articles' }    

同上面的方法,在傳送請求時(shí)把 headers 傳入 Request 參數(shù)里,這樣就能應(yīng)付防盜鏈了。

另外 headers 的一些屬性,下面的需要特別注意一下:

  • User-Agent : 有些服務(wù)器或 Proxy 會(huì)通過該值來判斷是否是瀏覽器發(fā)出的請求
  • Content-Type : 在使用 REST 接口時(shí),服務(wù)器會(huì)檢查該值,用來確定 HTTP Body 中的內(nèi)容該怎樣解析。
  • application/xml : 在 XML RPC,如 RESTful/SOAP 調(diào)用時(shí)使用
  • application/json : 在 JSON RPC 調(diào)用時(shí)使用
  • application/x-www-form-urlencoded : 瀏覽器提交 Web 表單時(shí)使用

在使用服務(wù)器提供的 RESTful 或 SOAP 服務(wù)時(shí), Content-Type 設(shè)置錯(cuò)誤會(huì)導(dǎo)致服務(wù)器拒絕服務(wù)

其他的有必要的可以審查瀏覽器的 headers 內(nèi)容,在構(gòu)建時(shí)寫入同樣的數(shù)據(jù)即可。

Proxy(代理)的設(shè)置

urllib2 默認(rèn)會(huì)使用環(huán)境變量 http_proxy 來設(shè)置 HTTP Proxy。假如一個(gè)網(wǎng)站它會(huì)檢測某一段時(shí)間某個(gè)IP 的訪問次數(shù),如果訪問次數(shù)過多,它會(huì)禁止你的訪問。所以你可以設(shè)置一些代理服務(wù)器來幫助你做工作,每隔一段時(shí)間換一個(gè)代理,網(wǎng)站君都不知道是誰在搗鬼了,這酸爽!

下面一段代碼說明了代理的設(shè)置用法

import urllib2
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
    opener = urllib2.build_opener(proxy_handler)
else:
    opener = urllib2.build_opener(null_proxy_handler)
urllib2.install_opener(opener)  

Timeout 設(shè)置

上一節(jié)已經(jīng)說過 urlopen 方法了,第三個(gè)參數(shù)就是 timeout 的設(shè)置,可以設(shè)置等待多久超時(shí),為了解決一些網(wǎng)站實(shí)在響應(yīng)過慢而造成的影響。

例如下面的代碼,如果第二個(gè)參數(shù) data 為空那么要特別指定是 timeout 是多少,寫明形參,如果data已經(jīng)傳入,則不必聲明。

import urllib2
response = urllib2.urlopen('http://www.baidu.com', timeout=10)
import urllib2
response = urllib2.urlopen('http://www.baidu.com',data, 10)  

使用 HTTP 的 PUT 和 DELETE 方法

http 協(xié)議有六種請求方法,get,head,put,delete,post,options,我們有時(shí)候需要用到 PUT 方式或者 DELETE 方式請求。

PUT:這個(gè)方法比較少見。HTML 表單也不支持這個(gè)。本質(zhì)上來講, PUT 和 POST 極為相似,都是向服務(wù)器發(fā)送數(shù)據(jù),但它們之間有一個(gè)重要區(qū)別,PUT 通常指定了資源的存放位置,而 POST 則沒有,POST 的數(shù)據(jù)存放位置由服務(wù)器自己決定。 DELETE:刪除某一個(gè)資源?;旧线@個(gè)也很少見,不過還是有一些地方比如amazon的S3云服務(wù)里面就用的這個(gè)方法來刪除資源。 如果要使用 HTTP PUT 和 DELETE ,只能使用比較低層的 httplib 庫。雖然如此,我們還是能通過下面的方式,使 urllib2 能夠發(fā)出 PUT 或DELETE 的請求,不過用的次數(shù)的確是少,在這里提一下。

import urllib2
request = urllib2.Request(uri, data=data)
request.get_method = lambda: 'PUT' # or 'DELETE'
response = urllib2.urlopen(request)  

使用 DebugLog

可以通過下面的方法把 Debug Log 打開,這樣收發(fā)包的內(nèi)容就會(huì)在屏幕上打印出來,方便調(diào)試,這個(gè)也不太常用,僅提一下

import urllib2
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
opener = urllib2.build_opener(httpHandler, httpsHandler)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.baidu.com')  

以上便是一部分高級(jí)特性,前三個(gè)是重要內(nèi)容,在后面,還有 cookies 的設(shè)置還有異常的處理,小伙伴們加油!