requests属于第三方库,也是python默认不会自带的库,需要手动安装
pip安装:pip3 install requests
实例引入:
requests中可以使用get请求页面
requests其他的请求类型仍然可以使用一句话来完成
r = requests. post(' http://httpbin.org/post ’)
r = requests.put (’ http //httpbi i. org/put ’)
r = requests .delete( ' http://httpbin.org/delete ' )
r = requests .head (’ http://httpbin .org/get ’)
r = requests.options(’ http://httpbin.org/get')
get请求中如果想要添加额外的信息,可以使用如下方式:r = requests .get('http://httpbin.org/get?name=germey&age=22')
但是这种方式不太好,一般情况下,这种信息数据会用字典来存储
import requests
data = {
’ name': 'germey ’,
'age ’: 22
}
r = requests.get ("ttp://httpbin.org/get ", params=data)
print(r.text)
通过运行可以得到,网页的返回类型是str类型,但是他比较特殊,是json格式,想要直接解析返回结果,得到一个字典格式的话,可以直接调用json()方法,如下:
import requests
r = requests.get(” http://httpbin.org/get”)
print(type(r.text))
print(r.json())
print ( type(r. j son()))
使用json之后,返回结果是json格式的字符串转为字典,如果不是json格式,便会出现解析错误
·抓取网页
上面的请求链接返回的是 JSON 形式的字符串, 那么如果请求普通的网页,则肯定能获得相应的
内容了 下面以“知乎”→“发现”页面为例来看一下
import requests
import re
headers = {
'User-Agent :’问 zilla/5 .0 (Macintosh; Intel Mac 05 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 compil exp ore-feed. que stio n_link. 〉(.的 )< la> ', re .5)
titles = re. indall(pattern r .text)
print(titles)
这里我们加入了 headers 信息,其中包含了 User- Agent 字段信息, 也就是浏览器标识信息 如果 不加这个 ,知乎会禁止抓取
如果想要爬取图片保存到本地,可以使用r.content,或得到的内容是bytes类型
import requests
r = requests get (” https://github.com/favicon.ic。”)
with open(’ favicon . ico' , 'wb ’) as f:
f.write(r.content)
这里用了 open()方法,它的第一个参数是文件名称,第二个参数代表以二进制写的形式打开,可 以向文件里写入二进制数据
requests中的post请求
import requests
data ={’ name ':’germey ’, ’age ':’ 22 ’}
r = requests.post("http://httpbin .org/post”, data=data)
print (r.text)
print(r.headers)
print(r.url)
print(r.history)
还可以通过响应获取状态码,响应头,Cookies,请求历史等,,除此之外,requests还提供了一个内置的状态吗查询对象requests.codes
import requests
r = requests.get(’ http://www.jianshu.com’)
exit() if not r. status code == requests. codes . ok else pri川(’ Reque st Success ully ’)
这里通过比较返回码和内置的成功的返回码,来保证请求得到了正常响应,输出成功请求的消息,
否则程序终止,这里我们用 requests.codes .ok 得到的是成功的状态码 200
文件上传
我们知道 req ests 可以 拟提交一些数据 假如有的网站需要上传文件,我们也可以用它来实现, 非常简单,示例如下
import requests
files = {'file ' : open (’favicon.ico ’,'rb ’)} //这里的favicon是文件名,需要和当前脚本在同一目录下
r = requests . post(” http ://httpbin .org/post”, files=files)
print(r.text)
获取cookie
import requests
response = requests.get("https://www.baidu.com")
print(response.cookies) #字典的形式
for key,value in response.cookies.items():
print(key + '=' + value)
会话维持
上边一个是使用一个浏览器设置cookie,使用另一个浏览器访问,两者没有关联,所以结果为空
可以通过声明session对象,然后发起请求
SSL证书验证
requests 还提供了证书验证的功能 当发送 HTTP 请求的时候,它会检查 SSL 证书,我们 可以使用 veri 参数控制是否检查此证书 其实如果不加 verify 参数的话,默认是 True ,会自动验证。如果想要请求成功,设置verify为False
import requests
response = requests.get(’ https: I /www .12306. en ’, verify=False)
print(response.status_code)
通过上边的方式,虽然可以得到请求码200,但是会得到一个警告,需要我们指定证书,我们可以通过设置忽略警告的方式来屏蔽这个警告。
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #消除警告信息
response = requests.get("https://www.12306.cn",verify=False)
print(response.status_code)
代理设置
超时设置
认证设置
异常处理
或者通过捕获警告到日志的方式忽略警告:
import logging
import requests
logging.captureWarnings(True)
response = requests.get("https://www.12306.cn",verify=False)
print(response.status_code)