美文网首页
Requests的用法

Requests的用法

作者: 冰度猎魂 | 来源:发表于2018-12-07 23:11 被阅读0次

request的基本用法

urllib库中的urlopen()方法实际上是以GET方式请求网页,而requests中相应的方法就是get()方法。

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)
运行结果

这里我们调用get()方法实现与urlopen()相同的操作,得到一个Response对象,然后分别输出了Response的类型、状态码、响应体的类型、内容以及Cookies。
通过运行结果可以发现,它返回类型是requests.models.Response,响应体的类型是字符串str,Cookies的类型是RequestsCookiesJar。
其他类型的请求依然可以用一句requests来实现:

r = requests.post('http://httpbin.org/post')
r = requests.put('http://httpbin.org/post')
r = requests.delete('http://httpbin.org/post')
r = requests.head('http://httpbin.org/post')
r = requests.options('http://httpbin.org/post')

GET请求

HTTP中最常见的请求之一就是GET请求。

import requests
r = requests.get('http://httpbin.org/get')
print(r.text)
运行结果

可以发现,我们成功发起了GET请求,返回结果中包含请求头、URL、IP等信息。
添加参数,可以使用字典来传递。

import requests
data = {
    'name': 'germey',
    'age': 22
}
r = requests.get('http://httpbin.org/get', params=data)
print(r.text)
运行结果
通过运行结果可以判断,请求的链接自动被构成了:http://httpbin.org/get?age=22&name=getmey
另外,网页的返回类型实际上是str类型,但是它很特殊,是JSON格式的。所以,如果想直接解析返回结果,得到一个字典格式的话,可以直接调用json()方法。示例如下:
import requests

r = requests.get("http://httpbin.org/get")
print(type(r.text))
print(r.json())
print(type(r.json()))

可以发现,调用json()方法,就可以将返回结果是JSON格式的字符串转化为字典。
但是,需要注意的是,如果返回结果不是JSON格式,便会出现解析错误,抛出json.decoder.JSONDecodeError异常。

抓取网页

上面的请求链接返回的是JSON形式的字符串,那么如果请求普通的网页,则肯定能获得相应的内容了。

import requests
import re

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko)
        Chrome/52.0.2743.116 Safari/537.36'
}
r = requests.get("https://www.zhihu.com/explore", headers=headers)
pattern = re.compile('explore-feed.*?question_link.*?>(.*?)</a>', re,S)
titles = re.findall(pattern, r,text)
print(titles)

这里我们加入了headers信息,其中包含了User-Agent字段信息,也就是浏览器标识信息。如果不加这个,知乎会禁止抓取。

抓取二进制数据

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

import requests

r = requests.get("https://github.com/favicon.ico")
print(r.text)
print(r.content)

运行程序可以发现,得到的数据会出现乱码,后者结果前面带有一个b,这代表是bytes类型的数据。由于图片是二进制数据,所以前者在打印时转化为str类型,也就是图片直接转化为字符串,这便会出现乱码。

import requests

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

这里用了open()方法,它的第一个参数是文件名称,第二个参数代表以二进制写的形式打开,可以向文件里写入二进制数据。
同样的,音频和视频文件也可以用这种方法获取。

添加headers

添加urllib.request一样,我们也可以通过headers参数来传递头信息。

r = requests.get("https://www.zhihu.com/explore", headers=headers)

POST请求

import requests

data = {'name': 'germey', 'age': '22'}
r = requests.post("http://httpbin.org/post", data=data)
print(r.text)

运行结果如下:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "age": "22", 
    "name": "germey"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "18", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.19.1"
  }, 
  "json": null, 
  "origin": "114.245.27.179", 
  "url": "http://httpbin.org/post"
}

可以发现,我们成功获得了返回结果,其中form部分就是提交的数据,这就证明POST请求成功发送了。

响应

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

import requests

r = requests.get('http://www.jianshu.com')
print(type(r.status_code), r.status_code)
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

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

状态码常用来判断请求是否成功,而requests还提供了一个内置的状态码查询对象requests.codes,示例如下:

import requests

r = requests.get('http://www.jianshu.com')
exit() if not r.status_code == requests.codes.ok else print('Request Successfully')

这里通过比较返回码和内置的成功的返回码,来保证请求得到了正常响应,输出成功请求的消息,否则程序终止,这里我们用requests.codes.ok得到的是成功的状态码200。

相关文章

网友评论

      本文标题:Requests的用法

      本文链接:https://www.haomeiwen.com/subject/sfkfhqtx.html