登录
    Technology changes quickly but people's minds change slowly.

Python爬虫之Requests库

技术宅 破玉 1792次浏览 0个评论

引言

    

Requests 允许你发送纯天然,植物饲养的 HTTP/1.1 请求,无需手工劳动。你不需要手动为 URL 添加查询字串,也不需要对 POST 数据进行表单编码。Keep-alive 和 HTTP 连接池的功能是 100% 自动化的,一切动力都来自于根植在 Requests 内部的 urllib3。

官方文档

安装requests

sudo  pip3 install requests

小测试

  我们通过一个小测试来看一下requests库的用法

#!/usr/bin/env python3
#-*- coding : utf-8
import requests
r=requests.get('http://www.jrzj.com/')
print(type(r))
print(r.status_code)
print(r.encoding)
print(r.cookies)
#print(r.content)

  我们请求了某站点的网址,然后打印出了返回结果的类型,状态码,编码方式,Cookies等内容。
运行结果:


200
utf-8

发送请求

r = requests.get('https://github.com/timeline.json')
r = requests.post("http://httpbin.org/post")
r = requests.put("http://httpbin.org/put")
r = requests.delete("http://httpbin.org/delete")
r = requests.head("http://httpbin.org/get")
r = requests.options("http://httpbin.org/get")

传递URL参数

  你也许经常想为 URL 的查询字符串(query string)传递某种数据。如果你是手工构建 URL,那么数据会以键/值对的形式置于 URL 中,跟在一个问号的后面。例如, httpbin.org/get?key=val。 Requests 允许你使用 params 关键字参数,以一个字典来提供这些参数。举例来说,如果你想传递 key1=value1 和 key2=value2 到 httpbin.org/get ,那么你可以使用如下代码:

payload={'key1':'value1','key2':'value2'}
r=requests.get("http://httpbin.org/get",params=payload)
print(r.url)

运行结果,通过打印输出该 URL,你能看到 URL 已被正确编码::

http://httpbin.org/get?key1=value1&key2=value2

注意字典里值为 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

响应内容

我们能读取服务器响应的内容。再次以 GitHub 时间线为例:

r=requests.get('https://github.com/timeline.json')
print(r.text)

Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。

请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用 r.encoding 属性来改变它:

print(r.encoding)

如果你改变了编码,每当你访问 r.text ,Request 都将会使用 r.encoding 的新值。你可能希望在使用特殊逻辑计算出文本的编码的情况下来修改编码。比如 HTTP 和 XML 自身可以指定编码。这样的话,你应该使用 r.content 来找到编码,然后设置 r.encoding 为相应的编码。这样就能使用正确的编码解析 r.text 了。

二进制响应内容

你也能以字节的方式访问请求响应体,对于非文本请求:

r.content

Requests 会自动为你解码 gzip 和 deflate 传输编码的响应数据。

JSON 响应内容

Requests 中也有一个内置的 JSON 解码器,助你处理 JSON 数据:

如果 JSON 解码失败, r.json 就会抛出一个异常。例如,相应内容是 401 (Unauthorized),尝试访问 r.json 将会抛出 ValueError: No JSON object could be decoded 异常。

原始响应内容

在罕见的情况下,你可能想获取来自服务器的原始套接字响应,那么你可以访问 r.raw。 如果你确实想这么干,那请你确保在初始请求中设置了 stream=True。具体你可以这么做:


华裳绕指柔, 版权所有丨如未注明 , 均为原创|转载请注明Python爬虫之Requests库
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址