By 平常学python html
在使用了urllib库以后,感受很麻烦,好比获取个cookie都须要分几步,代码又多,这和python的风格好像有点不太像哈,那有没有更加容易点的请求库呢?答案是有的,那就是第三方库requests,这个库的做者是大名鼎鼎的kennethreitz,创做这个库的缘由就是想让python开发者更加容易地发起请求,处理请求。里面还有个名字:HTTP for Humans,顾名思义,就是用来请求http的。想看源代码的能够在github上搜索他的名字就能够看到了。python
接下来介绍下怎样用这个库吧!git
( 这文章原创首发于公众号[平常学python] )github
由于这是第三方库,因此咱们须要下载,须要在命令行输入json
pip install requests
若是你装的是anaconda的忽略这条安全
安装好了就来进行使用吧markdown
发送一个get请求cookie
# 发送请求 import requests response = requests.get('http://httpbin.org/get') # 获取返回的html信息 print(response.text)
这样就发送了一个get请求,而且还打印了返回的内容,这个再也不须要知道网页是哪一个编码的,不过有时会出现编码问题,可是你也能够指定编码类型,如:session
response.encoding = 'utf-8'
指定完成后就能够正常编码了,前提你得知道网页的编码类型。python爬虫
出了上面这些,咱们还能够获取下面的信息
print(response.headers) # 请求状态码 print(response.status_code) # 获取网页的二进制内容 print(response.content) print(response.url) # 获取请求的url print(response.cookies) # 获取cookie
是否是以为很容易,一行代码就能够了。再也不须要几步代码什么的了。
接下来被发爬的话带上个请求头来进行请求
# 还能够添加请求头进行请求 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'} response = requests.get('http://httpbin.org/get', headers=headers ) print(response.headers) print(response.text)
加个请求头也就是加个关键字参数而已
还能够进行带参数的get请求
# 进行带参数的get请求 data = {'name': 'june', 'password': 123456} response = requests.get('http://httpbin.org/get', params=data) print(response.text)
那若是须要登录呢?post请求怎样发?告诉你,照样很简单
# 进行post请求 data = {'name': 'june', 'password': 123456} response = requests.post('http://httpbin.org/post', data=data, headers=headers) print(response.text)
是否是很简单,也是加个data关键字参数,把要提交的登录参数进行post上去。
那除了上面的两个请求,还能进行别的请求吗?我能够很是开心地告诉你,能够的。好比,你要发个put请求,如这样
requests.put() requests.delete()
这个就是发送put请求和delete请求的,其余的请求也是这样发送,就不一 一说了。
在登录的时候咱们有时候须要输入验证码,那怎样输呢?爬虫的看不了网页,最简单的作法就是把这个验证码的图片下载下来而后手动输入,那么咱们怎样下载呢?咱们能够向这个图片的url发送请求,而后把返回内容以二进制方法存入文件里面就能够了。
代码以下:
# 从网上读取二进制数据,好比图片 response = requests.get('https://www.baidu.com/img/bd_logo1.png', headers=headers) # 这个是直接获取字节码,这个是要保存的文件 print(response.content) # 这个是获取解码后的返回内容,这个是乱码 print(response.text) # 用文件来把图片下载下来 with open('baidu.png', 'wb') as f: # 注意写的方式是以二进制方式写入 f.write(response.content) print('下载完毕')
仍是很简单,不得不说,这个库太好用了。
当咱们须要上传文件的时候,好比图片,咱们还能够用post方法把他发送出去
# 上传文件 files = {'picture': open('baidu.png', 'rb')} response = requests.post('http://httpbin.org/post', files=files) print(response.text) 获取cookie并简单处理一下 # 获取cookie response = requests.get('https://www.baidu.com') for k, v in response.cookies.items(): print(k, '=', v)
当网页返回内容是json格式是,咱们不须要用json库来解析,咱们能够直接利用requests的方法进行解析,二者的效果是同样的
# 解析json j = response.json() # 能够用json库来解析,结果同样
在urllib库时保存登录信息须要把cookie保存下来,可是在requests库里面,咱们只须要用requests.session()来保存信息就能够了。
# 用会话来保持登录信息 session = requests.session() response = session.get('http://httpbin.org/cookies/set/number/123456') print(response.text)
这样就能够保存登录了,不须要为cookie操心了,可是每次获取一个session就能够了,而后用来请求或者其余操做。不须要每次请求或者操做都建立一个sesion出来,这样是保存不了登录信息的
当一个网站不安全,须要你用证书验证的,好比这个网站
https://www.12306.cn
这时要访问里面的网站内容,咱们就须要进行验证,代码以下
# 证书验证 response = requests.get('https://www.12306.cn', verify=False) # 不加这个关键字参数的话会出现验证错误问题,由于这个网站的协议不被信任
这样就能够进行访问了,可是会有一条警告
E:\anaconda\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning)
以为不美观的,咱们还能够在请求时加个cert关键字参数,值为可信任的证书,为一个元组,写上帐号和密码之类的,这里就不演示了
遇到须要认证的网站,咱们也能够这样
from requests.auth import HTTPBasicAuth # 设置认证 # requests.get('须要认证的网址', auth=HTTPBasicAuth('user', 'passwd')) # 因为找不到须要认证的网址,因此先写个主体 # 还能够这样认证 # requests.get('须要认证的网址', auth=('user', 'passwd')) # 这样就简单点
因为我找不到须要认证的网站,因此就不演示了。
requests还能够用代理ip来进行请求网站来防止ip被封以致于本身爬不了的尴尬。使用代理ip也比urllib库简单得多,代码以下:
### ### 设置代理 ### proxies = {'http': 'http://122.114.31.177:808', ### 'https': 'https://119.28.223.103:8088'} ### 在请求时添加上列代理 ### response = requests.get('http://httpbin.org/get', proxies=proxies) ### print(response.text) ### ``` 上面的字典格式须要一 一对应,而后在请求时加上个关键字参数proxies就能够了。 3 请求异常处理 在程序运行时,遇到错误时程序就会被强行中止,若是想要继续运行,就须要进行捕捉异常来让程序继续运行。 在requests库中有个处理异常的库requests.exceptions 这里简单地处理下请求超时的处理状况
import requests
from requests.exceptions import ReadTimeout, ConnectTimeout, HTTPError, ConnectionError, RequestException
try:
response = requests.get('http://httpbin.org/get', timeout=0.1) # 规定时间内未响应就抛出异常
print(response.text)
except ReadTimeout as e:
print('请求超时')
except ConnectionError as e:
print('链接失败')
except RequestException as e:
print('请求失败')
这里捕捉了三个异常,由于ReadTimeout是ConnectionError的子类,因此先捕捉ReadTimeout,再捕捉父类的。而ConnectionError 和 RequestException 同理 更多的异常处理能够查看文档哈。 ### 4 ### 最后 以上均是我在学习时的笔记和我的在运用时遇到的一些坑都简单地记载了上去,但愿对你有用哈,若是想看更多的用法能够去官方文档查看。还有代码我放在了github上,要的话能够上去查看。 GitHub:https://github.com/SergioJune/gongzhonghao_code/tree/master/python3_spider 官方文档:http://docs.python-requests.org/zh_CN/latest/index.html 学习参考资料:https://edu.hellobi.com/course/157