本系列所有文章基于 python3.5.2
requests 是基于 urllib 的三方模块,相比于 uillib, 操作更简洁,功能更强大,而且支持 python3
GET
直接调用 get
方法请求百度贴吧首页
import requests
r = requests.get(url='https://tieba.baidu.com/f')
print(r.status_code)
print(r.text)
得到如下结果:
200
...
<!--STATUS OK--><html><head><meta name="keywords" content="贴吧,,百度贴吧,论坛,兴趣,社区,BBS"/><meta name="description" content="百度贴吧——全球最大的中文社区。
...
带参数的 get 请求,这里请求李毅吧的首页
import requests
params = {'kw': '李毅'.encode('utf-8'),'fr':'ala0','tpl':'5'}
r = requests.get(url='https://tieba.baidu.com/f', params=params)
print(r.status_code)
print(r.text)
得到如下结果:
200
...
<meta charset="UTF-8">
<meta name="keywords" content="李毅,网友俱乐部,贴吧,三百六十行,神武">
...
POST
post 方法与 get 类似,直接调用即可
r = requests.post(url='https://tieba.baidu.com/f', params=params)
如果 post
上传数据,数据转换为 bytes 放在 data 字段即可
import requests
import json
upload_url = '***'
r = requests.post(upload_url, data=json.dumps({'some': 'data'}))
Headers
加上 HTTP 请求头也很简单,只需把各个参数作为写入 dict 传给 headers 参数即可
下面模拟浏览器请求中国天气网数据
import requests
url = 'http://www.weather.com.cn/weather/101010100.shtml'
header = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3226.400 QQBrowser/9.6.11681.400'
}
req = requests.get(url, headers=header)
req.encoding = 'utf-8' # 防止乱码
print(req.status_code)
print(req.text)
得到如下 HTTP 响应:
200
...
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>【北京天气】北京天气预报,蓝天,蓝天预报,雾霾,雾霾消散,天气预报一周,天气预报15天查询</title>
...
异常, JSON 解码
URL = 'http://ip.taobao.com/service/getIpInfo.php' # 淘宝IP地址库API
try:
r = requests.get(URL, params={'ip': '49.4.168.222'}, timeout=5)
r.raise_for_status() # 如果响应状态码不是 200,就主动抛出异常
except requests.RequestException as e:
print(e)
else:
result = r.json() # Requests中内置的JSON解码器
print(type(result), result, sep='\n')
得到结果:
{'code': 0, 'data': {'region_id': '110000', 'isp_id': '100017', 'county': '', 'city_id': '110100', 'region': '北京市', 'area_id': '100000', 'country_id': 'CN', 'city': '北京市', 'country': '中国', 'area': '华北', 'county_id': '-1', 'ip': '49.4.168.222', 'isp': '电信'}}
cookies
如果某个响应中包含 cookie ,可以快速的访问他们
import requests
r = requests.get('http://www.baidu.com', timeout=5)
print(tuple(r.cookies))
得到如下结果:
(Cookie(version=0, name='BDORZ', value='27315', port=None, port_specified=False, domain='.baidu.com'...
要想发送你的 cookies 到服务器,可以使用 cookies 参数:
cookies = {'BDUSS': 'n5-fjRvZ95b...', 'ispeed_lsm': '2', 'BD_UPN': '1a314753'} # 具体内容可用 fiddler 抓包获取
r = requests.get('http://www.baidu.com', cookies=cookies,timeout=5)
print(r.status_code)