Python requests 是一个常用的 HTTP 请求库,可以方便地向网站发送 HTTP 请求,并获取响应结果。
requests 模块比 urllib 模块更简洁。
使用 requests 发送 HTTP 请求需要先导入 requests 模块:
import requests
请求
GET 请求
r = requests.get('http://httpbin.org/get')
print(r.json())
运行结果如下:
利用 params 参数自动构建 URL 地址
params = {
'name': 'chenqimiao',
'age': 25
}
r = requests.get('http://httpbin.org/get', params=params)
print(r.json())
运行结果如下:
添加 headers
在发起一个 HTTP 请求的时候,会有一个请求头 Request Headers,通过 headers 参数就可以设置了。如果不设置,某些网站会发现这不是一个正常的浏览器发起的请求,网站就会返回异常的结果,导致网页抓取失败。
要添加 Headers 信息,比如这里想添加一个 User-Agent 字段,可以这样写:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.50'
}
r = requests.get('http://httpbin.org/get', headers=headers)
print(r.json())
运行结果如下:
POST 请求
data = {
'name': 'chenqimiao',
'age': 25
}
r = requests.post('http://httpbin.org/post', data=data)
print(r.json())
运行结果如下:
响应
每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息,如状态码、响应头、响应内容等:
print(r.status_code) # 获取响应状态码
print(r.headers) # 获取响应头
print(r.content) # 获取响应内容
更多响应信息如下:
属性或方法 | 说明 |
---|---|
close() | 关闭与服务器的连接 |
cookies | 返回一个 CookieJar 对象,包含了从服务器发回的 cookie |
encoding | 解码 r.text 的编码方式 |
history | 返回包含请求历史的响应对象列表 |
json() | 返回结果的 JSON 对象 |
next | 返回重定向链中下一个请求的 PreparedRequest 对象 |
ok | 检查 status_code 的值,如果小于 400,则返回 True,否则,则返回 False |
reason | 响应状态的描述,比如 Not Found 或者 OK |
text | 返回响应的内容,Unicode 类型的数据 |
url | 返回响应的 URL |
文件上传
files = {'file': open('jd.png', 'rb')}
r = requests.post('http://httpbin.org/post', files=files)
print(r.json())
Session 维持
在 requests 中,如果直接利用 get 或 post 等方法的确可以做到模拟网页的请求,但是这实际上是相当于不同的 Session,相当于你用两个浏览器打开了不同的页面。
通过维护一个 Session 就不用担心 Cookies 的问题了。
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.json())
运行结果如下:
SSL 证书验证
现在很多网站都要求使用 HTTPS 协议,但是有些网站可能并没有设置好 HTTPS 证书,或者网站的 HTTPS 证书不被 CA 机构认可,这时候,这些网站可能就会出现 SSL 证书错误的提示。
如果要爬这些网站,可以使用 verify 参数控制是否检验证书,如果将其设置为 False,在请求时就不会再验证证书是否有效。
r = requests.get('https://static2.scrape.center/', verify=False)
print(r.status_code)
运行结果如下:
超时设置
在本机网络状况不好或者服务器网络响应延迟甚至无响应时,可能需要等待很久才能收到响应,甚至到最后会因为收不到响应而报错。为了防止服务器不能及时响应,应该设置一个超时时间,即超过了这个时间还没有得到响应,那就报错。可以使用 timeout 参数实现这一功能。这个时间的计算是发出请求到服务器返回响应的时间。
r = requests.get('https://httpbin.org/get', timeout=2)
print(r.status_code)
运行结果如下:
代理设置
某些网站在测试的时候请求几次,能正常获取内容。但是对于大规模且频繁的请求,网站可能会弹出验证码,或者跳转到登录认证页面,甚至可能会直接封禁客户端的 IP,导致一定时间段内无法访问。
为了防止这种情况的发生,可以通过设置代理来解决这个问题。
import requests
proxies = {
'http': 'http://10.10.10.10:1080',
'https': 'http://10.10.10.10:1080',
}
requests.get('https://httpbin.org/get', proxies=proxies)