本文介绍: 深入使用requests.Session()# 创建会话实例,并设置默认值# 现在进行的所有的请求都会发送预设的头信息print(response.text) # 应当会见到”user-agent”和之前设定的鉴权信息# 一般在完成请求后关闭会话urls = [try:print(f”生成异常: {url} {exc}”)
前言:
提高抓取和解析效率的根本还是在于发送请求;如何从这个方面进行效率提升呢?
深入使用requests.Session()
深入使用requests.Session()
1.持久连接:
当使用 requests.Session() 时,连接会话中所有的请求将优先使用一个TCP连接,即“持久连接”,这样即使你发起多次对同一主机的独立请求,Session 实例会重用底层的连接,从而降低握手的开销。
2.连接适配和参数预设:
Session 对象允许你自定义一些请求细节,如头信息和鉴权凭证等,并在之后的请求中保持这些设置,减少了重复代码的编写。
3.为请求维持Cookie状态:
Session 对象自动处理请求的 Cookies,所有发给同一个会话的请求将使用同一个Cookie jar,在这样的机制下,所有与server的会话变量都可以一次设立,然后按预期工作。
你现在应该有了一个清晰的Session如何作为一个持久连接来降低延时的认识,如何使用Session预设请求参数和身份验证方式,以及如何维持cookies的状态以跨请求进行身份维持和通行。在所有会话结束之后,确保调用 .close() 方法至关重要,以确保资源的妥善释放。
异常处理
网络爬虫可能面临各种预料之外的问题,如网络波动、页面结构更改、服务器配置问题等。为了提高脚本的健壮性,应当合理捕获并处理这些异常。
案例1:处理网络请求异常
案例2:处理Beautiful Soup可能的异常
使用多线程和并发
当处理的网页数量庞大时,这一过程往往相当耗时。在Python中通过threading和concurrent.futures模块将Beautiful Soup的使用并行化,显著提升效率。
多线程基础
threading模块允许我们运行多个线程(即任务)来执行代码。在网络请求和HTML解析任务中,多线程能有效减少等待I/O操作(如网络请求)的时间。
使用concurrent.futures简化多线程
concurrent.futures模块提供了一种高级别的异步执行机制,通过ThreadPoolExecutor类我们可以非常方便地创建线程池。
案例一:简单多线程HTML请求和解析
我们首先摆脱繁杂的线程管理,并且用concurrent.futures来提升我们代码的执行速度:
在这个案例中,ThreadPoolExecutor创建了一个线程池,异步地请求网页并解析标题标签
案例二:并发实现细粒度Html元素处理
如果网页数据解析涉及大量细致的处理,我们进一步地将Html元素的收集和处理分摊到不同线程去执行。
executor.submit()负责提交任务给线程池,此处分别用独立的线程下载HTML文档和解析文档中的产品列表。
案例三:避免全局解释器锁(GIL)带来的影响
虽然threading在I/O密集型任务中表现良好,但GIL(Global Interpreter Lock,全局解释器锁)可能会在某些情况下影响效率。此时,我们可以考虑使用 Python 的 multiprocessing 模块。
通过创建一个基于进程的ThreadPool来完成并发执行,这样就可以绕过GIL的限制,适用于任何数目的cpu密集型和I/O密集型任务。
运用多线程和并发可以大量缩短网页数据处理的时间,对于领域内从事数据采集和分析的从业者来说,这是提升工作效率的重要方法。希望通过本文,您能利用Python提供的并发工具,更高效地实现爬虫和数据解析任务。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。