上手快、功能全的Python爬虫库:Requests最佳上手指南
off999 2024-10-08 06:20 21 浏览 0 评论
一、发送请求
使用Requests发送网络请求非常简单:
# 导入requests模块,若未安装需要先安装(如: pip install requests) import requests # # GET请求 r = requests.get('https://api.github.com/events') # # POST请求 r = requests.post('http://httpbin.org/post', data={'key': 'value'}) # # DELETE请求 r = requests.delete('http://httpbin.org/delete') # # HEAD请求 r = requests.head('http://httpbin.org/get') # # OPTION请求 r = requests.options('http://httpbin.org/get')
二、传递URL参数
Requests允许使用params关键字参数,以一个字符串字典来为URL提供参数:
# 将参数以字典形式传递给params payload = {'key1': 'value1', 'key2': 'value2'} r = requests.get('http://httpbin.org/get', params=payload) print(r.url) # # 还可以将一个列表作为值传入 payload = {'key1': 'value1', 'key2': ['value2', 'value3']} r = requests.get('http://httpbin.org/get', params=payload) print(r.url)
三、响应内容
我们能读取服务器响应的内容:
import requests r = requests.get('https://api.github.com/events') # # 使用r.text时,requests会自动检测文本编码并将内容打印出来 print(r.text) # # 我们可以通过修改r.encoding来修改编码方式 print(r.encoding) # 'utf-8'非常常见 r.encoding = 'ISO-8859-1' # # 有些HTML、XML页面指定了不同的编码,我们可以通过r.content来找到编码,然后设置r.encoding为响应的编码,这样既可正确解析r.text。
四、二进制响应内容
对于非文本请求,我们也能以字节的方式访问请求响应体:
print(r.content) # # Requests会自动解码gzip、deflate传输编码的响应数据 # 例如,以请求返回的二进制数据创建一张图片: from PIL import Image from io import BytesIO i = Image.open(BytesIO(r.content))
五、JSON响应内容
Requests中有一个内置的JSON解码器,可以帮助我们处理JSON数据
import requests r = requests.get('https://api.github.com/events') # # 使用r.json()来解析json格式的数据,若解析失败,会抛出一个异常。 print(r.json()) # # r.json()调用成功并不意味着响应成功,检查请求是否成功可以使用如下两个方式: print(r.raise_for_status()) print(r.status_code)
六、原始响应内容
在罕见的情况下,我们可能想获取来自服务器的原始套接字响应:
r = requests.get('https://api.github.com/events', stream=True) print(r.raw) print(r.raw.read(10)) # # 但一般情况下,我们应该先将文本流保存到文件 with open(filename, 'wb') as writer: for chunk in r.iter_content(chunk_size): writer.write(chunk)
七、定制请求头
如果想为请求添加HTTP头部,只要简单地传递一个dict给headers参数即可:
url = 'https://api.github.com/some/endpoint' headers = {'user-agent': 'my-app/0.0.1'} r = requests.get(url, headers=headers) # # 定制header的优先级低于某些特定的信息源,如: # 1. 如果在.netrc中设置了用户认证信息,使用headers=设置的授权就不会生效,而如果设置了auth=参数,.netrc的设置就无效了。 # 2. 如果被重定向到别的主机,授权header就回被删除 # 3. 代理授权header会被URL中提供的代理身份覆盖掉 # 4. 在我们能判断内容长度的情况下,header的Content-Length会被改写。
八、更复杂的POST请求
通常,你想要发送一些编码为表单形式的数据--非常像一个HTML表单,要实现这个,只需要简单传递一个字典给data参数,它会自动编码:
payload = {'key1': 'value1', 'key2': 'value2'} r = requests.post('http://httpbin.org/post', data=payload) print(r.text) # # data参数还接受元组的形式 payload = (('key1', 'value1'), ('key2', 'value2')) r = requests.post('http://httpbin.org/post', data=payload) print(r.text) # # 很多时候我们想要发送的数据并非编码为表单形式的,比如我们就是要传递string而不是按照dict解析,那么数据将会被直接发布出去 import json url = 'https://api.github.com/some/endpoint' payload = {'some': 'data'} r = requests.post(url, data=json.dumps(payload)) # # 除了自行对dict编码,还可以使用json参数直接传递: r = requests.post(url, json=payload)
九、POST一个多部分编码(Multipart-Encoded)的文件
# 如:上传xls文件 url = 'http://httpbin.org/post' files = {'file': open('report.xls', 'rb')} r = requests.post(url, files=files) print(r.text) # # 我们可以显式地设置文件名、文件类型和请求头: url = 'http://httpbin.org/post' files = {'file': ('report.xls', open('report.xls', 'rb'), \ 'application/vnd.ms-excel', {'Expires': '0'})} r = requests.post(url, files=files) print(r.text) # # 我们也可以发送作为文件来接收的字符串 url = 'http://httpbin.org/post' files = {'file': ('report.csv', 'some,data,to,send\nanather,row,to,send\n')} r = requests.post(url, files=files) print(r.text)
十、响应状态码
r = requests.get('http://httpbin.org/get') print(r.status_code) # # 为方便引用,Requests还附带了一个内置的状态码查询对象 print(r.status_code == requests.codes.ok) # # 如果发送了一个错误请求(比如一个4XX客户端错误,或者5XX服务器错误响应),我们可以通过Response.raise_for_status()来抛出异常: bad_r = requests.get('http://httpbin.org/status/404') print(bad_r.status_code) bad_r.raise_for_status()
十一、响应头
# 我们可以查看以字典形式展示的服务器响应头 print(r.headers) # # eg.1 一个响应头 { 'content-encoding': 'gzip', 'transfer-encoding': 'chunked', 'connection': 'close', 'server': 'nginx/1.0.4', 'x-runtime': '148ms', 'etag': '"e1ca502697e5c9317743dc078f67693f"', 'content-type': 'application/json' } # # HTTP头部是大小写不敏感的,因此如下都是可以的: print(r.headers['Content-Type']) print(r.headers.get('content-type')
十二、Cookie
# 通过.cookies可以访问响应所包含的cookie url = 'http://example.com/some/cookie/setting/url' r = requests.get(url) print(r.cookies['example_cookie_name']) # # 要发送cookies到服务器,可以使用cookies参数: url = 'http://httpbin.org/cookies' cookies = dict(cookies_are='working') r = requests.get(url, cookies=cookies) print(r.text) # # Cookie的返回对象是RequestsCookieJar,它的行为和字典类似,但接口更完整,适合跨域名和跨路径使用,我们还可以把Cookie Jar传到Requests中: jar = requests.cookies.RequestsokieJar() jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies') jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere') url = 'http://httpbin.org/cookies' r = requests.get(url, cookies=jar) print(r.text)
十三、重定向与请求历史
默认情况下,除了HEAD,Requests会自动处理所有重定向。
可以使用响应对象的history方法来追踪重定向,Response.history是一个Response对象的列表,这个对象列表按照从最老到最近的请求进行排序。
r = requests.get('http://github.com') print(r.url) print(r.status_code) print(r.history) # # 如果使用的是GET、OPTIONS、POST、PUT、PATCH或者DELETE,那么我们可以通过allow_redirects参数禁用重定向处理: 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.url) print(r.history)
十四、超时
timeout参数用于设置等待响应的最长时间,即requests会在等待该时间之后停止等待响应。若不设置该参数,程序可能会永远失去响应:
requests.get('http://github.com', timeout=0.001)
十五、错误与异常
- 遇到网络问题时,Requests会抛出一个ConnectionError异常
- 如果HTTP请求返回了不成功的状态码,Response.raise_for_status()会抛出一个HTTPError异常
- 若请求超时,则抛出Timeout异常
- 若请求超过了设定的最大重定向次数,则抛出TooManyRedirects异常
- 所有Requests显式抛出的异常都继承自requests.exceptions.RequestException
相关推荐
- 大文件传不动?WinRAR/7-Zip 入门到高手,这 5 个技巧让你效率翻倍
-
“这200张照片怎么传给女儿?微信发不了,邮箱附件又超限……”62岁的张阿姨对着电脑犯愁时,儿子只用了3分钟就把照片压缩成一个文件,还教她:“以后用压缩软件,比打包行李还方便!”职场人更懂这...
- 电脑解压缩软件推荐——7-Zip:免费、高效、简洁的文件管理神器
-
在日常工作中,我们经常需要处理压缩文件。无论是下载软件包、接收文件,还是存储大量数据,压缩和解压缩文件都成为了我们日常操作的一部分。而说到压缩解压软件,7-Zip绝对是一个不可忽视的名字。今天,我就来...
- 设置了加密密码zip文件要如何打开?这几个方法可以试试~
-
Zip是一种常见的压缩格式文件,文件还可以设置密码保护。那设置了密码的Zip文件要如何打开呢?不清楚的小伙伴一起来看看吧。当我们知道密码想要打开带密码的Zip文件,我们需要用到适用于Zip格式的解压缩...
- 大文件想要传输成功,怎么把ZIP文件分卷压缩
-
不知道各位小伙伴有没有这样的烦恼,发送很大很大的压缩包会受到限制,为此,想要在压缩过程中将文件拆分为几个压缩包并且同时为所有压缩包设置加密应该如何设置?方法一:使用7-Zip免费且强大的文件管理工具7...
- 高效处理 RAR 分卷压缩包:合并解压操作全攻略
-
在文件传输和存储过程中,当遇到大文件时,我们常常会使用分卷压缩的方式将其拆分成多个较小的压缩包,方便存储和传输。RAR作为一种常见的压缩格式,分卷压缩包的使用频率也很高。但很多人在拿到RAR分卷...
- 2个方法教你如何删除ZIP压缩包密码
-
zip压缩包设置了加密密码,每次解压文件都需要输入密码才能够顺利解压出文件,当压缩包文件不再需要加密的时候,大家肯定想删除压缩包密码,或是忘记了压缩包密码,想要通过删除操作将压缩包密码删除,就能够顺利...
- 速转!漏洞预警丨压缩软件Winrar目录穿越漏洞
-
WinRAR是一款功能强大的压缩包管理器,它是档案工具RAR在Windows环境下的图形界面。该软件可用于备份数据,缩减电子邮件附件的大小,解压缩从Internet上下载的RAR、ZIP及其它类...
- 文件解压方法和工具分享_文件解压工具下载
-
压缩文件减少文件大小,降低文件失效的概率,总得来说好处很多。所以很多文件我们下载下来都是压缩软件,很多小伙伴不知道怎么解压,或者不知道什么工具更好,所以今天做了文件解压方法和工具的分享给大家。一、解压...
- [python]《Python编程快速上手:让繁琐工作自动化》学习笔记3
-
1.组织文件笔记(第9章)(代码下载)1.1文件与文件路径通过importshutil调用shutil模块操作目录,shutil模块能够在Python程序中实现文件复制、移动、改名和删除;同时...
- Python内置tarfile模块:读写 tar 归档文件详解
-
一、学习目标1.1学习目标掌握Python内置模块tarfile的核心功能,包括:理解tar归档文件的原理与常见压缩格式(gzip/bz2/lzma)掌握tar文件的读写操作(创建、解压、查看、过滤...
- 使用python展开tar包_python拓展
-
类Unix的系统,打包文件经常使用的就是tar包,结合zip工具,可以方便的打包并解压。在python的标准库里面有tarfile库,可以方便实现生成了展开tar包。使用这个库最大的好处,可能就在于不...
- 银狐钓鱼再升级:白文件脚本化实现GO语言后门持久驻留
-
近期,火绒威胁情报中心监测到一批相对更为活跃的“银狐”系列变种木马。火绒安全工程师第一时间获取样本并进行分析。分析发现,该样本通过阿里云存储桶下发恶意文件,采用AppDomainManager进行白利...
- ZIP文件怎么打开?2个简单方法教你轻松搞定!
-
在日常工作和生活中,我们经常会遇到各种压缩文件,其中最常见的格式之一就是ZIP。ZIP文件通过压缩数据来减少文件大小,方便我们进行存储和传输。然而,对于初学者来说,如何打开ZIP文件可能会成为一个小小...
- Ubuntu—解压多个zip压缩文件.zip .z01 .z02
-
方法将所有zip文件放在同一目录中:zip_file.z01,zip_file.z02,zip_file.z03,...,zip_file.zip。在Zip3.0版本及以上,使用下列命令:将所有zi...
- 如何使用7-Zip对文件进行加密压缩
-
7-Zip是一款开源的文件归档工具,支持多种压缩格式,并提供了对压缩文件进行加密的功能。使用7-Zip可以轻松创建和解压.7z、.zip等格式的压缩文件,并且可以通过设置密码来保护压缩包中的...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)