一、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 中提供的代理身份覆盖掉。
  • 在我们能判断内容长度的情况下,headerContent-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