【python 中的Session 爬取数据案例实践——突发事件预警信息发布网数据抓取】
python 中的Session 爬取数据案例实践——突发事件预警信息发布网数据抓取
在数据采集与处理的过程中,网络请求和数据存储是两个关键环节。合理使用requests.Session
和上下文管理器不仅能提升代码的稳定性和效率,还能让代码结构更加清晰。本文将结合实际代码示例,详细讲解如何利用requests.Session
实现带重试机制的网络请求,并通过上下文管理器优雅地管理数据库连接,完成数据从抓取到存储的全流程。
一、requests.Session的优势与应用
requests.Session
是requests
库中用于管理会话的类,它能在多次请求之间保持某些参数,如Cookies、请求头,同时可以方便地添加重试机制,提升网络请求的可靠性。
1.1 创建带重试机制的Session
session = requests.Session()
retry = Retry(total=3, # 总重试次数backoff_factor=2, # 重试间隔倍数status_forcelist=[429, 500, 502, 503, 504] # 需要重试的状态码
)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
上述代码通过Retry
类定义了重试策略,当请求返回429
(请求过多)、500
(服务器内部错误)等指定状态码时,Session
会自动进行重试。backoff_factor
设置了重试间隔的增长倍数,例如第一次重试间隔2秒,第二次就是4秒,以此类推,避免短时间内频繁请求对目标服务器造成压力。
1.2 使用Session管理会话
# 1. 先访问首页建立基础会话
print("第一步:访问首页建立会话...")
home_url = "http://www.yn12379.cn/yn/warning/main?limit=5"
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36"
home_headers = {"User-Agent": user_agent,"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8","Connection": "keep-alive"
}
try:home_response = session.get(home_url, headers=home_headers, timeout=30)print(f"首页响应状态码: {home_response.status_code}")print(f"首页获取的Cookies: {session.cookies.get_dict()}")
except requests.exceptions.RequestException as e:print(f"访问首页失败: {str(e)}")return
通过先访问首页建立会话,Session
会自动保存服务器返回的Cookies。后续的请求会带上这些Cookies,模拟真实的用户会话过程,对于需要登录或有状态的请求场景十分重要。
二、上下文管理器简化资源管理
上下文管理器通过with
语句来管理资源的生命周期,确保资源在使用后被正确释放。在数据库连接管理中,上下文管理器能有效避免资源泄漏问题。
2.1 定义MySQL连接上下文管理器
@contextmanager
def mysql_connection(d