keywords:
- urllib2,BeautifulSoup,cookielib
題外話:
小弟是編程愛好者,各位看官輕拍。
最近在使用urllib2抓取網頁內容,在學習的過程中也查閱了不少資料,並從中收獲很多。在查閱資料的過程中,我發現大部分資料都是建立在對urllib2的熟悉基礎之上,程序的細節並未顧及到新手看到這份資料會產生怎樣的困惑。在接下來的內容中,我會寫到我碰到的疑問以及解決方法。如果你也碰到類似的困惑,希望給予你幫助。
一.urllib2簡介
urllib2提供一個基礎函數urlopen,通過向指定的URL發出請求來獲取數據。最簡單的形式就是
- import urllib2
- response=urllib2.urlopen('http://www.douban.com')
- html=response.read()
這個過程就是我們平時刷網頁的代碼表現形式,它基於請求-響應模型。
- response=urllib2.urlopen('http://www.douban.com')
實際上可以看作兩個步驟:
我們指定一個域名並發送請求
1.
- request=urllib2.request('http://www.douban.com')
接着服務端響應來自客戶端的請求
2.
- response=urllib2.urlopen(request)
也許你會注意到,我們平時除了刷網頁的操作,還有向網頁提交數據。這種提交數據的行為,urllib2會把它翻譯為:
- import urllib
- import urllib2
- url = 'http://www.douban.com'
- info = {'name' : 'Michael Foord',
- 'location' : 'Northampton'}
- data = urllib.urlencode(info) #info 需要被編碼為urllib2能理解的格式,這里用到的是urllib
- req = urllib2.Request(url, data)
- response = urllib2.urlopen(req)
- the_page = response.read()
有時你會碰到,程序也對,但是服務器拒絕你的訪問。這是為什么呢?問題出在請求中的頭信息(header)。
有的服務端有潔癖,不喜歡程序來觸摸它。這個時候你需要將你的程序偽裝成瀏覽器來發出請求。請求的方式就包含在header中。
常見的情形:
- import urllib
- import urllib2
- url = 'http://www.someserver.com/cgi-bin/register.cgi'
- user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'# 將user_agent寫入頭信息
- values = {'name' : 'Michael Foord',
- 'location' : 'Northampton',
- 'language' : 'Python' }
- headers = { 'User-Agent' : user_agent }
- data = urllib.urlencode(values)
- req = urllib2.Request(url, data, headers)
- response = urllib2.urlopen(req)
- the_page = response.read()
二.示例
模擬一個利用cookie登錄人人網的過程 
2012-03-07 21:34 上傳
說明:
1.人人網的登錄地址需要用BeautifulSoup來抓取。
2.個人信息存在info中。info是一個字典{'email':'xx','password':'xx'}.key的命名需要根據實際網頁中定義,比如豆瓣的定義是{'form_email':'xx','form_password':'xx'}
3.使用cookie的好處在於,登錄之后你可以使用cookie中保存的信息作為頭信息的一部分,利用已經保存的頭信息接着訪問網站。
參考:
HOWTO Fetch Internet Resources Using urllib2
Beautiful Soup 中文文檔
How to use Python to login to a webpage and retrieve cookies for later usage?
