Python爬虫进阶:requests库实战与高级用法

周予安
周予安
发布时间:2026-10-13 | 7人浏览过
原创

本文深入讲解Python爬虫中requests库的高级应用。通过GET与POST请求实例,演示如何构造Headers与Params;结合拉钩网案例解析数据抓取逻辑;详细介绍代理IP配置方法以规避封禁;最后通过人人网登录示例,阐述利用Session对象保持会话状态及Cookie管理的完整流程。

GET请求基础与响应处理

在Python爬虫开发中,发起HTTP GET请求是最基础的操作。通过requests库,我们可以轻松地向目标服务器发送请求并获取响应数据。

首先展示一个最简单的GET请求示例。代码中导入了requests模块,并调用get方法访问百度首页。需要注意的是,response.text属性返回的是Unicode字符串,在某些编码情况下可能出现乱码;而response.content返回的是字节流,通常建议通过decode('utf-8')进行解码后再处理,以确保中文内容显示正常。此外,代码注释中还提到了可以通过response.url和response.status_code分别获取请求URL和状态码,用于调试和验证请求是否成功。


import requests
'''
想要学习Python?Python学习交流群:973783996满足你的需求,资料都已经上传群文件,可以自行下载!
'''
response = requests.get("https://www.baidu.com/")
#text返回的是unicode的字符串,可能会出现乱码情况
# print(response.text)
 
#content返回的是字节,需要解码
print(response.content.decode('utf-8'))
 
 
# print(response.url)       #https://www.baidu.com/
# print(response.status_code)   #200
# print(response.encoding)    #ISO-8859-1

构造Headers与Params参数

在实际爬虫场景中,往往需要向服务器传递参数(params)并模拟浏览器行为(headers)。通过定义字典形式的params,可以构建查询字符串;同时,在headers中设置User-Agent等字段,可以模拟特定浏览器的请求头,从而降低被服务器拒绝的风险。示例中,代码构造了包含搜索关键词'python'的params,并指定了Chrome浏览器的User-Agent,最终将解码后的HTML内容写入本地文件baidu.html中保存。


import requests
 
params = {
  'wd':'python'
}
headers = {
  'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
}
 
response = requests.get("https://www.baidu.com/s",params=params,headers=headers)
 
#content返回的是字节,需要解码
with open('baidu.html','w',encoding='utf-8') as f:
  f.write(response.content.decode('utf-8'))

POST请求与数据解析

除了GET请求,POST请求在提交表单数据或API交互时同样重要。与GET不同,POST请求的数据通常放在请求体中。示例展示了如何向拉钩网的API接口发送POST请求。

以爬取拉钩网北京地区Python职位信息为例,代码构造了包含城市、页码和关键词的data字典,并设置了Referer头以模拟从列表页跳转来的请求。通过requests.post方法发送请求后,可以使用response.json()将返回的JSON字符串直接解析为Python字典对象,便于后续提取具体职位数据。这种处理方式比直接处理文本字符串更加高效和安全。


import requests
 
url = "https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false"
 
data = {
  'first':'true',
  'pn':1,
  'kd':'python'
}
 
headers = {
  "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36",
  "Referer":"https://www.lagou.com/jobs/list_python?city=%E5%8C%97%E4%BA%AC&cl=false&fromSearch=true&labelWords=&suginput="
}
 
response = requests.post(url,data=data,headers=headers)
# print(response.text)
print(type(response.text))    #<class 'str'>
print(type(response.json()))   #<class 'dict'>
 
print(response.json())      #获取为字典的形式

配置代理IP规避限制

当目标网站对IP频率有严格限制时,使用代理IP是常见的解决方案。requests库支持通过proxies参数指定代理服务器。示例中定义了一个包含'http'协议代理地址的字典,并在发送请求时传入该参数。服务器将通过代理IP发起请求,从而隐藏真实IP地址,提高爬取的稳定性和成功率。


import requests
 
proxy = {'http':'115.210.31.236.55:9000'}
 
response = requests.get("https://www.baidu.com/",proxies=proxy)
 
print(response.content.decode('utf-8'))

利用Session保持登录状态

对于需要登录才能访问的页面,简单的GET或POST请求无法携带登录状态。此时,可以使用requests.session()对象来维持会话。Session对象可以自动保存和发送Cookie,从而模拟用户的登录状态。


# _*_ coding:utf-8 _*_
 
import requests
 
# 1. 创建session对象,可以保存Cookie值
ssion = requests.session()
 
# 2. 处理 headers
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
 
# 3. 需要登录的用户名和密码
data = {"email":"158xxxxxxxx", "password":"pythonxxxxxxx"}
 
# 4. 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里
ssion.post("http://www.renren.com/PLogin.do", data = data)
 
# 5. ssion包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
response = ssion.get("http://zhibo.renren.com/news/108")
 
# 6. 打印响应内容
print(response.text)
 

最后,通过人人网登录示例完整演示Session的使用流程。首先创建session对象,设置请求头,然后构造包含用户名和密码的data字典。通过session.post方法发送登录请求后,Session会自动将服务器返回的Cookie保存在对象内部。随后,使用该Session对象发起GET请求访问需要登录才能查看的页面,即可成功获取内容。这一机制是处理复杂网站登录状态的关键技术。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表