Requests库详解

真正危险的不是计算机开始像人那样去思考,而是人类开始像计算机一样思考。
                                                                                ——西德尼·哈里斯(Sydney Harris)

python爬虫之旅之第二站~~

Requests库是经常用的库,比urllib更加方便。
首先先领略一下使用Requests的方便之处:

1
2
3
4
5
6
7
import requests
response=requests.get('http://aisleep.xyz')
print(type(response))
print(response.status_code)
print(type(response.text))
print(response.text)
print(response.cookies)

这里的第6行和在urllib中使用read的作用是一样的,在urllib中还要使用.decode使得其变成字符串类型。在Requests中就很方便了,直接使用text就可以了。在最后一行中的cookies获取中也比在urllib中方便很多。

再看requests中还提供了很多比较方便的各种请求方式:

1
2
3
4
5
6
import requests
requests.post("http://httpbin.org/post")
requests.put("http://httpbin.org/put")
requests.delete("http://httpbin.org/delete")
requests.head("http://httpbin.org/get")
requests.options("http://htpbin.org/get")

可见想要进行一个post请求,直接requests.post就好。


好,Requsets的方便之处你现在也稍微感受到一点了,现在在仔细的看一下他的使用。

  • get请求
1
2
3
import requests
response=requests.get('http://aisleep.xyz')
print(response.text)

这里就是一个最简单的一个get请求。那如果我们还要传一些自己的参数怎么设置呢:

1
2
3
import requests
response=requests.get("http://httpbin.org/get?name=lifan&age=23")
print(response.text)

也可以这样:

1
2
3
4
5
6
7
import requests
data={
'name':'lifan',
'age':23
}
response=requests.get("http://httpbin.org/get",params=data)
print(response.text)

第一种方法比较繁琐一点,需要加一个?再在多个参数之间再加上&就可以。第二种方法就是自己先构造一个字典,然后传给params就可以方便的构造一个get请求的url,不需要再手动输入了。

  • 解析json
1
2
3
4
5
import requests
response=requests.get("http://httpbin.org/get")
print(type(response.text))
print(response.json())
print(type(response.json()))

这是直接提供的了个解析json格式的方式,其实第4行就相当于进行一个这样的调用:print(json.load(response.text))(在前面再加一句import json)

  • 获取二进制数据
1
2
3
4
5
6
7
8
import requests
response=requests.get("https://github.com/favicon.ico")
print(type(response.text),type(response.content))
print(response.text)
print(response.content)
with open('favicon.ico','wb') as f:
f.write(response.content)
f.close()

这里使用content获取二进制数据,比如图片,视频等,第6行开始到结束做的是保存这个二进制文件的工作:打开一个文件,wb是说明对这个文件进行操作的方式为“以二进制格式打开一个文件只用于写入”,as f是帮这个文件起了一个别名,f.write是写入到打开的文件中,最后要关闭文件。

  • header添加

添加headers主要是模拟成你是浏览器要求的访问,防止被浏览网站所禁止。这里添加一个浏览器信息就好

1
2
3
4
5
6
7
import requests
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'

}
response=requests.get('http://www.zhihu.com',headers=headers)
print(response.text)
  • 基本的post请求
1
2
3
4
import requests
data={'name':'lifan','age':'23'}
response=requests.post("http://httpbin.org/post",data=data)
print(response.text)

这里就明显看出比urllib中的操作方便很多。

  • response属性
1
2
3
4
5
6
7
import requests
response=requests.get('http://www.baidu.com')
print(type(response.status_code),response.status_code)
print(type(response.headers),response.headers)
print(type(response.cookies),response.cookies)
print(type(response.url),response.url)
print(type(response.history),response.history)

运行结果为:

1
2
3
4
5
<class 'int'> 200
<class 'requests.structures.CaseInsensitiveDict'> {'Server': 'bfe/1.0.8.18', 'Date': 'Tue, 03 Apr 2018 07:59:03 GMT', 'Content-Type': 'text/html', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:36 GMT', 'Transfer-Encoding': 'chunked', 'Connection': 'Keep-Alive', 'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Pragma': 'no-cache', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Content-Encoding': 'gzip'}
<class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
<class 'str'> http://www.baidu.com/
<class 'list'> []
  • 状态码判断
1
2
3
import requests
response=requests.get('http://www.baidu.com')
exit() if not response.status_code==requests.codes.ok else print('request successfully')

这个状态码的判断的意思是,在requests.codes里面他将很多的状态码对应了一些方便记忆的单词,比如,将200对应了ok这个词,404对应了not_found这个词,这样我们只要查表不需要记住这些状态码就行了,第3行的代码的意思是:如果response的状态码不等于ok就退出,如果等于,就打印request successfully