Python爬虫从入门到进阶(3)之requests的使用
快速上手(官网地址:http://www.python-requests.org/en/master/user/quickstart/)
发送请求
首先导入Requests模块
import requests
试着获取一个网页
r = requests.get('https://api.github.com/events')
返回的 r 是 Response 对象,可以从这个对象中获得所有信息。
Requests 简单的 API 意味着所有 HTTP 请求类型都是显而易见的。例如,可以这样发送一个 HTTP POST 请求:
r = requests.post('https://httpbin.org/post', data={'key': 'value'})
传递 URL 参数
关于 URL 的查询字符串(query string)传递某种数据,如果手动构建 URL,数据以key/value的形式出现在 URL的?后面,例如:httpbin.org/get?key=value
Requests允许参数使用这个params 关键字参数,以字符串字典的形式提供参数。如果你想传递 key1=value1 和 key2=value2 到 httpbin.org/get ,那么你可以使用如下代码:
def url_params():
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)
print(r.url)
# http://httpbin.org/get?key1=value1&key2=value2
也可以将列表传入
# 2.传递 URL 参数,可以将一个列表作为值传入
def url_params_2():
payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get("http://httpbin.org/get", params=payload)
print(r.url)
# http://httpbin.org/get?key1=value1&key2=value2&key2=value3
响应内容
Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。
# 3.响应内容
def response_text():
r = requests.get('https://httpbin.org/get')
print(r.text)
二进制响应内容
Requests 会自动为你解码 gzip 和 deflate 传输编码的响应数据。
# 4.二进制响应内容
def response_content():
r = requests.get('https://httpbin.org/get')
print(r.content)
json 响应内容
# 5.json响应内容
def response_json():
r = requests.get('https://httpbin.org/get')
print(r.json())
如果 JSON 解码失败, r.json() 就会抛出一个异常。例如,响应内容是 204 (No Content),或者响应包含无效的 json,尝试访问 r.json() 将会抛出 ValueError: No JSON object could be decoded 异常。
值得注意的是调用r.json()成功并不意味着请求响应成功。有些服务器响应失败会返回 JSON 对象的失败信息。可以通过判断r.raise_for_status() 或者 r.status_code 验证请求是不是成功
定制请求头
如果你想为请求添加 HTTP 头部,只要简单地传递一个 dict 给 headers 参数就可以了。
# 6.定制请求头
def add_header():
url = 'https://httpbin.org/get'
headers = {
'User-Agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET '
} r = requests.get(url=url,headers=headers)
print(r.text)
更加复杂的 post 请求
通常,要想发送表单形式的数据,只需简单地传递一个字典给 data 参数,在发出请求时会自动编码为表单形式:
# 7.复杂的 post 请求
def complicated_post():
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("https://httpbin.org/post", data=payload)
print(r.text)
data 参数每个键可以有多个值,可以将元组列表或列表作为值的字典来实现,通常用于将表单中多个元素使用相同的键时使用
def complicated_post_2():
payload_tuples = [('key1', 'value1'), ('key1', 'value2')]
r1 = requests.post('https://httpbin.org/post', data=payload_tuples)
print(r1.text)
payload_dict = {'key1': ['value1', 'value2']}
r2 = requests.post('https://httpbin.org/post', data=payload_dict)
print(r1.text == r2.text) # False,官网是 True ???
用时候不需要用表单编码传递数据,可以使用字符串传递数据,例如
def complicated_post_3():
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload))
print(r.text)
也可以直接传递 json 参数,例如:
def complicated_post_4():
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, json=payload)
print(r.text)
注意:如果已经传递了 data 或者 files 参数,json 参数会被忽略掉
在请求中使用 json 参数会改变header 头Content-Type的值为application/json
POST一个多部分编码(Multipart-Encoded)的文件
Requests使上传Multipart-Encoded文件变得很简单
# 8.post 上传 multipart-Encoded 文件
def post_mulutipart_file():
url = 'https://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files, timeout=10)
print(r.text)
可以直接设置文件名称,content_type,和 header
def post_mulutipart_file_2():
url = 'https://httpbin.org/post'
files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': ''})}
r = requests.post(url, files=files, timeout=10)
print(r.text)
如果想传递字符串让服务器以文件的方式接收,可以如下设置:
def post_mulutipart_file_3():
url = 'https://httpbin.org/post'
files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
r = requests.post(url, files=files, timeout=10)
print(r.text)
注意:requests 不支持传递超大文件
响应状态码
# 9.响应状态码
def response_status_code():
r = requests.get('https://httpbin.org/get', timeout=10)
print(r.status_code)
print(r.status_code == requests.codes.ok) # print(raise_for_status) # 请求错误状态码
def error_response_status_code():
bad_r = requests.get('https://httpbin.org/status/404')
print(bad_r.status_code)
print(bad_r.raise_for_status())
响应头
# 10.响应头
def response_header():
r = requests.get('https://httpbin.org/get', timeout=10)
print(r.headers)
print(r.headers['Content-Type'])
print(r.headers.get('content-type'))
Cookies
# 11.cookie
def cookies():
# 读取响应内容的 cookie
# url = 'http://example.com/some/cookie/setting/url'
# r = requests.get(url)
# print(r.cookies['example_cookie_name']) # 发送 cookie 到服务器
url = 'https://httpbin.org/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies, timeout=10)
print(r.text)
Cookie 在RequestsCookieJar中返回,起作用相当于一个字典,但是也提供更完整的接口,适合在多个域或路径上使用,Cookie jars也能在请求时传递
def cookiejar():
jar = requests.cookies.RequestsCookieJar()
jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
url = 'https://httpbin.org/cookies'
r = requests.get(url, cookies=jar)
print(r.text)
重定向和历史
默认情况下,请求将对除HEAD之外的所有谓词执行位置重定向。
可以使用响应对象的history属性来跟踪重定向。
Response.history列表包含为完成请求而创建的 Response 对象,该列表从最早的响应到最近的响应
# 12.重定向和历史记录
def redirection_history():
r = requests.get('http://github.com/')
print(r.url)
print(r.status_code)
print(r.history)
如果使用 GET, OPTIONS, POST, PUT, PATCH 或者 DELETE,可以使用allow_reredirect参数禁用重定向处理
使用 HEAD 启用重定向
def redirection_history_2():
# 禁用重定向
r = requests.get('http://github.com/', allow_redirects=False)
print(r.status_code)
print(r.history) # 使用 HEAD 启用重定向
r = requests.head('http://github.com/', allow_redirects=True)
print(r.status_code)
print(r.history)
超时
可以使用 timeout 参数告诉请求等待几秒停止响应,几乎所有的生产代码的所有请求中都使用这个参数,不然可能导致程序无限期挂起
注意:超时不是整个响应下载的时间限制;相反,如果服务器没有在超时时间限制内发出响应,则会引发异常。如果没设置超时则请求不会超时
错误和异常
如果出现网络问题(例如DNS失败、拒绝连接等),请求将引发ConnectionError异常。
如果HTTP请求返回不成功的状态代码,则Response.raise_for_status()将引发HTTPError。
如果请求超时,将引发超时异常。
Python爬虫从入门到进阶(3)之requests的使用的更多相关文章
- Python 爬虫从入门到进阶之路(八)
在之前的文章中我们介绍了一下 requests 模块,今天我们再来看一下 Python 爬虫中的正则表达的使用和 re 模块. 实际上爬虫一共就四个主要步骤: 明确目标 (要知道你准备在哪个范围或者网 ...
- Python 爬虫从入门到进阶之路(二)
上一篇文章我们对爬虫有了一个初步认识,本篇文章我们开始学习 Python 爬虫实例. 在 Python 中有很多库可以用来抓取网页,其中内置了 urllib 模块,该模块就能实现我们基本的网页爬取. ...
- Python爬虫从入门到进阶(1)之Python概述及爬虫入门
一.Python 概述 1.计算机语言概述 (1).语言:交流的工具,沟通的媒介 (2).计算机语言:人跟计算机交流的工具 (3).Python是计算机语言的一种 2.Python编程语言 代码:人类 ...
- Python 爬虫从入门到进阶之路(六)
在之前的文章中我们介绍了一下 opener 应用中的 ProxyHandler 处理器(代理设置),本篇文章我们再来看一下 opener 中的 Cookie 的使用. Cookie 是指某些网站服务器 ...
- Python 爬虫从入门到进阶之路(九)
之前的文章我们介绍了一下 Python 中的正则表达式和与爬虫正则相关的 re 模块,本章我们就利用正则表达式和 re 模块来做一个案例,爬取<糗事百科>的糗事并存储到本地. 我们要爬取的 ...
- Python 爬虫从入门到进阶之路(十二)
之前的文章我们介绍了 re 模块和 lxml 模块来做爬虫,本章我们再来看一个 bs4 模块来做爬虫. 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也 ...
- Python 爬虫从入门到进阶之路(十五)
之前的文章我们介绍了一下 Python 的 json 模块,本章我们就介绍一下之前根据 Xpath 模块做的爬取<糗事百科>的糗事进行丰富和完善. 在 Xpath 模块的爬取糗百的案例中我 ...
- Python 爬虫从入门到进阶之路(十六)
之前的文章我们介绍了几种可以爬取网站信息的模块,并根据这些模块爬取了<糗事百科>的糗百内容,本章我们来看一下用于专门爬取网站信息的框架 Scrapy. Scrapy是用纯Python实现一 ...
- Python 爬虫从入门到进阶之路(十七)
在之前的文章中我们介绍了 scrapy 框架并给予 scrapy 框架写了一个爬虫来爬取<糗事百科>的糗事,本章我们继续说一下 scrapy 框架并对之前的糗百爬虫做一下优化和丰富. 在上 ...
随机推荐
- random使用方法
random.random() 没有参数,选择0到1之间的随机浮点数 random.uniform(a, b) 生成指定范围内的随机浮点数如果a.b哪个大那个小都没关系,生成的都是在小的与大的之间的随 ...
- 如何在Linux中轻松删除源安装的软件包?
第1步:安装Stow 在这个例子中,我们使用的是CentOS,因此我们需要扩展的EPEL库.您可以使用以下命令安装它们:yum install epel-release然后,下面这段命令:yum in ...
- MAVEN打包同时引入本地jar包
方法一(pom文件指定jar包目录进行引入) 1.将需要手动引入的包放在项目目录下,如lib目录下: 修改pom文件,引入依赖并且将scope设置为system 2.同时配置maven打包插件 方法二 ...
- PHP Yii2 composer环境安装
PHP Yii2 composer环境安装 composer 安装 任意目录执行: php -r "copy('https://install.phpcomposer.com/install ...
- 关于Vue修改默认的build文件存放的dist路径
原文地址:http://www.cnblogs.com/JimmyBright/p/7681086.html Vue默认build路径是项目的dist目录下,有时候我们可能希望build之后的文件自动 ...
- awk 计算某一列的和
awk 计算某一列的和 我需要通过nova list 显示所有虚拟机的cpu总和,即用awk计算某一列的综合 [root@control01 ~]# nla | awk -F '|' 'BEGIN{s ...
- 洛谷 P2590 [ZJOI2008]树的统计
大家好,我非常喜欢暴力数据结构,于是我用块状树过了这道题目 题目: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE ...
- python sorted函数多条件排序是怎么回事
首先,要知道sorted 内部实现使用了归并排序,而归并排序是稳定的排序,就是说当元素比不出大小时,其相对位置是不变的. 那么,利用稳定排序的特性,key函数有几个返回值就排序几次,先排序次要条件,后 ...
- 20165223《网络对抗技术》Exp2 后门原理与实践
目录 -- 后门原理与实践 后门原理与实践说明 实验任务 基础知识问答 常用后门工具 实验内容 任务一:使用netcat获取主机操作Shell,cron启动 任务二:使用socat获取主机操作Shel ...
- Java反射-修改字段值, 反射修改static final修饰的字段
反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...