Python爬虫(二):Requests库
所谓爬虫就是模拟客户端发送网络请求,获取网络响应,并按照一定的规则解析获取的数据并保存的程序。要说 Python 的爬虫必然绕不过 Requests 库。
1 简介
对于 Requests 库,官方文档是这么说的:
Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。
这个介绍还是比较生动形象的,便不再多说。安装使用终端命令 pip install requests
。
2 快速上手
2.1 发送请求
导入 Requests 模块:
import requests
获取网页:
r = requests.get('http://xxx.xxx')
此时,我们获取了 Response 对象 r,我们可以通过 r 获取所需信息。Requests 简便的 API 意味着所有 HTTP 请求类型都是显而易见的,我们来看一下使用常见 HTTP 请求类型 get、post、put、delete
的示例:
r = requests.head('http://xxx.xxx/get')
r = requests.post('http://xxx.xxx/post', data = {'key':'value'})
r = requests.put('http://xxx.xxx/put', data = {'key':'value'})
r = requests.delete('http://xxx.xxx/delete')
通常我们会设置请求的超时时间,Requests 使用 timeout
参数来设置,单位是秒,示例如下:
r = requests.head('http://xxx.xxx/get', timeout=1)
2.2 参数传递
在使用 get 方式发送请求时,我们会将键值对形式参数放在 URL 中问号的后面,如:http://xxx.xxx/get?key=val
,Requests 通过 params
关键字,以一个字符串字典来提供这些参数。比如要传 key1=val1
和 key2=val2
到 http://xxx.xxx/get
,示例如下:
pms= {'key1': 'val1', 'key2': 'val2'}
r = requests.get("http://xxx.xxx/get", params=pms)
Requests 还允许将一个列表作为值传入:
pms= {'key1': 'val1', 'key2': ['val2', 'val3']}
注
:字典里值为 None 的键都不会被添加到 URL 的查询字符串里。
2.3 响应内容
我们来获取一下服务器的响应内容,这里地址 https://api.github.com
为例:
import requests
r = requests.get('https://api.github.com')
print(r.text)
# 输出结果
# {"current_user_url":"https://api.github.com/user","current_user...
当访问 r.text 之时,Requests 会使用其推测的文本编码,我们可以使用 r.encoding
查看其编码,也可以修改编码,如:r.encoding = 'GBK'
,当改变了编码,再次访问 r.text
时,Request 都将会使用 r.encoding
的新值。
1)二进制响应内容
比如当我们要获取一张图片的数据,会以二进制的方式获取响应数据,示例如下:
from PIL import Image
from io import BytesIO
i = Image.open(BytesIO(r.content))
2)JSON响应内容
Requests 中已经内置了 JSON 解码器,因此我们可以很容易的对 JSON 数据进行解析,示例如下:
import requests
r = requests.get('https://api.github.com')
r.json()
注
:成功调用 r.json() 并不一定响应成功,有的服务器会在失败的响应中包含一个 JSON 对象(比如 HTTP 500 的错误细节),这时我们就需要查看响应的状态码了 r.status_code
或 r.raise_for_status()
,成功调用时 r.status_code
为 200,r.raise_for_status()
为 None。
2.4 自定义请求头
当我们要给请求添加 headers
时,只需给 headers
参数传递一个字典即可,示例如下:
url = 'http://xxx.xxx'
hds= {'user-agent': 'xxx'}
r = requests.get(url, headers=hds)
注
:自定义 headers 优先级是低于一些特定的信息的,如:在 .netrc
中设置了用户认证信息,使用 headers
设置的授权就不会生效,而当设置了 auth
参数,.netrc
的设置会无效。所有的 headers
值必须是 string
、bytestring
或者 unicode
,通常不建议使用 unicode
。
2.5 重定向与历史
默认情况下,Requests 会自动处理除了 HEAD
以外的所有重定向,可以使用响应对象的 history
属性来追踪重定向,其返回为响应对象列表,这个列表是按照请求由晚到早进行排序的,看一下示例:
import requests
r = requests.get('http://github.com')
print(r.history)
# 输出结果
# [<Response [301]>]
如果使用的是 get、post、put、delete、options、patch
可以使用 allow_redirects
参数禁用重定向。示例如下:
r = requests.get('http://xxx.xxx', allow_redirects=False)
2.6 错误与异常
当遇到网络问题(如:DNS 查询失败、拒绝连接等)时,Requests 会抛出 ConnectionError 异常;在 HTTP 请求返回了不成功的状态码时, Response.raise_for_status() 会抛出 HTTPError 异常;请求超时,会抛出 Timeout 异常;请求超过了设定的最大重定向次数,会抛出 TooManyRedirects 异常。所有 Requests 显式抛出的异常都继承自 requests.exceptions.RequestException。
参考:
http://cn.python-requests.org/zh_CN/latest/user/quickstart.html
Python爬虫(二):Requests库的更多相关文章
- python爬虫之requests库介绍(二)
一.requests基于cookie操作 引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们 ...
- Python爬虫之requests库介绍(一)
一:Requests: 让 HTTP 服务人类 虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 ...
- python爬虫之requests库
在python爬虫中,要想获取url的原网页,就要用到众所周知的强大好用的requests库,在2018年python文档年度总结中,requests库使用率排行第一,接下来就开始简单的使用reque ...
- Python爬虫:requests 库详解,cookie操作与实战
原文 第三方库 requests是基于urllib编写的.比urllib库强大,非常适合爬虫的编写. 安装: pip install requests 简单的爬百度首页的例子: response.te ...
- Python爬虫之requests库的使用
requests库 虽然Python的标准库中 urllib模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests宣传是 "HTTP for ...
- 【Python爬虫】Requests库的基本使用
Requests库的基本使用 阅读目录 基本的GET请求 带参数的GET请求 解析Json 获取二进制数据 添加headers 基本的POST请求 response属性 文件上传 获取cookie 会 ...
- python爬虫(1)requests库
在pycharm中安装requests库的一种方法 首先找到设置 搜索然后安装,蓝色代表已经安装 requests库中的get请求 与HTTP协议相对应,requests库也有七种请求方式. 获取ur ...
- Python 爬虫二 requests模块
requests模块 Requests模块 get方法请求 整体演示一下: import requests response = requests.get("https://www.baid ...
- Python爬虫之Requests库的基本使用
import requests response = requests.get('http://www.baidu.com/') print(type(response)) print(respons ...
- Python爬虫系列-Requests库详解
Requests基于urllib,比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求. 实例引入 import requests response = requests.get( ...
随机推荐
- 海量数据搜索---demo展示百度、谷歌搜索引擎的实现
在我们平常的生活工作中,百度.谷歌这些搜索网站已经成为了我们受教解惑的学校,俗话说得好,“有问题找度娘”.那么百度是如何在海量数据中找到自己需要的数据呢?为什么它搜索的速度如此之快?我们都知道是因为百 ...
- NLP(一)语料库和WordNet
访问语料库 NLTK数据库的安装:http://www.nltk.org/data.html NLTK语料库列表:http://www.nltk.org/nltk_data/ 内部访问(以Reuter ...
- 2019 HZNU Winter Training Day 13 Comprehensive Training
A.Jongmah CodeForces-1110D 题意:你在玩一个数字游戏,有一堆写在瓦片上的数字,希望你能组成最多的三元组(三个数字相同,或顺子). 这题用到的方法是动态规划.f[i][j] ...
- CH 4302 Interval GCD 题解
题意 给定一个长度为N的数列A,以及M条指令 (N≤5* 10^5, M<=10^5),每条指令可能是以下两种之一: "C l r d",表示把 A[l],A[l+1],-, ...
- Increasing heap size while building the android source code on Ubuntu 15.10
http://stackoverflow.com/questions/34940793/increasing-heap-size-while-building-the-android-source-c ...
- win、mac 设置 php上传文件大小限制
修改php.ini win平台WAMP修改 步骤 左键点击wamp 选择php 在弹出的窗口中选择php.ini 在打开的文件中进行修改(修改步骤如下) 修改完毕,保存并重启wamp mac MAM ...
- shell中日期循环的方式
第一种 # 这里的例子以周为循环 !/bin/bash begin_date="20160907" end_date="20170226" while [ &q ...
- 实现 Java 本地缓存,该从这几点开始
缓存,我相信大家对它一定不陌生,在项目中,缓存肯定是必不可少的.市面上有非常多的缓存工具,比如 Redis.Guava Cache 或者 EHcache.对于这些工具,我想大家肯定都非常熟悉,所以今天 ...
- window下tomcat的下载安装和环境配置
一.下载安装tomcat 去官网:http://tomcat.apache.org/ 下载自己所需要的版本,解压在没有中文的文件夹路径下. 直接打开压缩包下面,进入bin目录,双击startup.b ...
- JAVA代码解析String字符串(json格式的)
java解析String字符串(json格式) 需要jar包:json-lib-2.4-jdk15.jar 一. String str = "{\"name\":\&qu ...