AyugeSpiderTools


NameAyugeSpiderTools JSON
Version 3.13.0 PyPI version JSON
download
home_pageNone
Summaryscrapy 扩展库:用于扩展 Scrapy 功能来解放双手。
upload_time2025-08-24 16:10:42
maintainerayuge
docs_urlNone
authorayuge
requires_python>=3.9
licenseMIT
keywords crawler scraping scrapy-extension
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            |logo|

.. |logo| image:: https://raw.githubusercontent.com/shengchenyang/AyugeSpiderTools/master/artwork/ayugespidertools-logo.svg
   :target: https://ayugespidertools.readthedocs.io/en/latest/
   :alt: ayugespidertools-logo
   :width: 480px

|license| |python_support| |docs| |releases_downloads| |pypi_downloads| |codecov|

.. |license| image:: https://img.shields.io/github/license/shengchenyang/AyugeSpiderTools
   :target: https://img.shields.io/github/license/shengchenyang/AyugeSpiderTools
   :alt: license

.. |python_support| image:: https://img.shields.io/badge/python-3.9%2B-blue
   :target: https://pypi.org/pypi/AyugeSpiderTools
   :alt: python support

.. |docs| image:: https://img.shields.io/readthedocs/ayugespidertools
   :target: https://ayugespidertools.readthedocs.io/en/latest/
   :alt: Read the Docs

.. |releases_downloads| image:: https://img.shields.io/github/downloads/shengchenyang/AyugeSpiderTools/total?label=releases%20downloads
   :target: https://github.com/shengchenyang/AyugeSpiderTools/releases
   :alt: GitHub all releases

.. |pypi_downloads| image:: https://img.shields.io/pypi/dm/AyugeSpiderTools?label=pypi%20downloads
   :target: https://pypistats.org/packages/ayugespidertools
   :alt: PyPI - Downloads

.. |codecov| image:: https://codecov.io/gh/shengchenyang/AyugeSpiderTools/graph/badge.svg?token=1QLOEW2NTI
   :target: https://app.codecov.io/gh/shengchenyang/AyugeSpiderTools
   :alt: codecov

**简体中文** | English_

概述
=======

   一句话介绍:用于扩展 Scrapy 功能来解放双手。

在使用 Scrapy 开发爬虫时,免不了会重复地编写 settings,items,middlewares,pipelines 和一些通用方\
法,但各项目中的这些内容都大致相同,那为何不把它们统一整理在一起呢?我也想扩展一些功能,比如当 spider 中\
添加字段后,不用再修改对应的 item 和 pipeline 甚至不用手动修改 Mysql 和 PostgreSQL 的表结构。

项目的主旨是让开发者只需专注于 spider 脚本的编写,减少开发和维护流程。理想状态下,只需关注 spider 中字\
段的解析规则和 VIT 下的 .conf 配置即可,**脱离无意义的重复操作**。

以 Mysql 存储场景举例:可以自动创建相关数据库,数据表,字段注释,自动添加 spider 中新添加的字段,和自动\
修复常见(字段编码,Data too long,存储字段不存在等)的存储问题。

安装
=======

   可以直接输入以下命令:

.. code:: bash

   pip install ayugespidertools

-------------------------------

   可选安装1,安装数据库相关的所有依赖:

.. code:: bash

   pip install ayugespidertools[database]

-----------------------------------------

   可选安装2,通过以下命令安装所有依赖:

.. code:: bash

   pip install ayugespidertools[all]

注:详细的安装介绍请查看 `安装指南`_。

用法
=======

   开发人员只需根据命令生成示例模板,再配置相关设置即可。

使用方法示例 GIF 如下:

.. image:: https://raw.githubusercontent.com/shengchenyang/AyugeSpiderTools/master/examples/ayugespidertools-use.gif
   :alt: ayugespidertools-use.gif

对以上 GIF 中的步骤进行解释:
::

   # 查看库版本
   ayuge version

   # 创建项目
   ayuge startproject <project_name>

   # 进入项目根目录
   cd <project_name>

   # 替换(覆盖)为真实的配置 .conf 文件:
   # 这里是为了演示方便,正常情况是直接在 VIT 中的 .conf 文件填上你需要的配置即可
   cp /root/mytemp/.conf DemoSpider/VIT/.conf

   # 生成爬虫脚本
   ayuge genspider <spider_name> <example.com>

   # 运行脚本
   scrapy crawl <spider_name>
   # 注:也可以使用 ayuge crawl <spider_name>

具体的场景案例请在 `DemoSpider`_ 项目中查看,也可以在 `readthedocs`_ 文档中查看教程。目前已适配以下场景:
::

   + 0).以下场景全支持从 nacos 或 consul 中获取配置,不一一举例。

   # 数据存入 Mysql 的场景:
   + 1).demo_one: 从 .conf 中获取 mysql 配置
   + 3).demo_three: 从 consul 中获取 mysql 配置
   + 21).demo_mysql_nacos: 从 nacos 中获取 mysql 配置
   + 5).demo_five: Twisted 异步存储示例
   + 24).demo_aiomysql: 结合 aiomysql 实现的 asyncio 异步存储示例
   + 13).demo_AyuTurboMysqlPipeline: mysql 同步连接池的示例

   # 数据存入 MongoDB 的场景:
   + 2).demo_two: 从 .conf 中获取 mongodb 配置
   + 4).demo_four: 从 consul 中获取 mongodb 配置
   + 6).demo_six: Twisted 异步存储示例
   + 17).demo_mongo_async: 结合 motor 实现的 asyncio 异步存储示例

   # 数据存入 PostgreSQL 的场景(需要安装 ayugespidertools[database])
   + 22).demo_nine: 从 .conf 中获取 postgresql 配置
   + 23).demo_ten: Twisted 异步存储示例
   + 27).demo_eleven: asyncio 异步存储示例

   # 数据存入 ElasticSearch 的场景(需要安装 ayugespidertools[database])
   + 28).demo_es: 普通同步存储示例
   + 29).demo_es_async: asyncio 异步存储示例

   # 数据存入 Oracle 的场景(需要安装 ayugespidertools[database])
   + 25). demo_oracle: 普通同步存储示例
   + 26). demo_oracle_twisted: Twisted 异步存储示例

   - 7).demo_seven: 使用 requests 来请求的场景(已删除,更推荐 aiohttp 方式)
   + 8).demo_eight: 同时存入 Mysql 和 MongoDB 的场景
   + 9).demo_aiohttp_example: 使用 aiohttp 来请求的场景
   + 10).demo_aiohttp_test: scrapy aiohttp 在具体项目中的使用方法示例

   + 11).demo_proxy_one: 快代理动态隧道代理示例
   + 12).demo_proxy_two: 测试快代理独享代理
   + 14).demo_crawl: 支持 scrapy CrawlSpider 的示例

   # 本库中给出支持 Item Loaders 特性的示例
   + 15).demo_item_loader: 本库中使用 Item Loaders 的示例
   - 16).demo_item_loader_two: 已删除,可查看 demo_item_loader,可方便的使用 Item Loaders 了

   + 18).demo_mq: 数据存入 rabbitmq 的模板示例
   + 35).demo_mq_async: 数据存入 rabbitmq 的异步模板示例
   + 19).demo_kafka: 数据存入 kafka 的模板示例
   + 20).demo_file: 使用本库 pipeline 下载图片等文件到本地的示例
   + 30).demo_file_sec: 自行实现的图片下载示例
   + 31).demo_oss: 使用本库 pipeline 上传到 oss 的示例
   + 32).demo_oss_sec: 自行实现的 oss 上传示例
   + 33).demo_oss_super: MongoDB 存储场景 oss 上传字段支持列表类型
   + 34).demo_conf: 支持从 .conf 中获取自定义配置

超级棒的示例
==============

简单、快速、优雅地实现分布式开发,部署及运行的示例:demo_s,具体介绍请在 `DemoSpider`_ 项目中查看,运\
行示例图为:

.. image:: https://raw.githubusercontent.com/shengchenyang/AyugeSpiderTools/master/examples/ayugespidertools-async-demo.png
   :alt: async-demo

跑通测试
==========

前提:需要在 tests 的 VIT 目录下创建 .conf 文件,已给出示例文件,请填写测试所需内容,然后:

- 可以直接使用 tox 来运行测试。
- 本库以 `poetry`_ 开发,那么直接新环境下运行 poetry install 后,手动运行目标测试或 pytest 命令来测\
  试等皆可。
- 也可以使用 make 工具,make start 然后 make test 即可。

你可能在意的事
===============

1. 若你觉得某些场景下的功能实现不太符合你的预期,想要修改或添加自定义功能,比如移除对你无用模块、修改库名\
   等,你可以自行修改后 build。

2. 本库主推 scrapy 扩展功能,在使用本库时,不会影响你 scrapy 项目及其它组件。

   也就是说,可使用本库开发原生的 scrapy,也可用 scrapy 的风格来开发,但还是推荐使用 `DemoSpider`_ \
   示例中的风格开发。不会对开发者造成过多的迁移成本。

3. item 中 (媒体)资源字段的存储需求较复杂?比如上传到 oss 功能需要更细分的需求,或者有其它更多类型的对\
   象云存储的需要,我该怎么方便地实现?

   1. 如果你比较了解本项目和 poetry 打包构建的流程,那么推荐你按照项目示例风格将需要功能添加后自行打包并\
      安装,比较方便后续使用;
   2. 因为本身就是 scrapy 项目,所以更推荐使用普通存储场景结合自己编写的 scrapy pipeline 来对 item \
      中的资源上传字段进行个性化处理,达到即保留了此库的通用和便捷,也实现了灵活性。

4. 代码测试覆盖率有点低,考虑增加吗?

   不考虑,场景所依赖服务太多,且云服务等其它因素导致个人维护成本过高,但不必担心,我会和本地服务的自动化\
   测试结合使用。

构建你的专属库
===============

   具体内容请以 `poetry`_ 官方文档为准。

据 `你可能在意的事`_ 可知,你可以 clone 源码后,修改任意方法(比如你的项目场景下可能需要其它的日志配置默\
认值,或添加其它的项目结构模板等),修改完成后 poetry build 或 make build 即可打包使用。

比如你可能需要更新依赖库中 kafka-python 为新版本 x.x.x,那只需 poetry install 安装现有依赖后,再\
poetry add kafka-python==x.x.x 安装目标版本(尽量不要使用 poetry update kafka-python),确定测\
试正常了即可 poetry build 打包使用。

   其它自定义 scrapy 项目的方式

也可以通过 cookiecutter 对项目个性化定制,可参考 `LazyScraper`_ 项目。

**希望此项目能在你遇到扩展 scrapy 功能的场景时对你有所指引。**

功能
=======

- [✓] scrapy 的扩展功能场景

  - [✓] scrapy 脚本运行信息统计和项目依赖表采集量统计,可用于日志记录和预警
  - [✓] 自定义模板,在 ayuge startproject <projname> 和 ayuge genspider <spidername> 时生成适\
    合本库的模板文件
  - [✓] 从远程应用管理服务中获取项目配置

    - [✓] 从 consul 获取项目配置
    - [✓] 从 nacos 获取项目配置(注意:优先级小于 consul)
  - [✓] 代理中间件(独享代理、动态隧道代理)
  - [✓] 随机请求头 UA 中间件,根据 fake_useragent 中的权重来随机
  - [✓] 使用以下工具来替换 scrapy 的 Request 来发送请求

    - [✓] requests: 这个不推荐使用,requests 同步库会降低 scrapy 运行效率\
      (已移除此功能,更推荐 aiohttp 的方式)
    - [✓] aiohttp: 集成将 scrapy Request 替换为 aiohttp 的协程方式
  - [✓] Mysql 存储的场景下适配

    - [✓] 自动创建 Mysql 用户场景下需要的数据库和数据表及字段格式,还有字段注释
  - [✓] MongoDB 存储场景适配
  - [✓] PostgreSQL 存储场景适配
  - [✓] ElasticSearch 存储场景适配
  - [✓] Oracle 存储场景适配
  - [✓] oss 上传场景适配
  - [✓] asyncio 语法支持与 async 第三方库支持示例

    - [✓] spider 中使用 asyncio 的 aiohttp 示例
    - [✓] pipeline 中使用 asyncio 的 aioMysql 示例
  - [✓] 集成 Kafka,RabbitMQ 等数据推送功能
- [✓] 常用开发场景

  - [✓] sql 语句拼接,只用于简单场景。
  - [✓] 数据格式化处理,比如:去除网页标签,去除无效空格等
  - [✓] 字体反爬还原方法

    - [✓] 基于 ttf,woff 之类的字体文件映射,或结合 css 等实现

      - [✓] 可以直接在字体文件 xml 中找到映射关系的:使用 `fontforge`_ 工具导出映射即可。
      - [✓] 无法找到映射关系的,则一般使用 ocr 识别(准确率非百分百),通过 fontforge 导出每个映射的\
        png,后再通过各种方式识别。
    - [✓] 字体反爬部分功能迁移到 FontMapster 项目中。
  - [✓] html 数据处理,去除标签,不可见字符,特殊字符改成正常显示等
  - [✓] 添加常用的图片验证码中的处理方法

    - [✓] 滑块缺口距离的识别方法(多种实现方式)
    - [✓] 根据滑块距离生成轨迹数组的方法
    - [✓] 识别点选验证码位置及点击顺序
    - [✓] 图片乱序混淆的还原方法示例

注意:功能演示我将放入 `readthedocs`_ 文档中,以防此部分内容过多。

感谢
=======

- `scrapy`_

赞助
=======

如果此项目对你有所帮助,可以选择打赏作者。

.. image:: https://github.com/shengchenyang/AyugeSpiderTools/raw/master/artwork/ayugespidertools-donating.jpg
   :alt: 微信赞赏码
   :width: 280

.. _English: https://github.com/shengchenyang/AyugeSpiderTools/blob/master/README_en.rst
.. _安装指南: https://ayugespidertools.readthedocs.io/en/latest/intro/install.html
.. _DemoSpider: https://github.com/shengchenyang/DemoSpider
.. _readthedocs: https://ayugespidertools.readthedocs.io/en/latest/
.. _poetry: https://python-poetry.org/docs/
.. _LazyScraper: https://github.com/shengchenyang/LazyScraper
.. _fontforge: https://github.com/fontforge/fontforge/releases
.. _scrapy: https://github.com/scrapy/scrapy


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "AyugeSpiderTools",
    "maintainer": "ayuge",
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": "ayugesheng@gmail.com",
    "keywords": "crawler, scraping, scrapy-extension",
    "author": "ayuge",
    "author_email": "ayugesheng@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/96/8d/87e075b75a39df80a2f6242b301b6a2ebc72a990ab0462776ee226a45a03/ayugespidertools-3.13.0.tar.gz",
    "platform": null,
    "description": "|logo|\n\n.. |logo| image:: https://raw.githubusercontent.com/shengchenyang/AyugeSpiderTools/master/artwork/ayugespidertools-logo.svg\n   :target: https://ayugespidertools.readthedocs.io/en/latest/\n   :alt: ayugespidertools-logo\n   :width: 480px\n\n|license| |python_support| |docs| |releases_downloads| |pypi_downloads| |codecov|\n\n.. |license| image:: https://img.shields.io/github/license/shengchenyang/AyugeSpiderTools\n   :target: https://img.shields.io/github/license/shengchenyang/AyugeSpiderTools\n   :alt: license\n\n.. |python_support| image:: https://img.shields.io/badge/python-3.9%2B-blue\n   :target: https://pypi.org/pypi/AyugeSpiderTools\n   :alt: python support\n\n.. |docs| image:: https://img.shields.io/readthedocs/ayugespidertools\n   :target: https://ayugespidertools.readthedocs.io/en/latest/\n   :alt: Read the Docs\n\n.. |releases_downloads| image:: https://img.shields.io/github/downloads/shengchenyang/AyugeSpiderTools/total?label=releases%20downloads\n   :target: https://github.com/shengchenyang/AyugeSpiderTools/releases\n   :alt: GitHub all releases\n\n.. |pypi_downloads| image:: https://img.shields.io/pypi/dm/AyugeSpiderTools?label=pypi%20downloads\n   :target: https://pypistats.org/packages/ayugespidertools\n   :alt: PyPI - Downloads\n\n.. |codecov| image:: https://codecov.io/gh/shengchenyang/AyugeSpiderTools/graph/badge.svg?token=1QLOEW2NTI\n   :target: https://app.codecov.io/gh/shengchenyang/AyugeSpiderTools\n   :alt: codecov\n\n**\u7b80\u4f53\u4e2d\u6587** | English_\n\n\u6982\u8ff0\n=======\n\n   \u4e00\u53e5\u8bdd\u4ecb\u7ecd\uff1a\u7528\u4e8e\u6269\u5c55 Scrapy \u529f\u80fd\u6765\u89e3\u653e\u53cc\u624b\u3002\n\n\u5728\u4f7f\u7528 Scrapy \u5f00\u53d1\u722c\u866b\u65f6\uff0c\u514d\u4e0d\u4e86\u4f1a\u91cd\u590d\u5730\u7f16\u5199 settings\uff0citems\uff0cmiddlewares\uff0cpipelines \u548c\u4e00\u4e9b\u901a\u7528\u65b9\\\n\u6cd5\uff0c\u4f46\u5404\u9879\u76ee\u4e2d\u7684\u8fd9\u4e9b\u5185\u5bb9\u90fd\u5927\u81f4\u76f8\u540c\uff0c\u90a3\u4e3a\u4f55\u4e0d\u628a\u5b83\u4eec\u7edf\u4e00\u6574\u7406\u5728\u4e00\u8d77\u5462\uff1f\u6211\u4e5f\u60f3\u6269\u5c55\u4e00\u4e9b\u529f\u80fd\uff0c\u6bd4\u5982\u5f53 spider \u4e2d\\\n\u6dfb\u52a0\u5b57\u6bb5\u540e\uff0c\u4e0d\u7528\u518d\u4fee\u6539\u5bf9\u5e94\u7684 item \u548c pipeline \u751a\u81f3\u4e0d\u7528\u624b\u52a8\u4fee\u6539 Mysql \u548c PostgreSQL \u7684\u8868\u7ed3\u6784\u3002\n\n\u9879\u76ee\u7684\u4e3b\u65e8\u662f\u8ba9\u5f00\u53d1\u8005\u53ea\u9700\u4e13\u6ce8\u4e8e spider \u811a\u672c\u7684\u7f16\u5199\uff0c\u51cf\u5c11\u5f00\u53d1\u548c\u7ef4\u62a4\u6d41\u7a0b\u3002\u7406\u60f3\u72b6\u6001\u4e0b\uff0c\u53ea\u9700\u5173\u6ce8 spider \u4e2d\u5b57\\\n\u6bb5\u7684\u89e3\u6790\u89c4\u5219\u548c VIT \u4e0b\u7684 .conf \u914d\u7f6e\u5373\u53ef\uff0c**\u8131\u79bb\u65e0\u610f\u4e49\u7684\u91cd\u590d\u64cd\u4f5c**\u3002\n\n\u4ee5 Mysql \u5b58\u50a8\u573a\u666f\u4e3e\u4f8b\uff1a\u53ef\u4ee5\u81ea\u52a8\u521b\u5efa\u76f8\u5173\u6570\u636e\u5e93\uff0c\u6570\u636e\u8868\uff0c\u5b57\u6bb5\u6ce8\u91ca\uff0c\u81ea\u52a8\u6dfb\u52a0 spider \u4e2d\u65b0\u6dfb\u52a0\u7684\u5b57\u6bb5\uff0c\u548c\u81ea\u52a8\\\n\u4fee\u590d\u5e38\u89c1\uff08\u5b57\u6bb5\u7f16\u7801\uff0cData too long\uff0c\u5b58\u50a8\u5b57\u6bb5\u4e0d\u5b58\u5728\u7b49\uff09\u7684\u5b58\u50a8\u95ee\u9898\u3002\n\n\u5b89\u88c5\n=======\n\n   \u53ef\u4ee5\u76f4\u63a5\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4\uff1a\n\n.. code:: bash\n\n   pip install ayugespidertools\n\n-------------------------------\n\n   \u53ef\u9009\u5b89\u88c51\uff0c\u5b89\u88c5\u6570\u636e\u5e93\u76f8\u5173\u7684\u6240\u6709\u4f9d\u8d56\uff1a\n\n.. code:: bash\n\n   pip install ayugespidertools[database]\n\n-----------------------------------------\n\n   \u53ef\u9009\u5b89\u88c52\uff0c\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u5b89\u88c5\u6240\u6709\u4f9d\u8d56\uff1a\n\n.. code:: bash\n\n   pip install ayugespidertools[all]\n\n\u6ce8\uff1a\u8be6\u7ec6\u7684\u5b89\u88c5\u4ecb\u7ecd\u8bf7\u67e5\u770b `\u5b89\u88c5\u6307\u5357`_\u3002\n\n\u7528\u6cd5\n=======\n\n   \u5f00\u53d1\u4eba\u5458\u53ea\u9700\u6839\u636e\u547d\u4ee4\u751f\u6210\u793a\u4f8b\u6a21\u677f\uff0c\u518d\u914d\u7f6e\u76f8\u5173\u8bbe\u7f6e\u5373\u53ef\u3002\n\n\u4f7f\u7528\u65b9\u6cd5\u793a\u4f8b GIF \u5982\u4e0b\uff1a\n\n.. image:: https://raw.githubusercontent.com/shengchenyang/AyugeSpiderTools/master/examples/ayugespidertools-use.gif\n   :alt: ayugespidertools-use.gif\n\n\u5bf9\u4ee5\u4e0a GIF \u4e2d\u7684\u6b65\u9aa4\u8fdb\u884c\u89e3\u91ca\uff1a\n::\n\n   # \u67e5\u770b\u5e93\u7248\u672c\n   ayuge version\n\n   # \u521b\u5efa\u9879\u76ee\n   ayuge startproject <project_name>\n\n   # \u8fdb\u5165\u9879\u76ee\u6839\u76ee\u5f55\n   cd <project_name>\n\n   # \u66ff\u6362(\u8986\u76d6)\u4e3a\u771f\u5b9e\u7684\u914d\u7f6e .conf \u6587\u4ef6\uff1a\n   # \u8fd9\u91cc\u662f\u4e3a\u4e86\u6f14\u793a\u65b9\u4fbf\uff0c\u6b63\u5e38\u60c5\u51b5\u662f\u76f4\u63a5\u5728 VIT \u4e2d\u7684 .conf \u6587\u4ef6\u586b\u4e0a\u4f60\u9700\u8981\u7684\u914d\u7f6e\u5373\u53ef\n   cp /root/mytemp/.conf DemoSpider/VIT/.conf\n\n   # \u751f\u6210\u722c\u866b\u811a\u672c\n   ayuge genspider <spider_name> <example.com>\n\n   # \u8fd0\u884c\u811a\u672c\n   scrapy crawl <spider_name>\n   # \u6ce8\uff1a\u4e5f\u53ef\u4ee5\u4f7f\u7528 ayuge crawl <spider_name>\n\n\u5177\u4f53\u7684\u573a\u666f\u6848\u4f8b\u8bf7\u5728 `DemoSpider`_ \u9879\u76ee\u4e2d\u67e5\u770b\uff0c\u4e5f\u53ef\u4ee5\u5728 `readthedocs`_ \u6587\u6863\u4e2d\u67e5\u770b\u6559\u7a0b\u3002\u76ee\u524d\u5df2\u9002\u914d\u4ee5\u4e0b\u573a\u666f\uff1a\n::\n\n   + 0).\u4ee5\u4e0b\u573a\u666f\u5168\u652f\u6301\u4ece nacos \u6216 consul \u4e2d\u83b7\u53d6\u914d\u7f6e\uff0c\u4e0d\u4e00\u4e00\u4e3e\u4f8b\u3002\n\n   # \u6570\u636e\u5b58\u5165 Mysql \u7684\u573a\u666f\uff1a\n   + 1).demo_one: \u4ece .conf \u4e2d\u83b7\u53d6 mysql \u914d\u7f6e\n   + 3).demo_three: \u4ece consul \u4e2d\u83b7\u53d6 mysql \u914d\u7f6e\n   + 21).demo_mysql_nacos: \u4ece nacos \u4e2d\u83b7\u53d6 mysql \u914d\u7f6e\n   + 5).demo_five: Twisted \u5f02\u6b65\u5b58\u50a8\u793a\u4f8b\n   + 24).demo_aiomysql: \u7ed3\u5408 aiomysql \u5b9e\u73b0\u7684 asyncio \u5f02\u6b65\u5b58\u50a8\u793a\u4f8b\n   + 13).demo_AyuTurboMysqlPipeline: mysql \u540c\u6b65\u8fde\u63a5\u6c60\u7684\u793a\u4f8b\n\n   # \u6570\u636e\u5b58\u5165 MongoDB \u7684\u573a\u666f\uff1a\n   + 2).demo_two: \u4ece .conf \u4e2d\u83b7\u53d6 mongodb \u914d\u7f6e\n   + 4).demo_four: \u4ece consul \u4e2d\u83b7\u53d6 mongodb \u914d\u7f6e\n   + 6).demo_six: Twisted \u5f02\u6b65\u5b58\u50a8\u793a\u4f8b\n   + 17).demo_mongo_async: \u7ed3\u5408 motor \u5b9e\u73b0\u7684 asyncio \u5f02\u6b65\u5b58\u50a8\u793a\u4f8b\n\n   # \u6570\u636e\u5b58\u5165 PostgreSQL \u7684\u573a\u666f(\u9700\u8981\u5b89\u88c5 ayugespidertools[database])\n   + 22).demo_nine: \u4ece .conf \u4e2d\u83b7\u53d6 postgresql \u914d\u7f6e\n   + 23).demo_ten: Twisted \u5f02\u6b65\u5b58\u50a8\u793a\u4f8b\n   + 27).demo_eleven: asyncio \u5f02\u6b65\u5b58\u50a8\u793a\u4f8b\n\n   # \u6570\u636e\u5b58\u5165 ElasticSearch \u7684\u573a\u666f(\u9700\u8981\u5b89\u88c5 ayugespidertools[database])\n   + 28).demo_es: \u666e\u901a\u540c\u6b65\u5b58\u50a8\u793a\u4f8b\n   + 29).demo_es_async: asyncio \u5f02\u6b65\u5b58\u50a8\u793a\u4f8b\n\n   # \u6570\u636e\u5b58\u5165 Oracle \u7684\u573a\u666f(\u9700\u8981\u5b89\u88c5 ayugespidertools[database])\n   + 25). demo_oracle: \u666e\u901a\u540c\u6b65\u5b58\u50a8\u793a\u4f8b\n   + 26). demo_oracle_twisted: Twisted \u5f02\u6b65\u5b58\u50a8\u793a\u4f8b\n\n   - 7).demo_seven: \u4f7f\u7528 requests \u6765\u8bf7\u6c42\u7684\u573a\u666f(\u5df2\u5220\u9664\uff0c\u66f4\u63a8\u8350 aiohttp \u65b9\u5f0f)\n   + 8).demo_eight: \u540c\u65f6\u5b58\u5165 Mysql \u548c MongoDB \u7684\u573a\u666f\n   + 9).demo_aiohttp_example: \u4f7f\u7528 aiohttp \u6765\u8bf7\u6c42\u7684\u573a\u666f\n   + 10).demo_aiohttp_test: scrapy aiohttp \u5728\u5177\u4f53\u9879\u76ee\u4e2d\u7684\u4f7f\u7528\u65b9\u6cd5\u793a\u4f8b\n\n   + 11).demo_proxy_one: \u5feb\u4ee3\u7406\u52a8\u6001\u96a7\u9053\u4ee3\u7406\u793a\u4f8b\n   + 12).demo_proxy_two: \u6d4b\u8bd5\u5feb\u4ee3\u7406\u72ec\u4eab\u4ee3\u7406\n   + 14).demo_crawl: \u652f\u6301 scrapy CrawlSpider \u7684\u793a\u4f8b\n\n   # \u672c\u5e93\u4e2d\u7ed9\u51fa\u652f\u6301 Item Loaders \u7279\u6027\u7684\u793a\u4f8b\n   + 15).demo_item_loader: \u672c\u5e93\u4e2d\u4f7f\u7528 Item Loaders \u7684\u793a\u4f8b\n   - 16).demo_item_loader_two: \u5df2\u5220\u9664\uff0c\u53ef\u67e5\u770b demo_item_loader\uff0c\u53ef\u65b9\u4fbf\u7684\u4f7f\u7528 Item Loaders \u4e86\n\n   + 18).demo_mq: \u6570\u636e\u5b58\u5165 rabbitmq \u7684\u6a21\u677f\u793a\u4f8b\n   + 35).demo_mq_async: \u6570\u636e\u5b58\u5165 rabbitmq \u7684\u5f02\u6b65\u6a21\u677f\u793a\u4f8b\n   + 19).demo_kafka: \u6570\u636e\u5b58\u5165 kafka \u7684\u6a21\u677f\u793a\u4f8b\n   + 20).demo_file: \u4f7f\u7528\u672c\u5e93 pipeline \u4e0b\u8f7d\u56fe\u7247\u7b49\u6587\u4ef6\u5230\u672c\u5730\u7684\u793a\u4f8b\n   + 30).demo_file_sec: \u81ea\u884c\u5b9e\u73b0\u7684\u56fe\u7247\u4e0b\u8f7d\u793a\u4f8b\n   + 31).demo_oss: \u4f7f\u7528\u672c\u5e93 pipeline \u4e0a\u4f20\u5230 oss \u7684\u793a\u4f8b\n   + 32).demo_oss_sec: \u81ea\u884c\u5b9e\u73b0\u7684 oss \u4e0a\u4f20\u793a\u4f8b\n   + 33).demo_oss_super: MongoDB \u5b58\u50a8\u573a\u666f oss \u4e0a\u4f20\u5b57\u6bb5\u652f\u6301\u5217\u8868\u7c7b\u578b\n   + 34).demo_conf: \u652f\u6301\u4ece .conf \u4e2d\u83b7\u53d6\u81ea\u5b9a\u4e49\u914d\u7f6e\n\n\u8d85\u7ea7\u68d2\u7684\u793a\u4f8b\n==============\n\n\u7b80\u5355\u3001\u5feb\u901f\u3001\u4f18\u96c5\u5730\u5b9e\u73b0\u5206\u5e03\u5f0f\u5f00\u53d1\uff0c\u90e8\u7f72\u53ca\u8fd0\u884c\u7684\u793a\u4f8b\uff1ademo_s\uff0c\u5177\u4f53\u4ecb\u7ecd\u8bf7\u5728 `DemoSpider`_ \u9879\u76ee\u4e2d\u67e5\u770b\uff0c\u8fd0\\\n\u884c\u793a\u4f8b\u56fe\u4e3a\uff1a\n\n.. image:: https://raw.githubusercontent.com/shengchenyang/AyugeSpiderTools/master/examples/ayugespidertools-async-demo.png\n   :alt: async-demo\n\n\u8dd1\u901a\u6d4b\u8bd5\n==========\n\n\u524d\u63d0\uff1a\u9700\u8981\u5728 tests \u7684 VIT \u76ee\u5f55\u4e0b\u521b\u5efa .conf \u6587\u4ef6\uff0c\u5df2\u7ed9\u51fa\u793a\u4f8b\u6587\u4ef6\uff0c\u8bf7\u586b\u5199\u6d4b\u8bd5\u6240\u9700\u5185\u5bb9\uff0c\u7136\u540e\uff1a\n\n- \u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528 tox \u6765\u8fd0\u884c\u6d4b\u8bd5\u3002\n- \u672c\u5e93\u4ee5 `poetry`_ \u5f00\u53d1\uff0c\u90a3\u4e48\u76f4\u63a5\u65b0\u73af\u5883\u4e0b\u8fd0\u884c poetry install \u540e\uff0c\u624b\u52a8\u8fd0\u884c\u76ee\u6807\u6d4b\u8bd5\u6216 pytest \u547d\u4ee4\u6765\u6d4b\\\n  \u8bd5\u7b49\u7686\u53ef\u3002\n- \u4e5f\u53ef\u4ee5\u4f7f\u7528 make \u5de5\u5177\uff0cmake start \u7136\u540e make test \u5373\u53ef\u3002\n\n\u4f60\u53ef\u80fd\u5728\u610f\u7684\u4e8b\n===============\n\n1. \u82e5\u4f60\u89c9\u5f97\u67d0\u4e9b\u573a\u666f\u4e0b\u7684\u529f\u80fd\u5b9e\u73b0\u4e0d\u592a\u7b26\u5408\u4f60\u7684\u9884\u671f\uff0c\u60f3\u8981\u4fee\u6539\u6216\u6dfb\u52a0\u81ea\u5b9a\u4e49\u529f\u80fd\uff0c\u6bd4\u5982\u79fb\u9664\u5bf9\u4f60\u65e0\u7528\u6a21\u5757\u3001\u4fee\u6539\u5e93\u540d\\\n   \u7b49\uff0c\u4f60\u53ef\u4ee5\u81ea\u884c\u4fee\u6539\u540e build\u3002\n\n2. \u672c\u5e93\u4e3b\u63a8 scrapy \u6269\u5c55\u529f\u80fd\uff0c\u5728\u4f7f\u7528\u672c\u5e93\u65f6\uff0c\u4e0d\u4f1a\u5f71\u54cd\u4f60 scrapy \u9879\u76ee\u53ca\u5176\u5b83\u7ec4\u4ef6\u3002\n\n   \u4e5f\u5c31\u662f\u8bf4\uff0c\u53ef\u4f7f\u7528\u672c\u5e93\u5f00\u53d1\u539f\u751f\u7684 scrapy\uff0c\u4e5f\u53ef\u7528 scrapy \u7684\u98ce\u683c\u6765\u5f00\u53d1\uff0c\u4f46\u8fd8\u662f\u63a8\u8350\u4f7f\u7528 `DemoSpider`_ \\\n   \u793a\u4f8b\u4e2d\u7684\u98ce\u683c\u5f00\u53d1\u3002\u4e0d\u4f1a\u5bf9\u5f00\u53d1\u8005\u9020\u6210\u8fc7\u591a\u7684\u8fc1\u79fb\u6210\u672c\u3002\n\n3. item \u4e2d (\u5a92\u4f53)\u8d44\u6e90\u5b57\u6bb5\u7684\u5b58\u50a8\u9700\u6c42\u8f83\u590d\u6742\uff1f\u6bd4\u5982\u4e0a\u4f20\u5230 oss \u529f\u80fd\u9700\u8981\u66f4\u7ec6\u5206\u7684\u9700\u6c42\uff0c\u6216\u8005\u6709\u5176\u5b83\u66f4\u591a\u7c7b\u578b\u7684\u5bf9\\\n   \u8c61\u4e91\u5b58\u50a8\u7684\u9700\u8981\uff0c\u6211\u8be5\u600e\u4e48\u65b9\u4fbf\u5730\u5b9e\u73b0\uff1f\n\n   1. \u5982\u679c\u4f60\u6bd4\u8f83\u4e86\u89e3\u672c\u9879\u76ee\u548c poetry \u6253\u5305\u6784\u5efa\u7684\u6d41\u7a0b\uff0c\u90a3\u4e48\u63a8\u8350\u4f60\u6309\u7167\u9879\u76ee\u793a\u4f8b\u98ce\u683c\u5c06\u9700\u8981\u529f\u80fd\u6dfb\u52a0\u540e\u81ea\u884c\u6253\u5305\u5e76\\\n      \u5b89\u88c5\uff0c\u6bd4\u8f83\u65b9\u4fbf\u540e\u7eed\u4f7f\u7528\uff1b\n   2. \u56e0\u4e3a\u672c\u8eab\u5c31\u662f scrapy \u9879\u76ee\uff0c\u6240\u4ee5\u66f4\u63a8\u8350\u4f7f\u7528\u666e\u901a\u5b58\u50a8\u573a\u666f\u7ed3\u5408\u81ea\u5df1\u7f16\u5199\u7684 scrapy pipeline \u6765\u5bf9 item \\\n      \u4e2d\u7684\u8d44\u6e90\u4e0a\u4f20\u5b57\u6bb5\u8fdb\u884c\u4e2a\u6027\u5316\u5904\u7406\uff0c\u8fbe\u5230\u5373\u4fdd\u7559\u4e86\u6b64\u5e93\u7684\u901a\u7528\u548c\u4fbf\u6377\uff0c\u4e5f\u5b9e\u73b0\u4e86\u7075\u6d3b\u6027\u3002\n\n4. \u4ee3\u7801\u6d4b\u8bd5\u8986\u76d6\u7387\u6709\u70b9\u4f4e\uff0c\u8003\u8651\u589e\u52a0\u5417\uff1f\n\n   \u4e0d\u8003\u8651\uff0c\u573a\u666f\u6240\u4f9d\u8d56\u670d\u52a1\u592a\u591a\uff0c\u4e14\u4e91\u670d\u52a1\u7b49\u5176\u5b83\u56e0\u7d20\u5bfc\u81f4\u4e2a\u4eba\u7ef4\u62a4\u6210\u672c\u8fc7\u9ad8\uff0c\u4f46\u4e0d\u5fc5\u62c5\u5fc3\uff0c\u6211\u4f1a\u548c\u672c\u5730\u670d\u52a1\u7684\u81ea\u52a8\u5316\\\n   \u6d4b\u8bd5\u7ed3\u5408\u4f7f\u7528\u3002\n\n\u6784\u5efa\u4f60\u7684\u4e13\u5c5e\u5e93\n===============\n\n   \u5177\u4f53\u5185\u5bb9\u8bf7\u4ee5 `poetry`_ \u5b98\u65b9\u6587\u6863\u4e3a\u51c6\u3002\n\n\u636e `\u4f60\u53ef\u80fd\u5728\u610f\u7684\u4e8b`_ \u53ef\u77e5\uff0c\u4f60\u53ef\u4ee5 clone \u6e90\u7801\u540e\uff0c\u4fee\u6539\u4efb\u610f\u65b9\u6cd5\uff08\u6bd4\u5982\u4f60\u7684\u9879\u76ee\u573a\u666f\u4e0b\u53ef\u80fd\u9700\u8981\u5176\u5b83\u7684\u65e5\u5fd7\u914d\u7f6e\u9ed8\\\n\u8ba4\u503c\uff0c\u6216\u6dfb\u52a0\u5176\u5b83\u7684\u9879\u76ee\u7ed3\u6784\u6a21\u677f\u7b49\uff09\uff0c\u4fee\u6539\u5b8c\u6210\u540e poetry build \u6216 make build \u5373\u53ef\u6253\u5305\u4f7f\u7528\u3002\n\n\u6bd4\u5982\u4f60\u53ef\u80fd\u9700\u8981\u66f4\u65b0\u4f9d\u8d56\u5e93\u4e2d kafka-python \u4e3a\u65b0\u7248\u672c x.x.x\uff0c\u90a3\u53ea\u9700 poetry install \u5b89\u88c5\u73b0\u6709\u4f9d\u8d56\u540e\uff0c\u518d\\\npoetry add kafka-python==x.x.x \u5b89\u88c5\u76ee\u6807\u7248\u672c\uff08\u5c3d\u91cf\u4e0d\u8981\u4f7f\u7528 poetry update kafka-python\uff09\uff0c\u786e\u5b9a\u6d4b\\\n\u8bd5\u6b63\u5e38\u4e86\u5373\u53ef poetry build \u6253\u5305\u4f7f\u7528\u3002\n\n   \u5176\u5b83\u81ea\u5b9a\u4e49 scrapy \u9879\u76ee\u7684\u65b9\u5f0f\n\n\u4e5f\u53ef\u4ee5\u901a\u8fc7 cookiecutter \u5bf9\u9879\u76ee\u4e2a\u6027\u5316\u5b9a\u5236\uff0c\u53ef\u53c2\u8003 `LazyScraper`_ \u9879\u76ee\u3002\n\n**\u5e0c\u671b\u6b64\u9879\u76ee\u80fd\u5728\u4f60\u9047\u5230\u6269\u5c55 scrapy \u529f\u80fd\u7684\u573a\u666f\u65f6\u5bf9\u4f60\u6709\u6240\u6307\u5f15\u3002**\n\n\u529f\u80fd\n=======\n\n- [\u2713] scrapy \u7684\u6269\u5c55\u529f\u80fd\u573a\u666f\n\n  - [\u2713] scrapy \u811a\u672c\u8fd0\u884c\u4fe1\u606f\u7edf\u8ba1\u548c\u9879\u76ee\u4f9d\u8d56\u8868\u91c7\u96c6\u91cf\u7edf\u8ba1\uff0c\u53ef\u7528\u4e8e\u65e5\u5fd7\u8bb0\u5f55\u548c\u9884\u8b66\n  - [\u2713] \u81ea\u5b9a\u4e49\u6a21\u677f\uff0c\u5728 ayuge startproject <projname> \u548c ayuge genspider <spidername> \u65f6\u751f\u6210\u9002\\\n    \u5408\u672c\u5e93\u7684\u6a21\u677f\u6587\u4ef6\n  - [\u2713] \u4ece\u8fdc\u7a0b\u5e94\u7528\u7ba1\u7406\u670d\u52a1\u4e2d\u83b7\u53d6\u9879\u76ee\u914d\u7f6e\n\n    - [\u2713] \u4ece consul \u83b7\u53d6\u9879\u76ee\u914d\u7f6e\n    - [\u2713] \u4ece nacos \u83b7\u53d6\u9879\u76ee\u914d\u7f6e\uff08\u6ce8\u610f\uff1a\u4f18\u5148\u7ea7\u5c0f\u4e8e consul\uff09\n  - [\u2713] \u4ee3\u7406\u4e2d\u95f4\u4ef6\uff08\u72ec\u4eab\u4ee3\u7406\u3001\u52a8\u6001\u96a7\u9053\u4ee3\u7406\uff09\n  - [\u2713] \u968f\u673a\u8bf7\u6c42\u5934 UA \u4e2d\u95f4\u4ef6\uff0c\u6839\u636e fake_useragent \u4e2d\u7684\u6743\u91cd\u6765\u968f\u673a\n  - [\u2713] \u4f7f\u7528\u4ee5\u4e0b\u5de5\u5177\u6765\u66ff\u6362 scrapy \u7684 Request \u6765\u53d1\u9001\u8bf7\u6c42\n\n    - [\u2713] requests: \u8fd9\u4e2a\u4e0d\u63a8\u8350\u4f7f\u7528\uff0crequests \u540c\u6b65\u5e93\u4f1a\u964d\u4f4e scrapy \u8fd0\u884c\u6548\u7387\\\n      \uff08\u5df2\u79fb\u9664\u6b64\u529f\u80fd\uff0c\u66f4\u63a8\u8350 aiohttp \u7684\u65b9\u5f0f\uff09\n    - [\u2713] aiohttp: \u96c6\u6210\u5c06 scrapy Request \u66ff\u6362\u4e3a aiohttp \u7684\u534f\u7a0b\u65b9\u5f0f\n  - [\u2713] Mysql \u5b58\u50a8\u7684\u573a\u666f\u4e0b\u9002\u914d\n\n    - [\u2713] \u81ea\u52a8\u521b\u5efa Mysql \u7528\u6237\u573a\u666f\u4e0b\u9700\u8981\u7684\u6570\u636e\u5e93\u548c\u6570\u636e\u8868\u53ca\u5b57\u6bb5\u683c\u5f0f\uff0c\u8fd8\u6709\u5b57\u6bb5\u6ce8\u91ca\n  - [\u2713] MongoDB \u5b58\u50a8\u573a\u666f\u9002\u914d\n  - [\u2713] PostgreSQL \u5b58\u50a8\u573a\u666f\u9002\u914d\n  - [\u2713] ElasticSearch \u5b58\u50a8\u573a\u666f\u9002\u914d\n  - [\u2713] Oracle \u5b58\u50a8\u573a\u666f\u9002\u914d\n  - [\u2713] oss \u4e0a\u4f20\u573a\u666f\u9002\u914d\n  - [\u2713] asyncio \u8bed\u6cd5\u652f\u6301\u4e0e async \u7b2c\u4e09\u65b9\u5e93\u652f\u6301\u793a\u4f8b\n\n    - [\u2713] spider \u4e2d\u4f7f\u7528 asyncio \u7684 aiohttp \u793a\u4f8b\n    - [\u2713] pipeline \u4e2d\u4f7f\u7528 asyncio \u7684 aioMysql \u793a\u4f8b\n  - [\u2713] \u96c6\u6210 Kafka\uff0cRabbitMQ \u7b49\u6570\u636e\u63a8\u9001\u529f\u80fd\n- [\u2713] \u5e38\u7528\u5f00\u53d1\u573a\u666f\n\n  - [\u2713] sql \u8bed\u53e5\u62fc\u63a5\uff0c\u53ea\u7528\u4e8e\u7b80\u5355\u573a\u666f\u3002\n  - [\u2713] \u6570\u636e\u683c\u5f0f\u5316\u5904\u7406\uff0c\u6bd4\u5982\uff1a\u53bb\u9664\u7f51\u9875\u6807\u7b7e\uff0c\u53bb\u9664\u65e0\u6548\u7a7a\u683c\u7b49\n  - [\u2713] \u5b57\u4f53\u53cd\u722c\u8fd8\u539f\u65b9\u6cd5\n\n    - [\u2713] \u57fa\u4e8e ttf\uff0cwoff \u4e4b\u7c7b\u7684\u5b57\u4f53\u6587\u4ef6\u6620\u5c04\uff0c\u6216\u7ed3\u5408 css \u7b49\u5b9e\u73b0\n\n      - [\u2713] \u53ef\u4ee5\u76f4\u63a5\u5728\u5b57\u4f53\u6587\u4ef6 xml \u4e2d\u627e\u5230\u6620\u5c04\u5173\u7cfb\u7684\uff1a\u4f7f\u7528 `fontforge`_ \u5de5\u5177\u5bfc\u51fa\u6620\u5c04\u5373\u53ef\u3002\n      - [\u2713] \u65e0\u6cd5\u627e\u5230\u6620\u5c04\u5173\u7cfb\u7684\uff0c\u5219\u4e00\u822c\u4f7f\u7528 ocr \u8bc6\u522b\uff08\u51c6\u786e\u7387\u975e\u767e\u5206\u767e\uff09\uff0c\u901a\u8fc7 fontforge \u5bfc\u51fa\u6bcf\u4e2a\u6620\u5c04\u7684\\\n        png\uff0c\u540e\u518d\u901a\u8fc7\u5404\u79cd\u65b9\u5f0f\u8bc6\u522b\u3002\n    - [\u2713] \u5b57\u4f53\u53cd\u722c\u90e8\u5206\u529f\u80fd\u8fc1\u79fb\u5230 FontMapster \u9879\u76ee\u4e2d\u3002\n  - [\u2713] html \u6570\u636e\u5904\u7406\uff0c\u53bb\u9664\u6807\u7b7e\uff0c\u4e0d\u53ef\u89c1\u5b57\u7b26\uff0c\u7279\u6b8a\u5b57\u7b26\u6539\u6210\u6b63\u5e38\u663e\u793a\u7b49\n  - [\u2713] \u6dfb\u52a0\u5e38\u7528\u7684\u56fe\u7247\u9a8c\u8bc1\u7801\u4e2d\u7684\u5904\u7406\u65b9\u6cd5\n\n    - [\u2713] \u6ed1\u5757\u7f3a\u53e3\u8ddd\u79bb\u7684\u8bc6\u522b\u65b9\u6cd5\uff08\u591a\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff09\n    - [\u2713] \u6839\u636e\u6ed1\u5757\u8ddd\u79bb\u751f\u6210\u8f68\u8ff9\u6570\u7ec4\u7684\u65b9\u6cd5\n    - [\u2713] \u8bc6\u522b\u70b9\u9009\u9a8c\u8bc1\u7801\u4f4d\u7f6e\u53ca\u70b9\u51fb\u987a\u5e8f\n    - [\u2713] \u56fe\u7247\u4e71\u5e8f\u6df7\u6dc6\u7684\u8fd8\u539f\u65b9\u6cd5\u793a\u4f8b\n\n\u6ce8\u610f\uff1a\u529f\u80fd\u6f14\u793a\u6211\u5c06\u653e\u5165 `readthedocs`_ \u6587\u6863\u4e2d\uff0c\u4ee5\u9632\u6b64\u90e8\u5206\u5185\u5bb9\u8fc7\u591a\u3002\n\n\u611f\u8c22\n=======\n\n- `scrapy`_\n\n\u8d5e\u52a9\n=======\n\n\u5982\u679c\u6b64\u9879\u76ee\u5bf9\u4f60\u6709\u6240\u5e2e\u52a9\uff0c\u53ef\u4ee5\u9009\u62e9\u6253\u8d4f\u4f5c\u8005\u3002\n\n.. image:: https://github.com/shengchenyang/AyugeSpiderTools/raw/master/artwork/ayugespidertools-donating.jpg\n   :alt: \u5fae\u4fe1\u8d5e\u8d4f\u7801\n   :width: 280\n\n.. _English: https://github.com/shengchenyang/AyugeSpiderTools/blob/master/README_en.rst\n.. _\u5b89\u88c5\u6307\u5357: https://ayugespidertools.readthedocs.io/en/latest/intro/install.html\n.. _DemoSpider: https://github.com/shengchenyang/DemoSpider\n.. _readthedocs: https://ayugespidertools.readthedocs.io/en/latest/\n.. _poetry: https://python-poetry.org/docs/\n.. _LazyScraper: https://github.com/shengchenyang/LazyScraper\n.. _fontforge: https://github.com/fontforge/fontforge/releases\n.. _scrapy: https://github.com/scrapy/scrapy\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "scrapy \u6269\u5c55\u5e93\uff1a\u7528\u4e8e\u6269\u5c55 Scrapy \u529f\u80fd\u6765\u89e3\u653e\u53cc\u624b\u3002",
    "version": "3.13.0",
    "project_urls": {
        "Documentation": "https://ayugespidertools.readthedocs.io/en/latest/",
        "Homepage": "https://www.ayuge.top/mkdocs-material/",
        "Repository": "https://github.com/shengchenyang/AyugeSpiderTools"
    },
    "split_keywords": [
        "crawler",
        " scraping",
        " scrapy-extension"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b72f2128341eab98ef2f9c4eb7e02ebf03c0db680f7d52a722e5c73c5e86e9a6",
                "md5": "21b5964ec7051f6a0e893702541fd4e1",
                "sha256": "d8d44b4d669385b4e74f588fd72e1b93e940a1cc51693f1ec0b74e6622601428"
            },
            "downloads": -1,
            "filename": "ayugespidertools-3.13.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "21b5964ec7051f6a0e893702541fd4e1",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 118766,
            "upload_time": "2025-08-24T16:10:40",
            "upload_time_iso_8601": "2025-08-24T16:10:40.644433Z",
            "url": "https://files.pythonhosted.org/packages/b7/2f/2128341eab98ef2f9c4eb7e02ebf03c0db680f7d52a722e5c73c5e86e9a6/ayugespidertools-3.13.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "968d87e075b75a39df80a2f6242b301b6a2ebc72a990ab0462776ee226a45a03",
                "md5": "33db8c7dafae019b9e3dff8e3248e8eb",
                "sha256": "c417c8d1de595752b0bed000876ff94dc930e83773428f45d96f06c8cc48f99d"
            },
            "downloads": -1,
            "filename": "ayugespidertools-3.13.0.tar.gz",
            "has_sig": false,
            "md5_digest": "33db8c7dafae019b9e3dff8e3248e8eb",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 83751,
            "upload_time": "2025-08-24T16:10:42",
            "upload_time_iso_8601": "2025-08-24T16:10:42.493163Z",
            "url": "https://files.pythonhosted.org/packages/96/8d/87e075b75a39df80a2f6242b301b6a2ebc72a990ab0462776ee226a45a03/ayugespidertools-3.13.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-24 16:10:42",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "shengchenyang",
    "github_project": "AyugeSpiderTools",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "tox": true,
    "lcname": "ayugespidertools"
}
        
Elapsed time: 2.65854s