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。
网友评论