requests是python實現(xiàn)的簡單易用的HTTP庫葡公,使用起來比urllib簡潔很多
因為是第三方庫序目,所以使用前需要cmd安裝
pip install requests
安裝完成后import一下,正常則說明可以開始使用了岩梳。
基本用法:
requests.get()用于請求目標網(wǎng)站囊骤,類型是一個HTTPresponse類型
import requests
response = requests.get('http://www.baidu.com')
print(response.status_code)? # 打印狀態(tài)碼
print(response.url)? ? ? ? ? # 打印請求url
print(response.headers)? ? ? # 打印頭信息
print(response.cookies)? ? ? # 打印cookie信息
print(response.text)? #以文本形式打印網(wǎng)頁源碼
print(response.content) #以字節(jié)流形式打印
運行結果:
狀態(tài)碼:200
url:www.baidu.com
headers信息
import requests
requests.get('http://httpbin.org/get')
requests.post('http://httpbin.org/post')
requests.put('http://httpbin.org/put')
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')
基本的get請求
import requests
response = requests.get('http://httpbin.org/get')print(response.text)
結果
帶參數(shù)的GET請求:
第一種直接將參數(shù)放在url內(nèi)
import requests
response = requests.get(http://httpbin.org/get?name=gemey&age=22)print(response.text)
結果
另一種先將參數(shù)填寫在dict中,發(fā)起請求時params參數(shù)指定為dict
import requests
data = {
? ? 'name':'tom',
? ? 'age': 20}
response = requests.get('http://httpbin.org/get', params=data)
print(response.text)
結果同上
解析json
import requests
response = requests.get('http://httpbin.org/get')
print(response.text)
print(response.json())
#response.json()方法同
json.loads(response.text)
print(type(response.json()))
結果
簡單保存一個二進制文件
二進制內(nèi)容為response.content
import requests
response = requests.get('http://img.ivsky.com/img/tupian/pre/201708/30/kekeersitao-002.jpg')
b = response.content
with open('F://fengjing.jpg','wb') as f:
? ? f.write(b)
為你的請求添加頭信息
import requests
heads = {}
heads['User-Agent'] = 'Mozilla/5.0 ' \
? ? ? ? ? ? ? ? ? ? ? ? ? '(Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 ' \
? ? ? ? ? ? ? ? ? ? ? ? ? '(KHTML, like Gecko) Version/5.1 Safari/534.50'
response = requests.get('http://www.baidu.com',headers=headers)
使用代理
同添加headers方法冀值,代理參數(shù)也要是一個dict
這里使用requests庫爬取了IP代理網(wǎng)站的IP與端口和類型
因為是免費的也物,使用的代理地址很快就失效了。
import requestsimport redef get_html(url):
? ? proxy = {
? ? ? ? 'http':'120.25.253.234:812','https''163.125.222.244:8123'? ? }
? ? heads = {}
? ? heads['User-Agent'] ='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'? ? req = requests.get(url, headers=heads,proxies=proxy)
? ? html = req.text
? ? return htmldef get_ipport(html):
? ? regex = r'(.+)'? ? iplist = re.findall(regex, html)
? ? regex2 ='(.+)'? ? portlist = re.findall(regex2, html)
? ? regex3 = r'(.+)'? ? typelist = re.findall(regex3, html)
? ? sumray = []
? ? foriin iplist:
? ? ? ? forpin portlist:
? ? ? ? ? ? fortin typelist:
? ? ? ? ? ? ? ? passpass? ? ? ? a = t+','+i +':'+ p
? ? ? ? sumray.append(a)
? ? print('高匿代理')
? ? print(sumray)if__name__=='__main__':
? ? url ='http://www.kuaidaili.com/free/'? ? get_ipport(get_html(url))
結果:
基本POST請求:
import requests
data = {'name':'tom','age':'22'}
response = requests.post('http://httpbin.org/post', data=data)
?獲取cookie
#獲取cookieimport requests
response = requests.get('http://www.baidu.com')
print(response.cookies)
print(type(response.cookies))
for k,v in response.cookies.items():
? ? print(k+':'+v)
結果:
會話維持
import requests
session = requests.Session()
session.get('http://httpbin.org/cookies/set/number/12345')
response = session.get('http://httpbin.org/cookies')print(response.text)
結果:
證書驗證設置
import requestsfromrequests.packagesimport urllib3
urllib3.disable_warnings()? #從urllib3中消除警告response = requests.get('https://www.12306.cn',verify=False)#證書驗證設為FALSEprint(response.status_code)
打印結果:200
超時異常捕獲
import requestsfromrequests.exceptionsimport ReadTimeouttry:
? ? res = requests.get('http://httpbin.org', timeout=0.1)
? ? print(res.status_code)except ReadTimeout:
? ? print(timeout)
異常處理
在你不確定會發(fā)生什么錯誤時列疗,盡量使用try...except來捕獲異常
所有的requests exception:
import requestsfromrequests.exceptionsimport ReadTimeout,HTTPError,RequestExceptiontry:
? ? response = requests.get('http://www.baidu.com',timeout=0.5)
? ? print(response.status_code)except ReadTimeout:
? ? print('timeout')except HTTPError:
? ? print('httperror')except RequestException:
? ? print('reqerror')