一、requests
安装 Requests
# 安装requests
pip install requests
# 导入requests
import requests
发送请求
# 注意 url 参数必须写完整,不能省略 "http://"
r = requests.get('https://api.github.com/events') # 返回的r 是 Response 对象
# 发送一个post请求
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
Requests 传递URL参数
Requests 允许你使用 params
关键字参数,以一个字符串字典来提供这些参数
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)
# print(r.url) 输出 http://httpbin.org/get?key2=value2&key1=value1
-
字典里值为
None
的键都不会被添加到 URL 的查询字符串里。 -
你还可以将一个列表作为值传入:
payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('http://httpbin.org/get', params=payload)
# print(r.url) 输出 http://httpbin.org/get?key1=value1&key2=value2&key2=value3
Requests 响应内容
r.text # Requests 会基于 HTTP 头部对响应的编码使用其推测的编码格式,显示全部的响应文本(html源码)
r.encoding = 'utf-8' # 修改编码格式为utf-8
r.content # 二进制响应内容
- 和 pillow 模块配合使用保存图片。需要县安装 pillow 。 pip install pillow
from PIL import Image
from io import BytesIO
import requests
r = requests.get('http://sc1.hao123img.com/res/r/image/2017-09-27/297f5edb1e984613083a2d3cc0c5bb36.png')
i = Image.open(BytesIO(r.content))
i.save('hap123.png')
JSON 响应内容
Requests 中也有一个内置的 JSON 解码器,助你处理 JSON 数据,r.json()
解码失败将会抛出 ValueError: No JSON object could be decoded
异常。
以下案例读取豆瓣电影返回的json数据
import requests
heads = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36'
}
r = requests.get('https://movie.douban.com/j/search_subjects?type=movie&tag=热门&page_limit=50&page_start=0',
headers=heads)
print(r.status_code)
d = r.json()
for k in d:
# print(k, ':', d[k])
for v in d[k]:
print(v['title'], ':', v['url'])
# 部分打印结果如下:
'''
200
杀死福顺 : https://movie.douban.com/subject/35521951/
俄罗斯方块 : https://movie.douban.com/subject/26087471/
花路阿朱妈 : https://movie.douban.com/subject/35800382/
'''
Requests 定制请求头
添加 HTTP 头部,只要简单地传递一个 dict 给 headers
参数就可以了。==所有的 header
值必须是 string、bytestring 或者 unicode==
- 如果在
.netrc
中设置了用户认证信息,使用 headers= 设置的授权就不会生效。而如果设置了 auth= 参数,.netrc
的设置就无效了。 - 如果被重定向到别的主机,授权
header
就会被删除。 - 代理授权
header
会被 URL 中提供的代理身份覆盖掉。 - 在我们能判断内容长度的情况下,
header
的Content-Length
会被改写。
例如上面例子中在headers 中添加User-Agent。
Requests POST请求用法
发送表单形式的数据,只需简单地传递一个字典给 data
参数
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
data
参数可以传入一个元组列表
payload = (('key1', 'value1'), ('key1', 'value2'))
r = requests.post('http://httpbin.org/post', data=payload)
传入的参数为对象时,可以使用 json.dumps() 将对象转换为 json 字符串
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload)) # json.dumps() 将python对象编码成Json字符串
POST一个多部分编码(Multipart-Encoded)的文件
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
url = 'http://httpbin.org/post'
files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
r = requests.post(url, files=files)
url = 'http://httpbin.org/post'
files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
r = requests.post(url, files=files)
- 烈建议你用二进制模式(binary mode)打开文件
- 如果你发送一个非常大的文件作为
multipart/form-data
请求,你可能希望将请求做成数据流。默认下 requests 不支持, 但有个第三方包requests-toolbelt
是支持的
Requests 响应状态码
r.status_code 为 200,r.status_code == requests.codes.ok 结果为True
可以使用 r.status_code == requests.codes.ok 判断响应是否成功。
状态码响应 4XX 5XX 可以通过 Response.raise_for_status()
来抛出异常。
Requests Cookie
url = 'http://httpbin.org/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies) # cookies 参数是一个字典对象
r = requests.get('http://www.baidu.com')
print(r.cookies) # 返回 RequestsCookieJar 对象
print(r.cookies.get_dict()) # RequestsCookieJar的 get_dict() 方法将cookies转化内dict 对象
cookies 参数也可以传入 RequestsCookieJar 对象
# cookies 参数也可以传入 RequestsCookieJar 对象
jar = requests.cookies.RequestsCookieJar()
jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
url = 'http://httpbin.org/cookies'
r = requests.get(url, cookies=jar)
Requests 超时
requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应
requests.get('http://github.com', timeout=5)
Requests 会话对象
s = requests.Session()
r = s.get('http://www.baidu.com')
二、requests-html
安装
pip install requests-html
基本使用
from requests_html import HTMLSession
# 获取请求对象
session = HTMLSession()
# 往新浪新闻主页发送 get 请求
sina = session.get('https://news.sina.com.cn')
# print(sina.status_code)
sina.encoding = 'utf-8'
# 获取响应文本信息,与requests无区别
print(sina.text)
获取链接
from requests_html import HTMLSession
# 获取请求对象
session = HTMLSession()
jd = session.get('https://jd.com')
print(jd.html.links)
# 我们还可以通过 absolute_links 获取所有的绝对链接
print(jd.html.absolute_links)
CSS 选择器与 XPATH