python并发爬虫实用工具tomorrow实用解析

介绍

tomorrow 是一个使用 python 开发的并发爬虫工具,可以实现简单的多线程/多进程执行代码,并且非常易于使用。这个工具的特点就是:它能够自动将一个函数转化为一个线程或进程,并且允许你设置线程和进程池的大小。在使用 tomorrow 来实现爬虫的时候,我们只需要将爬虫函数用 @tomorrow.thread@tomorrow.process 修饰器包装即可。

步骤

  1. 安装tomorrow

首先,我们需要通过 pip 安装 tomorrow

  ```
  pip install tomorrow
  ```
  1. 导入tomorrow模块

导入 tomorrow 模块:

  ```python
  from tomorrow import threads, process
  ```
  1. 编写爬虫代码并用 tomorrow 修饰器进行包装

假设我们有一个简单的爬虫函数 crawl(url),该函数使用 requests 库访问 url 并返回响应结果,我们可以用 @tomorrow.thread 修饰器将这个函数转化为一个线程:

  ```python
  import requests
  from tomorrow import threads

  @threads(5)
  def crawl(url):
      res = requests.get(url)
      return res.text
  ```

如果我们希望将这个函数转化为一个进程,在函数名前加上 @tomorrow.process 即可:

  ```python
  import requests
  from tomorrow import process

  @process(pool_size=3)
  def crawl(url):
      res = requests.get(url)
      return res.text
  ```
  1. 调用函数

现在我们就可以通过调用这个函数来进行爬虫了,比如我们可以通过 ThreadPoolExecutor 来实现一个线程池:

  ```python
  import concurrent.futures

  urls = ['http://www.example.com/1', 'http://www.example.com/2', 'http://www.example.com/3']

  with concurrent.futures.ThreadPoolExecutor() as executor:
      results = executor.map(crawl, urls)

  for result in results:
      print(result)
  ```

如果我们希望使用多个进程进行爬虫,可以使用 ProcessPoolExecutor

  ```python
  import concurrent.futures

  urls = ['http://www.example.com/1', 'http://www.example.com/2', 'http://www.example.com/3']

  with concurrent.futures.ProcessPoolExecutor() as executor:
      results = executor.map(crawl, urls)

  for result in results:
      print(result)
  ```

这里我们使用了 executor.map() 来对 urls 中的每个网址调用 crawl 函数并返回结果,在这里 results 是一个迭代器,它包含了 crawl 函数返回的结果。我们可以通过遍历结果来查看爬虫的结果。

示例说明

下面给出两个示例说明,第一个用来下载图片,借助 tomorrow 的多线程机制提高下载效率,第二个示例模拟访问百度查询并爬取相关网页的链接:

  1. 下载图片

    ```python
    import requests
    import urllib.request
    from tomorrow import threads

    @threads(5)
    def download_img(url):
    try:
    print("正在下载: ", url)
    response = requests.get(url, timeout=30, headers=headers)
    if response.status_code == 200:
    with open(name, 'wb') as f:
    f.write(response.content) # 写入图片
    else:
    print("下载失败:", url)
    response.close()
    except requests.exceptions.RequestException as e:
    print("下载失败:", url, " 错误原因:", str(e))

    if name == "main":
    urls = [
    "https://XXXXXX/1.jpg",
    "https://YYYYYY/2.jpg",
    "https://ZZZZZZ/3.jpg"
    ]

      for url in urls:
          download_img(url)
    

    ```

根据实测,单线程下载图片的速度是 19.0 s,使用 @threads(2) 修饰器之后下载速度变为 10.4s。

  1. 模拟查询并爬取百度搜索页

    ```python
    import requests
    from tomorrow import threads

    headers = {
    'User-agent': 'xxxxx',
    'Cookie': 'yyyyy'
    }

    @threads(10)
    def get_search(url):
    try:
    response = requests.get(url, timeout=10, headers=headers)
    if response.status_code != 200:
    print("请求失败:", url)
    return
    html = response.text
    # 解析网页
    ...
    response.close()
    except requests.exceptions.RequestException as e:
    print("请求失败:", url, " 错误原因:", str(e))

    if name == "main":
    queries = [
    "python tomorrow",
    "python 并发",
    "爬虫 新手"
    ]

      for query in queries:
          url = "https://www.baidu.com/s?wd={}".format(query)
          get_search(url)
    

    ```

该示例模拟使用百度搜索,并使用 @threads(10) 修饰器对搜索结果页面进行爬取。根据实测在单线程情况下爬取搜索结果页面的速度是 53.3s,使用 threads(10) 修饰器之后爬取时间降至 17.9s,速度提升了 2.98 倍。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python并发爬虫实用工具tomorrow实用解析 - Python技术站

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

相关文章

  • 最新密码验证正则表达式

    以下是详细讲解“最新密码验证正则表达式”的完整攻略。 1. 密码验证规则 最新的密码验证规则通常括以下要求: 长度在8-20个字符之间 至少包含一个大写字母 至少包含一个小写字 至少包含一个数字 至少包含一个特殊字符,如!@#$%^&*() 为了满足这些要求,我们使用正则表达式来验证密码是否符合规则。 2. 正则表达式 下面是合最新密码验证规则的正则…

    python 2023年5月14日
    00
  • python 正则表达式 概述及常用字符

    下面我将详细讲解Python正则表达式的概述及常用字符,以及两个具体的示例说明。 Python正则表达式概述 正则表达式(Regular Expression)是一种高效的文本处理工具,常用于文本匹配、提取、替换等操作。Python通过内置的re模块支持正则表达式操作。在正则表达式中,由特定字符和符号组成的匹配规则,被称为正则表达式的模式。 常用字符 普通字…

    python 2023年6月3日
    00
  • Python实现大乐透号码随机生成

    Python实现大乐透号码随机生成攻略 在Python中实现大乐透号码随机生成可以使用random库的函数来生成随机数进行组合,同时使用for循环来生成多组号码。 步骤 导入random库:使用import random来导入random库 定义生成号码函数:使用def语句定义生成号码函数,例如下面的代码 def generate_lottery(): “”…

    python 2023年6月3日
    00
  • python设计模式大全

    Python设计模式大全 简介 Python 是一种高级、高性能、动态编程语言,因其简单易读和灵活性而受到广泛的欢迎。在 Python 中,设计模式是解决问题或问题系列的经验总结。对于初学者,学习设计模式对于提高代码的效率和准确性非常重要。在这里,我们将介绍 Python 的一些最流行的设计模式,这些设计模式对于 Python 程序员来说是必须要学习的。 设…

    python 2023年6月6日
    00
  • 教你用Python+selenium搭建自动化测试环境

    教你用Python+Selenium搭建自动化测试环境 什么是自动化测试? 自动化测试是指使用自动化工具模拟人工操作,进行测试的过程。自动化测试可以大幅度缩短测试时间,提高测试效率,保证软件质量和稳定性。 Selenium简介 Selenium是自动化测试工具的一种,它可以模拟用户在浏览器中的操作,比如点击、输入等,然后在浏览器中验证界面的响应,验证指定的元…

    python 2023年6月3日
    00
  • 详解使用Python将文件从jpg转换成gif

    将文件从jpg转换成gif需要使用Python中的Pillow库,下面是具体步骤: 步骤一:安装Pillow库 在命令行中输入以下命令即可安装: pip install Pillow 步骤二:编写Python脚本 在Python脚本中,我们需要使用Pillow库中的Image模块。以下是一个简单的示例代码: import os from PIL import…

    python-answer 2023年3月25日
    00
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理

    浅析python实现布隆过滤器及Redis中的缓存穿透原理 什么是布隆过滤器 布隆过滤器是一种用于快速判断一个元素是否存在于一个集合中的数据结构。它使用一定数量的位数组和几个Hash函数来实现。 Python实现布隆过滤器 Python中实现布隆过滤器可以使用Bitarray库,该库提供了高效的位数组操作。 实现步骤如下: 1. 安装依赖库bitarray …

    python 2023年6月6日
    00
  • Python万字深入内存管理讲解

    Python万字深入内存管理讲解攻略 什么是内存管理 内存管理指的是对于计算机内存的管理、维护和利用。在Python中,其内存管理由解释器通过垃圾回收机制来进行。 Python内存管理机制 Python通过称之为引用计数的机制来管理内存。当对象被创建时,Python会为其分配内存并将一个指向该内存块的引用计数器设置为1。当引用计数器变为0时,Python就会…

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