跳到主要内容
Python Requests 库网络爬虫基础与实战 | 极客日志
Python
Python Requests 库网络爬虫基础与实战 综述由AI生成 Python Requests 库是常用的 HTTP 客户端工具,支持 GET 和 POST 请求。涵盖请求参数设置、Response 对象属性(状态码、内容、编码)、复杂请求定制(Headers、代理、证书、超时、Cookies)以及文件下载与上传的实现方法。通过代码示例展示了如何使用 requests 进行网络数据交互及处理常见爬虫场景。
MongoKing 发布于 2026/3/16 更新于 2026/4/28 6 浏览请求方式
HTTP 的请求方式分为 GET 和 POST。
GET 请求
url 语法如下:
url_without_params = "https://www.baidu.com/"
url_with_params = "https://www.baidu.com/s?参数名=参数值"
注:如果一个 URL 有多个参数,参数之间用'&'连接。request 对于带参数的 url 请求有两种处理方式:
import requests
r = requests.get('https://www.baidu.com/s?参数名=参数值' )
url = 'https://www.baidu.com/s'
params = {'参数名' : '参数值' }
r = requests.get(url, params=params)
print (r.url)
对于动态变化的参数,我们可以采用%s来占位的方式来处理:
url_template = 'https://www.baidu.com/s?参数名=%s'
search_term = '参数值'
formatted_url = url_template % search_term
print (formatted_url)
这样输出的将会是:https://www.baidu.com/s?参数名=参数值。
POST 请求
POST 请求常用来提交表单,表单数据就是 POST 的请求参数。在 requests 中实现 POST 请求时,需要设置 data 参数,数据格式可以是字典、元组、列表或 JSON。不同格式各有优势。
data = {'key1' : 'value1' , 'key2' : 'value2' }
tuple_list = (('key1' , 'value1' ), ('key2' , 'value2' ))
import json
data_json = json.dumps(data)
requests
r = requests.post( , data=data_json)
(r.text)
import
"https://www.baidu.com/"
print
什么是 JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于 JavaScript 编程语言的一个子集,但是它是独立于语言的,许多不同的编程语言都支持生成和解析 JSON 数据,使其成为理想的数据交换语言。
键值对:数据以 名称/值 对的形式存储,其中名称(或称为键)是一个字符串,而值可以是字符串、数字、数组、布尔值或另一个 JSON 对象。
数组:数据以有序的列表形式存储,列表中的每个元素可以是字符串、数字、数组、布尔值或另一个 JSON 对象。
{
"name" : "John Doe" ,
"age" : 30 ,
"is_student" : false ,
"hobbies" : [ "reading" , "gaming" , "sports" ] ,
"address" : {
"street" : "123 Main St" ,
"city" : "Anytown" ,
"state" : "CA" ,
"zip" : "12345"
}
}
在这个例子中,name、age、is_student、hobbies和address是键,而它们对应的值分别是字符串、数字、布尔值、字符串数组和另一个 JSON 对象。
JSON 因其简洁和易于解析的特性,在 Web 开发中被广泛用于客户端和服务器之间的数据交换。例如,当一个 Web 应用从服务器请求数据时,服务器通常会以 JSON 格式返回数据,然后 Web 应用可以使用 JavaScript 轻松地解析这些数据并更新用户界面。
requests.Response 对象的属性和方法
1. 基本响应信息
r.status_code
作用:返回响应状态码(如 200、404、500 等)。
使用场景:判断请求是否成功。
r.reason
作用:返回响应状态码的文本描述(如 OK、Not Found 等)。
使用场景:提供更详细的响应状态描述。
r.url
作用:返回实际请求的 URL(可能经过重定向后的最终 URL)。
使用场景:确认请求的最终地址。
2. 响应内容
r.raw
作用:返回原始响应体,可以通过 r.raw.read() 读取。
使用场景:处理二进制数据或流式响应。
r.content
作用:以字节方式返回响应体,需要手动解码。
使用场景:处理二进制文件(如图片、视频)。
r.text
作用:以字符串方式返回响应体,会自动根据响应头的 Content-Type 或 Content-Encoding 解码。
使用场景:处理文本内容(如 HTML、JSON)。
r.json()
作用:将响应体解析为 JSON 对象。
使用场景:处理 JSON 格式的响应数据。
r.encoding
作用:返回响应的编码格式(如 utf-8)。
使用场景:确认或修改响应的编码。
r.apparent_encoding
作用:基于响应内容分析得出的编码格式(可能与 r.encoding 不同)。
使用场景:当 r.encoding 为空或不准确时,作为备选编码。
3. 响应头和 Cookie
r.headers
作用:以字典形式返回响应头,字典键不区分大小写。
使用场景:获取响应头中的信息(如 Content-Type、Content-Length 等)。
r.cookies
作用:返回请求后的 Cookie 对象。
使用场景:获取服务器返回的 Cookie 信息。
r.links
作用:返回响应头中的 Link 字段内容,以字典形式存储。
使用场景:处理分页或资源链接。
4. 重定向和跳转
r.history
作用:返回一个包含所有中间跳转响应的列表。
使用场景:跟踪请求的跳转路径。
r.is_redirect
作用:判断响应是否是重定向(如 301、302 状态码)。
使用场景:控制重定向逻辑。
r.is_permanent_redirect
作用:判断响应是否是永久重定向(301 状态码)。
使用场景:处理需要更新 URL 的重定向。
r.next
作用:返回下一个响应对象(如果存在重定向)。
使用场景:手动处理重定向时获取下一个响应。
5. 性能和资源管理
r.elapsed
作用:返回从发送请求到收到响应的总耗时(timedelta 对象)。
使用场景:用于性能测试或监控请求的响应时间。
r.close()
作用:关闭响应对象,释放资源。
使用场景:在使用 r.raw 或处理大文件时,手动关闭响应对象以释放资源。
6. 迭代和流式处理
r.iter_content(chunk_size=1, decode_unicode=False)
作用:以迭代的方式逐块读取响应内容,适合处理大文件。
参数:
chunk_size:每次读取的块大小(以字节为单位)。
decode_unicode:是否将内容解码为 Unicode。
使用场景:下载大文件时逐块写入磁盘,避免占用过多内存。
r.iter_lines(decode_unicode=False, chunk_size=512)
作用:以迭代的方式逐行读取响应内容,适合处理文本数据。
参数:
decode_unicode:是否将内容解码为 Unicode。
chunk_size:每次读取的块大小。
使用场景:处理日志文件或文本数据时逐行读取。
7. 请求信息
r.request
作用:返回发送的请求对象(requests.PreparedRequest)。
使用场景:调试或查看发送的请求细节(如请求头、请求体等)。
8. 异常处理
r.raise_for_status()
作用:如果响应状态码表示请求失败(非 200 响应),则抛出异常。
使用场景:在需要严格处理请求失败时,自动抛出异常。
提交复杂的请求 在进行网络爬虫开发或与 Web API 交互时,我们常常需要对 HTTP 请求进行定制化处理,以满足各种复杂场景的需求。本文将详细介绍如何使用 Python 的 Requests 库实现复杂网络访问,包括添加请求头、使用代理 IP、证书验证、超时设置以及使用 Cookies 等常用功能。
一、添加请求头 在 HTTP 请求中,请求头(Headers)是客户端向服务器发送额外信息的重要载体,例如指定客户端的类型、语言、接受的数据类型等。通过设置请求头,可以模拟不同的浏览器或客户端行为,从而提高请求的成功率和兼容性。
import requests
headers = {
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" ,
"Accept-Language" : "en-US,en;q=0.9" ,
"Accept-Encoding" : "gzip, deflate, br"
}
response = requests.get("https://example.com" , headers=headers)
print (response.text)
在上述代码中,我们首先定义了一个名为 headers 的字典,其中包含了常见的请求头字段,如 User-Agent、Accept-Language 和 Accept-Encoding。然后在 requests.get 方法中通过 headers 参数将该字典传递给请求,从而在发送请求时附加了这些自定义的请求头信息。
二、使用代理 IP 在某些情况下,我们可能需要通过代理服务器来发送请求,例如隐藏真实 IP 地址、访问受限地区的内容等。Requests 库支持使用代理 IP,其使用方法与添加请求头类似,只需设置 proxies 参数即可。
import requests
proxies = {
"http" : "http://123.45.67.89:8080" ,
"https" : "https://123.45.67.89:8080"
}
response = requests.get("https://example.com" , proxies=proxies)
print (response.text)
在代码中,proxies 是一个字典,其键分别为 "http" 和 "https",对应的值是代理服务器的地址和端口号。通过设置 proxies 参数,Requests 库会将请求通过指定的代理服务器发送出去。
需要注意的是,在使用代理 IP 时,应确保代理服务器的地址和端口号是有效的,并且代理服务器支持目标网站的访问。此外,代理服务器可能会对请求进行限制或修改,因此在使用过程中需要根据实际情况进行调试和优化。
三、证书验证 在与 HTTPS 网站进行交互时,证书验证是一个重要的安全机制。默认情况下,Requests 库会对 HTTPS 证书进行验证,以确保通信的安全性。然而,在某些开发或测试环境中,我们可能需要关闭证书验证,或者使用自定义的证书文件。
关闭证书验证 import requests
response = requests.get("https://example.com" , verify=False )
print (response.text)
在上述代码中,通过将 verify 参数设置为 False,可以关闭对 HTTPS 证书的验证。这在开发过程中用于测试或访问自签名证书的网站时非常有用,但在生产环境中不建议关闭证书验证,因为这会降低通信的安全性。
使用自定义证书文件 import requests
response = requests.get("https://example.com" , verify="/path/to/certificate.pem" )
print (response.text)
如果需要使用自定义的证书文件进行验证,可以将 verify 参数的值设置为证书文件的路径。这在访问需要特定证书验证的网站时非常有用,例如企业内部的 HTTPS 服务。
四、超时设置 在网络请求过程中,由于网络延迟、服务器响应缓慢等原因,可能会导致请求长时间没有得到响应。为了避免程序无限等待,可以通过设置超时时间来限制请求的等待时间。
import requests
try :
response = requests.get("https://example.com" , timeout=5 )
print (response.text)
except requests.exceptions.Timeout:
print ("请求超时" )
在代码中,通过设置 timeout 参数的值为 5,表示请求的超时时间为 5 秒。如果在 5 秒内没有收到服务器的响应,Requests 库会抛出一个 Timeout 异常。通过捕获该异常,可以对超时情况进行相应的处理,例如重试请求或提示用户。
需要注意的是,超时时间的设置应根据实际需求进行调整。如果目标网站的响应速度较慢,可以适当增加超时时间;如果对响应速度要求较高,可以适当减少超时时间。
五、使用 Cookies Cookies 是服务器存储在客户端的一小段文本信息,用于标识用户身份、记录用户偏好等。在使用 Requests 库发送请求时,可以通过设置 cookies 参数来使用 Cookies,从而实现会话管理等功能。
从字符串转换 Cookies import requests
temp_cookies = "cookie1=value1; cookie2=value2"
cookies = {}
for cookie in temp_cookies.split("; " ):
key, value = cookie.split("=" )
cookies[key] = value
response = requests.get("https://example.com" , cookies=cookies)
print (response.text)
在上述代码中,temp_cookies 是从浏览器的开发者工具中获取的 Cookies 字符串。通过两次分割操作,第一次以 "; " 分割得到列表 A,第二次对列表 A 中的每个元素以 "=" 分割得到字典的键值对,从而将 Cookies 字符串转换为字典格式。然后在 requests.get 方法中通过 cookies 参数将该字典传递给请求,即可在请求中使用这些 Cookies。
使用 RequestsCookieJar 对象 import requests
response = requests.get("https://example.com" )
cookies = response.cookies
print (cookies)
response = requests.get("https://example.com" , cookies=cookies)
print (response.text)
在代码中,当程序发送请求时(不设置参数 cookies),Requests 库会自动生成一个 RequestsCookieJar 对象,该对象用于存放服务器返回的 Cookies 信息。通过 response.cookies 可以获取到该对象,然后在后续的请求中通过 cookies 参数将该对象传递给请求,从而实现 Cookies 的传递和使用。
Cookies 的读写操作 如果需要将 Cookies 信息持久化存储,可以使用 http 模块实现 Cookies 的读写操作。此外,还可以将 Cookies 以字典形式写入文件,这种方法相对简单,但安全性较低。以下是将 Cookies 以字典形式写入文件的代码示例:
import json
with open ("cookies.json" , "w" ) as f:
json.dump(cookies, f)
with open ("cookies.json" , "r" ) as f:
cookies = json.load(f)
print (cookies)
在代码中,通过 json 模块的 dump 方法将 Cookies 字典写入文件,通过 load 方法从文件中读取 Cookies 字典。这种方法可以方便地将 Cookies 信息保存到本地文件中,以便在后续的程序运行中能够重复使用。
下载与上传文件
文件下载 用 Python 的 requests 库从网络上下载图片并保存到本地的基本示例:
import requests
url = 'https://www.python.org/static/img/python-logo.png'
r = requests.get(url)
if r.status_code == 200 :
with open ('python.jpg' , 'wb' ) as f:
f.write(r.content)
print ("图片已成功下载并保存为 python.jpg" )
else :
print ("请求失败,状态码:" , r.status_code)
代码解释:
导入库:import requests:导入 requests 库,用于发送 HTTP 请求。
设置 URL:url='...'
发送请求:r = requests.get(url):使用 requests.get() 方法发送 GET 请求到指定的 URL。
检查响应状态码:if r.status_code == 200::检查响应的状态码是否为 200(表示请求成功)。
保存文件:with open('python.jpg', 'wb') as f::以二进制写入模式打开一个文件,文件名为 python.jpg。
f.write(r.content):将响应内容(图片的二进制数据)写入文件。
关闭文件:使用 with 语句自动管理文件的打开和关闭,不需要显式调用 f.close()。
错误处理:如果请求失败(状态码不是 200),打印错误信息。
文件上传 文件上传的逻辑是把数据以字节流的形式上传到服务器上,再由服务器接收内容,文件上传有一定难度,难点在于服务器接收规则不同。
分析请求
访问目标网站并准备抓包。
使用抓包工具捕获客户端和服务器之间的 HTTP/HTTPS 通信。
执行发布操作(选择文件、输入内容、点击发布按钮)。
查看抓取的请求信息,包括请求的 URL、请求方法(如 POST)、请求头、请求体、响应状态码等。
从图得知,该请求方式是 POST,QueryString 是 POST 的请求参数 data,Content-type 是上传文件,三个 Content-Disposition 分别对应发布内容、发布图片和设置分组可见。代码实现如下:
url = 'https://weibo.cn/imblog/sendmblog?rl=0&st=bd6702'
cookies = {'xxx' : 'xxx' }
files = {
'content' : (None , 'Python 爬虫' ),
'pic' : ('pic' , open ('test.png' , 'rb' )), 'image/png' ,
'visible' : (None , '0' )
}
r = requests.post(url, files=files, cookies=cookies)
print (r.status_code)
POST 数据对象是以文件为主的,上传文件时使用 files 参数作为请求参数。Requests 对提交的数据和文件所使用的请求参数做了明确的规定。
参数 files 也是以字典形式传递的,每个 Content-Disposition 为字典的键值对,Content-Disposition 的 name 为字典的键,value 为字典的值。
相关免费在线工具 curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online