python学习——requests库的基本用法

获取某个网页

import requests 
r = requests. get('https://www.baidu.com/') 
print(type(r)) 
print(r. status_code) 
print (type(r. text)) 
print(r. text) 
print(r.cookies)

各种请求

# 发送一个 HTTP POST 请求:
r = requests.post("http://httpbin.org/post",
data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')    
# 发送一个 HTTP delete 请求:
r = requests.head('http://httpbin.org/get')        
 # 发送一个 HTTP head 请求:
r = requests.options('http://httpbin.org/get')      
# 发送一个 HTTP options 请求:

构造get请求传递参数

对于 GET 请求,利用 params 这个参数

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

还可以将一个列表作为值传入

import requests 
data={
    "key1":"value1",
    "key2":["value2","value3"]}
r = requests.get('http://httpbin.org/get', params=data)
print(r.url)
#http://httpbin.org/get?key1=value1&key2=value2&key2=value3

注意:字典里值为 None 的键都不会被添加到 URL 的查询字符串里。

另外,网页的返回类型实际上是str类型,但是它很特殊,是 JSON 格式的。 所以,如果想直接解析返回结果,得到一个字典格式的话,可以直接调用 json()方法。 示例如下:

import requests 
r = requests.get('http://httpbin.org/get')
print(r.json())
'''
{'args': {}, 
'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.23.0', 'X-Amzn-Trace-Id': 'Root=1-5e9b0b15-4d6629f8460bc48037fa4244'}, 'origin': '124.164.123.240', 'url': 'http://httpbin.org/get'}
'''

抓取网页

以知乎-新闻页为例,需要构造请求头header。可以在开发者工具中找到。

import requests 
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0'
}
r = requests.get("https://daily.zhihu.com/",headers=headers)
print(r.text)

当然,我们可以在 headers 这个参数中任意添加其他的字段信息。

抓取二进制数据

在上面的例子中,我们抓取的是知乎的一个页面, 实际上它返回的是一个 HTML 文档。 如果想抓图片、音频、 视频等文件,应该怎么办呢?

图片、音频、视频这些文件本质上都是由二进制码组成的,由于有特定的保存格式和对应的解析方式, 我们才可以看到这些形形色色的多媒体。 所以,想要抓取它们,就要拿到它们的二进制码。

import requests 
r = requests.get("https://github.com/favicon.ico")
with open("favicon.jpg","wb") as f:
    f.write(r.content)

这里用了 open ()方法,它的第一个参数是文件名称,第二个参数代表以二进制写的形式打开,可以向文件里写入二进制数据。 运行结束之后,可以发现在文件夹中出现了名为 favicon.ico 的图标。

在此构建循环语句即可不断抓取数据。

POST请求

import requests 
data ={'name ':'germey', 'age':'22'} 
r = requests.post("http://httpbin.org/post", data=data) 
print(r.text) 
#部分输出:
# "form": {
#   "age": "22", 
#  "name ": "germey"
#}

form 部分就是提交的数据,这就证明 POST请求成功发送了。

响应

发送请求后,得到的自然就是响应。 在上面的实例中,我们使用 text 和 content 获取了响应的内容。 此外,还有很多属性和方法可以用来获取其他信息,比如状态码、响应头、 Cookies 等。

import requests 
r = requests.get('http://www.baidu.com') 
print(type(r.status_code), r.status_code) 
print(type(r.headers), r.headers) 
print ( type(r.cookies), r.cookies)
print(type(r. url), r. url)
print(type(r.history), r.history) 

这里分别打印输出 status_code 属性得到状态码,输出 headers 属性得到响应头,输出cookies 属性得到 Cookies,输出 url 属性得到 URL,输出 history 属性得到请求历史。

文件上传

import requests 
files = {'file' : open ('favicon.ico','rb')}
r = requests.post('http://httpbin.org/post', files=files) 
print(r.text) 

需要注意的是, favicon.ico 需要和当前脚本在同一 目录下。 如果有其他文件,当然也可以使用其他文件来上传,更改 下代码即可。

这个网站会返回响应,里面包含 files 这个字段,而 form 字段是空的,这证 明文件上传部分会单独有一个 files 字段来标识。

Cookies

先看获取Cookies

import requests 
r = requests.get('https://www.baidu.com') 
print(r.cookies) 
for key,value in r.cookies.items():
    print(key + '=' + value) 
#<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
#BDORZ=27315

这里我们首先调用 Cookies 属性即可成功得到 Cookies, 可以发现它是 RequestCookieJar 类型。 然后用 items()方法将其转化为元组组成的列表, 遍历输出每一个 Cookie 的名称和值, 实现 Cookie 的遍历解析。

我们也可以直接用 Cookie 来维持登录状态, 下面以知乎为例来说明。

import requests 

header={
    'Host':'www.zhihu.com',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0',
    'Cookie':'_zap=4f14e95a-0cea-4c5e-b2f7-45cfd43f9809; d_c0="AJCZtnMxyBCPTgURbVjB11p6-JAwsTtJB4E=|1581092643"; _xsrf=VaBV0QQwGFjz01Q9n2AmjAilhHrJXypa; tst=h; q_c1=516c72a5ff954c66b6563ff42e63387d|1585814979000|1582104705000; tshl=; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1587179989,1587216876,1587216886,1587267050; capsion_ticket="2|1:0|10:1587267052|14:capsion_ticket|44:YTUwMDY3MGYyNmJlNDU0ZTgxNjlhNjMwNWNkYzAxNmQ=|7b8a5ebd3649fb076617379e734a79cd7ef54d1242ddd1841aba6844c9d14727"; l_cap_id="YjJiNjc1MzY0ZmEzNGNlYjlkYThkODEyYmEzOWRiOTk=|1587222516|5a01a93ea68209c1116647750ed2131efa309a3d"; r_cap_id="N2EwMjY0N2NlNTM1NGZlMjliNGNhMGJmOTkyMDc1OTE=|1587222516|238b677c781f1ef90a7ad343d6cdd3871aff3269"; cap_id="OTVhNjZiMDQ3MDkzNGVjY2I5ZTUyNTlhOTcxNzk3Njg=|1587222516|6dd1ed77526aa949bccd4146ef218d8164804a6e"; KLBRSID=031b5396d5ab406499e2ac6fe1bb1a43|1587267062|1587267049; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1587267062; SESSIONID=wopWDVALc4X3RJObFrIWNChoNDJpogYSdBPicuRm7vV; JOID=WlgXBkLsoG-SjPrGduF5tDN1xettk80YycmkhT2OnDWm0rGBFgxg_8GF8MN9HDmwsdmzwZheWKVLuonghNnDleo=; osd=V1gXB0vhoG-ThffGduBwuTN1xOJgk80ZwMSkhTyHkTWm07iMFgxh9syF8MJ0ETmwsNC-wZhfUahLuojpidnDlOM=; z_c0="2|1:0|10:1587267060|4:z_c0|92:Mi4xT2JORUJnQUFBQUFBa0ptMmN6SElFQ1lBQUFCZ0FsVk45Qk9KWHdEa0NUcXVheUJDdnJtRzRUVEFHNjFqQThvd013|bb30373e1f13c8b751a3ffc09e8ab4c98780350f77989d93b20be7eb3a0b2fad"'

}
r = requests.get('https://www.zhihu.com/hot',headers=header) 
print(r.text) 

结果中包含了登录后的结果,当然,你也可以通过 cookies 参数来设置,不过这样就需要构造 RequestsCookieJar 对象,而且需 要分割一下 cookies。这相对烦琐

会话维持

在 requests 中,如果直接利用 get()或 post()等方法的确可以做到模拟网页的请求,但是这实际 上是相当于不同的会话,也就是说相当于你用了两个浏览器打开了不同的页面。

其实解决这个问题的主要方法就是维持同一个会话, 也就是相当于打开一个新的浏览器选项 卡而不是新开一个浏览器。 但是我又不想每次设置 cookies ,那该怎么办呢?这时候就有了新的 利器——Session 对象。

import requests 
s = requests.Session() 
s.get('http://httpbin.org/cookies/set/number/123456789') 
r = s.get('http://httpbin.org/cookies')
print(r.text) 
#{
#  "cookies": {
#    "number": "123456789"  }}

利用 Session ,可以做到模拟同一个会话而不用担心Cookies 的问题。 它通常用于模拟登录 成功之后再进行下一步的操作。

SLL证书验证

此外, requests 还提供了证书验证的功能。 当发送 HTTP 请求的时候,它会检查 SSL 证书,我们 可以使用 verify 参数控制是否检查此证书。 其实如果不加 verify 参数的话,默认是 True,会自动验证。

比如12306的网站,没有被官方CA,信任。

import requests 
response = requests.get('https://www.12306.cn', verify=False) 
print(response.status_code)

代理设置

为了防止多次访问后弹出验证码,或者跳转到登录认证页面的情况发生,我们需要设置代理来解决这个问题,这就需要用到 proxies 参数。 可以用这样的方式设置:

import requests 
proxies = { 'http':'http:10 .10.1.10:3128',
 'http':'http: //10.10.1.10: 1080', }
requests.get('https://www.taobao.com', proxies=proxies) 
#代理无效,请换用自己的代理

requests 还支持 SOCKS 协议的代理。

超时设置

在本机网络状况不好或者服务器网络响应太慢甚至无响应时,我们可能会等待特别久的时间才可 能收到响应,甚至到最后收不到响应而报错。 为了防止服务器不能及时响应,应该设置一个超时时间, 即超过了这个时间还没有得到响应,那就报错。 这需要用到 timeout 参数。 这个时间的计算是发送请求到服务器返回响应的时间。 示例如下:

import requests 
r=requests.get('https://www.taobao.com', timeout=1)
print(r.status_code) 

如果想永久等待,可以直接将 timeout 设置为 None,或者不设置直接留空,因为默认是 None。

身份验证

requests 提供了一个简单的写法,可以直接传一个元组,它会默认使用 HTTPBasicAuth 这个类来认证。

import requests 
r = requests.get('https://localhost:5000',
auth=(' username',' password'))

requests 还提供了其他认证方式,如 OAuth 认证。

上一篇:数据之路 - Python爬虫 - Requests库


下一篇:Python-Requests