python实现多线程采集的2个代码例子

下面是详细的攻略:

Python实现多线程采集

前言

对于一些需要收集数据的任务,并发的采集方式无疑是对效率的一大提升。Python语言提供了多线程编程的支持,本文将会介绍两种使用Python实现多线程采集的方式并提供相应的代码。

代码实现

代码一

第一种实现方式相对来说比较简单理解,我们可以直接使用Thread类来创建新的线程并运行。

import threading
import requests

def main():
    urls = ["http://example.com/", 
            "http://example.com/news", 
            "http://example.com/about", 
            "http://example.com/contact",
            "http://example.com/sitemap",
            "http://example.com/blog",
            "http://example.com/jobs",
            "http://example.com/feedback"]

    threads = []

    for url in urls:
        t = threading.Thread(target=fetch_url, args=(url,))
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

def fetch_url(url):
    print("Fetching {0}".format(url))
    try:
        r = requests.get(url)
        print("{0}: {1}".format(url, r.status_code))
    except requests.exceptions.RequestException as e:
        print("{0}: {1}".format(url, e))

使用上述代码,简单来说,我们首先定义了一个列表urls,并在遍历该列表的过程中,创建了多个线程,每个线程都调用了fetch_url函数,并传入了当前的URL。接着,我们在主线程内通过join等待其他线程的结束。

代码二

另外一种实现方式相对来说更加高级,可以同时限制线程数量来进一步提升效率,我们可以使用Python的线程池来实现。

import concurrent.futures
import requests

def main():
    urls = ["http://example.com/", 
            "http://example.com/news", 
            "http://example.com/about", 
            "http://example.com/contact",
            "http://example.com/sitemap",
            "http://example.com/blog",
            "http://example.com/jobs",
            "http://example.com/feedback"]

    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        future_to_url = {executor.submit(fetch_url, url): url for url in urls}
        for future in concurrent.futures.as_completed(future_to_url):
            url = future_to_url[future]
            try:
                data = future.result()
                print("{0}: {1}".format(url, data))
            except Exception as exc:
                print("{0}: {1}".format(url, exc))

def fetch_url(url):
    print("Fetching {0}".format(url))
    try:
        r = requests.get(url)
        return r.status_code
    except requests.exceptions.RequestException as e:
        return str(e)

使用以上代码,我们可以看到,在主函数内,我们首先定义了一个URL列表urls,并使用线程池ThreadPoolExecutor创建了一个最大线程数为5的线程池。随后,我们在使用submit方法向线程池提交任务时,还为每个任务使用了一个dict来存储其对应的URL地址,方便我们后续的输出。最后,我们在对future进行as_completed迭代的过程中获取了每个任务返回的结果。

总结

以上两种多线程采集Python代码的方式并不是唯一的选择,而是较为常用且简便的方式之一。通过合理使用多线程的方式来提升程序的效率,是Python程序员们需要重点考虑的一项工作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现多线程采集的2个代码例子 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Python发送邮件测试报告操作实例详解

    我可以为您详细讲解“Python发送邮件测试报告操作实例详解”的完整攻略。具体流程如下: 1. 安装所需依赖库 在Python环境中,我们需要使用到一些第三方的库,包括smtplib和email。 可以使用如下命令进行安装: pip install smtplib pip install email 2. 编写邮件发送脚本 在发送邮件的脚本中,我们需要完成以…

    python 2023年5月20日
    00
  • Python常见类型转换的小结

    Python常见类型转换的小结 在Python中,可以使用特定的函数对不同数据类型进行转换,包括但不限于以下几种类型:- 数字类型: int, float- 字符串类型: str- 列表类型: list- 字典类型: dict 数字类型转换 int()函数 将一个数值或字符串转换成整数,可以使用int()函数。 a = 10.2 b = int(a) pri…

    python 2023年5月13日
    00
  • Python星号*与**用法分析

    当使用Python编程时,星号和通常用于处理参数,unpacking元素和编写可变数量的函数参数。接下来,我将详细讲解Python星号与**用法分析以及在不同场景下的使用示例。 使用星号*处理参数 常规参数和可变数量的参数同时存在 在Python中,可以将星号用于处理常规参数和可变数量的参数。下面是一个例子,其中a是常规参数,b是可变数量的参数,且带有星号的…

    python 2023年5月13日
    00
  • 使用Python进行防病毒免杀解析

    使用Python进行防病毒免杀解析可以帮助我们破解一些常见的病毒防护机制,让我们更好地分析病毒性质和行为。下面是完整攻略步骤: 1. 首先需要理解病毒防护机制 在进行防病毒免杀解析之前,我们需要对病毒防护机制有所了解。常见的病毒防护机制包括文件加壳、API hook和进程注入等,我们需要分析病毒的cracking行为和相关机制。 2. 使用Python进行病…

    python 2023年6月3日
    00
  • 解决python 出现unknown encoding: idna 的问题

    解决Python出现unknown encoding: idna的问题 在Python程序中,有时会出现“unknown encoding: idna”的异常,这是因为Python在处理网络数据时,使用了idna编码,而该编码在某些系统中并不支持。本文将详细讲解如何解决这个问题。 问题排查 当Python程序出现“unknown encoding: idna…

    python 2023年5月31日
    00
  • 浅谈python在提示符下使用open打开文件失败的原因及解决方法

    浅谈Python在提示符下使用open打开文件失败的原因及解决方法 在Python中,使用open函数打开文件是非常常见的操作。是,在提示符下使用open函数打开文件时,有时会出现开文件失败的情况。本文将详细讲解Python在提示符下使用open打开文件失败的原因及解决方法,包括文件路径错误、文件权限问题等。在过程中,供两个示例说明,帮助读者更好地理解ope…

    python 2023年5月13日
    00
  • Python实现模拟时钟代码推荐

    下面是关于“Python实现模拟时钟代码推荐”的完整攻略。 简介 在了解具体实现方法之前,首先需要明确实现时钟的基本原理。 模拟时钟的实现方法,一般都是利用计算机系统的计时功能(例如Python中的time模块)来模拟时间的流逝,并不断更新时钟的显示。因此,要实现一个模拟时钟,需要掌握以下几个关键点: 计算机系统计时功能的使用方法 时钟的外观和显示形式设计 …

    python 2023年6月2日
    00
  • 浅析python中的set类型

    浅析 Python 中的 Set 类型 Set 是 Python 集合类型的一种,与 List 和 Tuple 一样,也是存储一组元素的数据类型。但 Set 和 List/Tuple 的最大区别在于,Set 中的元素不允许重复。如果你需要一个存储不重复元素的数据容器,那么 Set 就是一个非常好的选择。 Set 的定义 创建 Set 的方法有两个。一个是使用…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部