专栏首页日常学pythonpython爬虫常用库之requests详解

python爬虫常用库之requests详解

这是日常学python的第11篇原创文章

在使用了urllib库之后,感觉很麻烦,比如获取个cookie都需要分几步,代码又多,这和python的风格好像有点不太像哈,那有没有更加容易点的请求库呢?答案是有的,那就是第三方库requests,这个库的作者是大名鼎鼎的kennethreitz,创作这个库的原因就是想让python开发者更加容易地发起请求,处理请求。里面还有个名字:HTTP for Humans,顾名思义,就是用来请求http的。想看源代码的可以在github上搜索他的名字就可以看到了。

接下来介绍下怎样用这个库吧!

因为这是第三方库,所以我们需要下载,需要在命令行输入

pip install requests

如果你装的是anaconda的忽略这条

安装好了就来进行使用吧

1

进行简单的操作

发送一个get请求

# 发送请求
import requests
response = requests.get('http://httpbin.org/get')
# 获取返回的html信息
print(response.text)

这样就发送了一个get请求,并且还打印了返回的内容,这个不再需要知道网页是哪个编码的,不过有时会出现编码问题,但是你也可以指定编码类型,如:

response.encoding = 'utf-8'

指定完成后就可以正常编码了,前提你得知道网页的编码类型。

出了上面这些,我们还可以获取下面的信息

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请求的,其他的请求也是这样发送,就不一 一说了。

2

进行复杂点的请求

在登陆的时候我们有时候需要输入验证码,那怎样输呢?爬虫的看不了网页,最简单的做法就是把这个验证码的图片下载下来然后手动输入,那么我们怎样下载呢?我们可以向这个图片的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

本文分享自微信公众号 - 日常学python(daily_learn),作者:By

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python爬虫的起点

    第一章主要讲解爬虫相关的知识如:http、网页、爬虫法律等,让大家对爬虫有了一个比较完善的了解和一些题外的知识点。

    sergiojune
  • 写 Python 时的 5 个坏习惯

    很多文章都有介绍怎么写好 Python,我今天呢,相反,说说写代码时的几个坏习惯。有的习惯会让 Bug 变得隐蔽难以追踪,当然,也有的并没有错误,只是个人觉得不...

    sergiojune
  • 老司机带你用python来爬取妹子图

    这是日常学python的第14篇原创文章 我前几篇文章都是说一些python爬虫库的用法,还没有说怎样利用好这些知识玩一些好玩的东西。那我今天带大家玩好玩又刺激...

    sergiojune
  • 爬虫之爬虫简介与request请求库

    爬虫协议:规定了什么东西网站让爬,什么东西不让爬,查看方式:网址/robots.txt 如

    GH
  • 爬虫 0030~ requests利刃出鞘

    requests第三方封装的模块,通过简化请求和响应数据的处理,简化繁琐的开发步骤和处理逻辑、统一不同请求的编码风格以及高效的数据处理特性等而风靡于爬虫市场。

    大牧莫邪
  • 计算每个请求的平均响应时间

    目的 找出是哪些请求长期影响了系统性能 方法 web服务器的日志会记录每个请求的响应时间,分析访问日志,对相同请求的响应时间进行累加,响应时间的和 除以 这个请...

    dys
  • 家养爬虫的Python技术 | 资料总结

    之前有一个讨论: 文本分析怎么整? 文本分析,一个很重要的环节就是网络的数据爬取。爬虫是获取数据的一个重要手段,很多时候我们没有精力也没有资金去采集专业的数...

    数说君
  • 网站跨域的五种解决方式

    等带有src属性的标签可以从不同的域加载和执行资源。其他插件的同源策略:flash、java applet、silverlight、googlegears等浏览...

    yunlgonn
  • 写给初学者的Tensorflow介绍

    Tensorflow是广泛使用的实现机器学习以及其它涉及大量数学运算的算法库之一。Tensorflow由Google开发,是GitHub上最受欢迎的机器学习库之...

    云水木石
  • 【PMP】PMBOK第六版项目管理5大过程组10大知识领域知识点汇总

    7.在没有对变更进行全面评估之前,不能找CCB,更不能立即实施变更,但是,较小的变更需不要报告给CCB.

    心跳包

扫码关注云+社区

领取腾讯云代金券