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

yizhihongxing

介绍

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日

相关文章

  • Python打印特殊符号及对应编码解析

    在Python中,可以使用Unicode编码来打印特殊符号。以下是Python打印特殊符号及对应编码解析的详细攻略: 打印Unicode编码 要打印Unicode编码,可以使用\u加上4位十六进制数的形式。以下是打印Unicode编码的示例: print(‘\u2605’) 在上面的示例中,使用\u加上4位十六进制数的形式打印Unicode编码\u2605,…

    python 2023年5月14日
    00
  • Flask框架Jinjia模板常用语法总结

    Flask框架Jinjia模板是常用的模板引擎之一,其语法简单易学,在Web开发中具有广泛的应用。下面将详细讲解Jinja模板的使用方法: Jinja模板基础语法 变量输出 使用{{}}语法可以输出变量的值,如下: <p>{{variable}}</p> 这里的variable就是在上下文中传入的变量。 控制结构 if语句 使用{% …

    python 2023年5月14日
    00
  • python进阶之多线程对同一个全局变量的处理方法

    Python进阶之多线程对同一个全局变量的处理方法 在Python中,多线程可以让程序更加高效地利用CPU资源,但是多线程同时访问同一个全局变量,会有一些问题,如数据不同步,数据错误等问题,接下来,我们将针对这个问题提供解决方案。 问题描述 在多线程环境下,如果同时对同一个全局变量进行读写操作,会出现数据不同步、数据错误等问题。比如以下代码: import …

    python 2023年5月19日
    00
  • Python 实现日志同时输出到屏幕和文件

    实现Python日志同时输出到屏幕和文件,可以使用Python标准库logging。logging是一个强大的日志模块,可以实现灵活的日志记录和输出方式。 以下是实现步骤: 步骤一:导入logging模块 import logging 步骤二:创建日志相关的变量 logger = logging.getLogger(‘mylogger’) # 创建logge…

    python 2023年6月5日
    00
  • Numpy中reshape()和resize()方法的区别

    下面是对Numpy中reshape()和resize()方法的详细讲解及说明。 reshape()方法 概述 reshape()方法是将一个数组转化为指定的形状。该方法返回的是一个新的数组,而原数组并没有发生改变。 语法 reshape()方法的语法如下:numpy.reshape(arr, newshape, order=’C’) 参数说明: arr:数组…

    python-answer 2023年3月25日
    00
  • Python3 Post登录并且保存cookie登录其他页面的方法

    下面我将为你详细讲解 “Python3 Post登录并且保存cookie登录其他页面的方法”。 简介 在web爬虫开发过程中,登录并保持会话状态是常见的需求。本文主要讲解如何使用Python3模拟post请求登录,并在登录后保持会话状态,实现cookie重用登录其他页面。 1. 实现登录 首先,我们需要发送登录请求以获得有效的cookie,首先需要构建登录表…

    python 2023年6月3日
    00
  • python学习实操案例(二)

    我来为您详细讲解一下“python学习实操案例(二)”的完整攻略。 简介 该文章是介绍Python语言学习的实践案例,可以帮助读者更加深入地学习Python语言。 环境准备 在开始实操之前,需要准备好Python环境。具体的步骤可以参考Python环境搭建指南。 实操案例一:计算一个文件中的词频 操作步骤 读取文件内容,可以使用Python内置的open函数…

    python 2023年5月30日
    00
  • python通过cython加密代码

    使用Cython对Python代码进行加密是一种保护Python代码的方法。下面是完整的攻略和两个示例。 工具和材料 Python环境 Cython pyximport库 步骤 安装Cython和pyiximport Cython是Python的C语言扩展,需要安装。可以使用以下命令安装: pip install Cython pyximport是能够自动将…

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