其實(shí)在python中還有自帶的urllib, urllib2, urllib3,而request是國(guó)外程序開發(fā)的第三方庫(kù),至于他們的關(guān)系嘛塘匣,urllib和urllib2是相互獨(dú)立的關(guān)系谅海,而request則使用了urllib3滚婉,其優(yōu)點(diǎn)是多次請(qǐng)求重復(fù)使用一個(gè)socket凰狞,你想三次握手多麻煩豁陆,建立一個(gè)socket復(fù)用當(dāng)然能提高效率不是柑爸。
當(dāng)然了,使用這些的基礎(chǔ)是對(duì)http協(xié)議要有一定的認(rèn)識(shí)最好盒音,沒(méi)有的話只要你對(duì)發(fā)信收信的過(guò)程有一個(gè)概念就可以了表鳍。
所需:
pip install virtualenv(可選)
pip install request
pip install gunicorn
話不多說(shuō)show you the code:
- urllib2
其實(shí)在我的豆瓣爬蟲中就使用過(guò)urllib2,有興趣的可以移步瞅一眼
#coding=utf-8
import urllib2
import urllib
url = "http://httpbin.org/ip"
geturl = "http://httpbin.org/get"
def urllib2test():
response = urllib2.urlopen(url)
#響應(yīng)頭信息
print "====responseheaders===="
print response.info()
#響應(yīng)體
print "====responsbody===="
print ''.join([item for item in response.readlines()])
def urllibget():
params = urllib.urlencode({'param1': 'hello','param2': 'world'})
response = urllib2.urlopen('?'.join([geturl, '%s'])%params)
#響應(yīng)頭信息
print "====responseheaders===="
print response.info()
#響應(yīng)體
print "====responsbody===="
print ''.join([item for item in response.readlines()])
if __name__ == "__main__":
urllib2test()
urllibget()
這是一個(gè)簡(jiǎn)單的urllib2的使用,我們可以對(duì)其響應(yīng)部分像讀取文件一樣操作
[item for item in response.readlines()]是序列推導(dǎo)式祥诽,相當(dāng)于:
result = [];
for item in response.readlines():
result.append(item)
-
運(yùn)行結(jié)果
在使用request時(shí)譬圣,就簡(jiǎn)單了:
#coding="utf-8
import requests
ipurl = "http://httpbin.org/ip"
geturl = "http://httpbin.org/get"
def printinfo(res):
print ">>>>headers"
print res.headers
print ">>>>code"
print res.status_code
print ">>>>boyd"
print res.text
print ">>>>jsondata"
print res.json()
response1 = requests.get(ipurl)
printinfo(response1)
params = {'param1':'hello','param2':'world'}
response2 = requests.get(geturl, params = params)
printinfo(response2)
*運(yùn)行結(jié)果:
使用requests和github通信
#coding="utf-8"
import json
import requests
URL = 'https://api.github.com'
def build_uri(endpoint):
return '/'.join([URL,endpoint])
def better_print(json_str):
return json.dumps(json.loads(json_str), indent = 4)
def request_method():
response = requests.get(build_uri('users/hopevow'))
print better_print(response.text)
if __name__ == '__main__':
request_method()
運(yùn)行結(jié)果
總結(jié)
- 帶參數(shù)的請(qǐng)求
GET
request.get(url, params={'key1':'value1'}
POST
request.post(url, data = {'key1':'value1})
JSON參數(shù)提交
request.post(url, json={'key1':'value1'})