前面几篇学习了,urllib的这个库,这个库用起来有点麻烦,发送请求,添加header等等,这篇来介绍下requests这个库,Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,Requests它会比urllib更加方便,可以节约我们大量的工作。
pip install requests
先看一个简单的小例子,来看看requests的威力
import requests
r = requests.get('http:www.baidu.com')
print(r.text)
这样就可以把百度的首页源码给抓 下来,对你没看错,就这几行代码。是不是比urllib方便多了。又方便又简单。
r是我们请求返回的一个response的一个对象
requests的库主要有以下7个方法
方法 | 解释 |
---|---|
requests.request() | 构造一个请求,支持以下各种方法 |
requests.get() | 获取html的主要方法 |
requests.head() | 获取html头部信息的主要方法 |
requests.post() | 向html网页提交post请求的方法 |
equests.put() | 向html网页提交put请求的方法 |
equests.patch() | 向html提交局部修改的请求 |
requests.delete() | 向html提交删除请求 |
这个方法是我们平时最常用的方法之一,通过这个方法我们可以了解到其他的方法,所以我们详细介绍这个方法。
具体参数是:
r=requests.get(url,params,**kwargs)
url:就是需要爬取的网站地址
params: 就是参数的意思,url中的参数,字典或者字节流格式。
**kwargs: 关键字参数,params中传的字典类型
看看 **kwargs:
params:字典或字节序列, 作为参数增加到url中,使用这个参数可以把一些键值对以?key1=value1&key2=value2的模式增加到url中
例子:
kw = {'key1':' values', 'key2': 'values'}
r = requests.get('http://www.baidu.com', params=kw)
其中response对象有以下属性:
属性 | 说明 |
---|---|
r.status_code | http请求的返回状态,若为200则表示请求成功。 |
r.text | http响应内容的字符串形式,即返回的页面内容 |
r.encoding | 从http header 中猜测的相应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | http响应内容的二进制形式 |
开篇说了一个简单的get请求,现在来看看带参数的get请求时怎样的。
import requests
url = 'http://httpbin.org/get'
data = {
'name': 'lisi',
'age': '18'
}
r = requests.get(url,params=data)
print(r.text)
可以看到返回的结果中,带有我们的参数。
{
"args": {
"age": "18",
"name": "lisi"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.20.0"
},
"origin": "61.140.125.81, 61.140.125.81",
"url": "https://httpbin.org/get?name=lisi&age=18"
}
在requests中 requests.json()
等同于 json.loads(requests.text)
import requests
import json
url = 'http://httpbin.org/get'
requests= requests.get(url)
print(type(requests.text))
print(requests.json())
print(json.loads(requests.text))
print(type(requests.json()))
在上面提到了response.content,这样获取的数据是二进制数据,同样的这个方法也可以用于下载图片以及视频资源
在讲urlib时有说过为什么要添加header,现在来看看,requests中如何添加header
以知乎为例:
import requests
url = 'https://www.zhihu.com'
r = requests.get(url)
print(r.text)
结果:可以看到400的提示,不添加header连接知乎的登陆界面也抓不下来
400 Bad Request
400 Bad Request
openresty
如果想访问就必须得加headers信息。
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'
}
url = 'https://www.zhihu.com'
r = requests.get(url,headers=headers)
print(r.text)
结果:
知乎 - 有问题,上知乎
可以看到很轻松就讲知乎的页面给抓下来了。
通过post把数据提交到url地址,等同于一字典的形式提交form表单里面的数据
import requests
url = 'http://httpbin.org/post'
data = {
'name': 'zhangsan',
'age': '20'
}
r = requests.post(url,data=data)
print(r.text)
结果:
{
"args": {},
"data": "",
"files": {},
"form": {
"age": "20",
"name": "zhangsan"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "20",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.20.0"
},
"json": null,
"origin": "61.140.125.81, 61.140.125.81",
"url": "https://httpbin.org/post"
}
import requests
response = requests.get("http://www.baidu.com")
# 打印请求页面的状态(状态码)
print(type(response.status_code), response.status_code)
# 打印请求网址的headers所有信息
print(type(response.headers), response.headers)
# 打印请求网址的cookies信息
print(type(response.cookies), response.cookies)
# 打印请求网址的地址
print(type(response.url), response.url)
# 打印请求的历史记录(以列表的形式显示)
print(type(response.history), response.history)
结果:
200
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Wed, 05 Jun 2019 16:05:13 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:57 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
]>
http://www.baidu.com/
[]
requests的基本操作就时以上这些,相比urllib要方便很多,下一篇就说一些,高级操作咯。