urllib2使用初探

  在入門urllib2以前,我想應該先調研一下urllib與urllib2的區別[1].首先咱們要明白的是,這兩個模塊不能夠相互替代.二者都是接受URL請求的模塊,可是提供了不一樣的功能,兩個顯著的區別是:html

1. 對於一個URL的request,urllib2.urlopen能夠接受一個request類的實例做爲參數, 從而設置HTTP請求的headers; 而urllib卻只能夠接受一個URL,這意味着你用urllib不能假裝user agent字符串(假裝成瀏覽器請求).python

2. urllib提供了一個urlencode方法,用來產生GET請求字符串,而urllib2卻沒有提供這個函數,這也是咱們還須要urllib來配合urllib2進行使用的緣由之一.瀏覽器

  此外,urllib.urlretrieve和urllib.quote等一系列quote和unquote函數沒有被假如到urllib2裏面,所以也須要urllib的協助.服務器

  還有一點須要注意的是: requests模塊可能urllib2模塊要好用,二者可能學一便可.cookie

1. urllib2.urlopen()函數的使用函數

  urllib2爲咱們提供了一個很基礎的函數: urlopen(url[,data,[timeout]]), 來幫助咱們經過給定的URL來獲取網頁數據(網頁源代碼), 返回該對象(從裏面能夠讀數據); 參數url: 能夠是包含url的字符串, 也能夠是urllib2.Request類的實例. 參數data: 是通過編碼的POST數據(能夠使用urllib.urlencode()編碼, 注意是urllib裏面的函數). 參數timeout: 是可選的超時時間(單位秒), 供全部阻塞操做內部使用.post

import urllib2  # 
 
url = 'https://www.zhihu.com/people/vihu'   # 待訪問的url
response = urllib2.urlopen(url)  # 請求訪問/打開這個url
urlContent = response.read()    # 讀取內容

讀取的部份內容以下圖所示:ui

再看下面的代碼, 獲得的結果和上面是相同的. HTTP基於請求-應答的機制. 由主機發出請求(Request), 而後由服務器端提供應答(urlopen). urllib2.Request(url[,data][,headers][,origin_req_host][,unverifiable]), 參數url: 請求的網址; 參數data: POST data; 參數headers: 頭部編碼

import urllib2

url = 'https://www.zhihu.com/people/vihu'
req = urllib2.Request(url)  # 建立一個請求對象
response = urllib2.urlopen(req)  # 返回一個相關請求的response對象
urlContent = response.read()

2. Cookielib模塊 url

cookielib主要用於提供可存儲cookie的對象, 以便於urllib2模塊進行配合來訪問網頁的數據. jar的中文翻譯爲"文件" 

                   CookieJar

                         |

                FileCookieJar

            /                    \

        MozillaCookieJar    LWPCookieJar

1) CookieJar()

    管理HTTP cookie的值, 存儲HTTP請求獲得的cookie, 向傳出的HTTP請求添加cookie對象.

2) FileCookieJar

3) MozilaCookieJar(filename, delayload=None, policy=None)

    Mozila的中文翻譯爲"瀏覽器", 建立於瀏覽器cookies.txt兼容的FileCookieJar實例.

4) LWPCookieJar(filename, delayload=None, policy=None)

    建立與libwww-perl的Set-Cookie3文件格式相兼容的FileCookieJar實例.

下面是從網上找到的登陸人人網的代碼:

#! /usr/bin/env python
#coding=utf-8
import urllib2
import urllib
import cookielib
# 你的用戶名和登陸密碼
data = {"email":"passbye@126.com","password":"123456"}
  
# 生成的post_data爲: password=123456&email=passbye%40126.com
post_data = urllib.urlencode(data)
# 用假如header,須要使用Request對象; 對有些header要注意,服務器會對其進行檢查; 下面假裝成Microsoft IE 6.0 見[2]
headers = {"User-agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1"}
# 發出請求
req = urllib2.Request("http://www.renren.com/PLogin.do",post_data,headers)

# 生成一個帶cookie的opener, opener是urllib2.OpenerDirector的一個實例
cj
= cookielib.CookieJar() # 建立一個CookieJar, 尚未存Cookie handler = urllib2.HTTPCookieProcessor(cj) # 利用HTTPCookieProcessor對象來建立cookie處理器
opener
= urllib2.build_opener(handler) # 利用build_opener來建立opener

# 這裏的open方法和urlopen使用相似 content
= opener.open(req) print content2.read().decode("utf-8").encode("gbk")

headers: 兩個詞之間用 - 分隔.

  • User-agent: 有些服務器或者Proxy(代理)會經過該值來判斷是不是瀏覽器發出的請求.(有的服務端拒絕程序來訪問, 這時候須要將程序假裝成瀏覽器來訪問, 請求的方式包含在header中). User-agent的中文名爲用戶代理, 是一個特殊字符串頭, 使得服務器可以識別客戶使用的操做系統及版本, CPU類型, 瀏覽器版本, 瀏覽器渲染引擎, 瀏覽器語言, 瀏覽器插件等等. Mozilla/Version (Platform; Encryption; 
  • Content-Type: 在使用REST接口時, 服務器會檢查該值, 用來肯定HTTP Body中的內容應該怎麼解析! 常見的如: 'text/html','image/jpeg'等.

post_data:

我的信息(帳號/密碼)寫在post_data裏面, 鍵的命名要跟你你的網頁來定義, 下面是人人網的, 用email, password關鍵詞.

參考: 

[1] Python:difference between urllib and urllib2: http://www.hacksparrow.com/python-difference-between-urllib-and-urllib2.html

[2] Python標準庫urllib2使用細節(文章): http://zhuoqiang.me/python-urllib2-usage.html

[3] 總結整理時下流行的瀏覽器User-Agent大全: http://www.360doc.com/content/12/1012/21/7662927_241124973.shtml

[4] urllib-URL handling modules: https://docs.python.org/3/library/urllib.html

相關文章
相關標籤/搜索