HTTP的訪問過程就是一來一回的. python提供的urllib2很方便發起訪問請求:
* urllib2.urlopen(url)
url為完整的URL
* urllib2.urlopen(request)
request為urllib2.Request類執行個體
這樣就發起了HTTP訪問請求.
現在的網站一般都會對自動處理指令碼起防範的. 比如在header段的cookie, 還有就是在post請求發出的資料中加入key=value形式的一串字串.
I. 請求的header段處理
header在python對應的資料結構就是dict, 如:
{'cookie': '111111111111111', 'Accept-Encoding': 'gzip,deflate'}
使用方法:
request = urllib2.Request(url, headers) # headers就是字典執行個體
retval = urllib2.urlopen(request) # 請求將被發出去
II. post的資料處理
post的資料在python對應的資料結構是str, 如:
'person=jessinio&gender=male'
使用方法有兩種:
1.
retval = urllib2.urlopen(url='http://www.google.com', data='person=jessinio&gender=male') #這樣一個post請求就被發出去了.
2.
request = urllib2.Request(url, data='person=jessinio&gender=male') #指定request執行個體擁有的data字串
retval = urllib2.urlopen(request) # 請求將被發出去
* 只要知道headers和post請求需要的資料結構是對應於python哪種執行個體後就很容易使用urllib2庫
請求發出來, 接來又來一個問題: 請求後返回的資料是什麼東西?
全世界都知道返回的東西肯定是字元流~~~(-_-)
常常在平時出現這樣的問題: 請求一個html檔案, 但返回的不是文本資料. 比如gzip. 那就需要處理一次:
if retval.headers.has_key('content-encoding'):
fileobj = StringIO.StringIO()
fileobj.write(url.read())
fileobj.seek(0)
gzip_file = gzip.GzipFile(fileobj=fileobj)
context = gzip_file.read()
else:
context = url.read()
這樣就很方便得到文本資料了.
原文連結:http://blog.jessinio.info/2009/11/urllib2.html