darc - 暗网爬虫项目如需任何技术和/或维护信息, 请参阅 |docs|_。
.. |docs| replace:: 官方文档 .. _docs: https://darc.jarryshaw.me
注意:从 1.0.0 版本开始,本项目的新功能将不再
在此公开仓库中开发。更新和新版本中仅会应用
缺陷修复和安全补丁。
darc 被设计为暗网爬取的瑞士军刀。
它集成了 requests 以收集 HTTP 请求和响应
信息,例如 cookie、头字段等。它还捆绑了
selenium 以提供完整渲染的网页及该视图的
截图。
.. image:: https://darc.jarryshaw.me/en/latest/_images/darc.jpeg
darc 的总体流程可描述如下:
worker 有两种类型:
crawler -- 运行 darc.crawl.crawler 以提供
链接的最新视图并测试其可连接性
loader -- 运行 darc.crawl.loader 以提供
链接的深入视图并提供更多可视化信息
对于 crawler 类型的 worker,总体流程可描述如下:
darc.process.process_crawler:从 requests
链接数据库获取 URL(参见 darc.db.load_requests),并将这些 URL 提供给
darc.crawl.crawler。
注意:
如果 darc.const.FLAG_MP 为 True,该函数将以
多进程 支持方式调用;如果 darc.const.FLAG_TH
为 True,该函数将以 多线程
支持方式调用;若两者皆否,该函数将以单线程方式调用。
darc.crawl.crawler:使用
darc.link.parse_link 解析 URL,并检查是否需要爬取
该 URL(参见 darc.const.PROXY_WHITE_LIST、darc.const.PROXY_BLACK_LIST、
darc.const.LINK_WHITE_LIST 和 darc.const.LINK_BLACK_LIST);
若需要,则使用 requests 爬取该 URL。
如果该 URL 来自一个全新的主机,darc 将首先尝试
获取并保存该主机的 robots.txt 和站点地图
(参见 darc.proxy.null.save_robots 和 darc.proxy.null.save_sitemap),
然后从站点地图中提取链接并保存(参见 darc.proxy.null.read_sitemap)
到链接数据库中,以供后续爬取(参见 darc.db.save_requests)。
此外,如果提供了提交 API,将调用 darc.submit.submit_new_host
并提交刚刚获取的文档。
如果存在 robots.txt,且 darc.const.FORCE 为
False,darc 将检查是否允许爬取该 URL。
注意:
根路径(例如 https://www.example.com/ 中的 /)将始终
被爬取,忽略 robots.txt。
此时,darc 将调用 darc.sites 中的自定义钩子函数
进行爬取并获取最终响应对象。
darc 将使用 darc.save.save_headers 保存会话 cookie 和
头信息。
注意:
如果引发 requests.exceptions.InvalidSchema,该链接
将由 darc.proxy.null.save_invalid 保存。后续
处理将被放弃。
如果响应文档的内容类型未被忽略(参见
darc.const.MIME_WHITE_LIST 和 darc.const.MIME_BLACK_LIST),
将调用 darc.submit.submit_requests 并提交刚刚获取的
文档。
如果响应文档为 HTML(text/html 和 application/xhtml+xml),
将调用 darc.parse.extract_links 以从 HTML 文档中提取所有可能的
链接,并将这些链接保存到数据库
(参见 darc.db.save_requests)。
并且如果响应状态码介于 400 和 600 之间,
该 URL 将被保存回链接数据库
(参见 darc.db.save_requests)。如果不是,该 URL 将被
保存到 selenium 链接数据库以继续后续步骤
(参见 darc.db.save_selenium)。
对于 loader 类型的 workers,一般流程可以描述如下:
darc.process.process_loader:与此同时,darc 会
从 selenium 链接数据库(参见 darc.db.load_selenium)中
获取 URL,并将这些 URL 提供给 darc.crawl.loader。
注意:
如果 darc.const.FLAG_MP 为 True,该函数将以
多进程 支持方式调用;如果 darc.const.FLAG_TH
为 True,该函数将以 多线程
支持方式调用;如果两者均未启用,该函数将以单线程方式调用。
darc.crawl.loader:使用
darc.link.parse_link 解析 URL,并使用
selenium 配合 Google Chrome 开始加载该 URL。
此时,darc 会调用 darc.sites 中的自定义钩子函数,
以加载并返回原始的
selenium.webdriver.chrome.webdriver.WebDriver 对象。
如果成功,渲染后的源 HTML 文档将被保存,并且会截取 整页截图并保存。
如果提供了提交 API,则会调用 darc.submit.submit_selenium
并提交刚刚加载的文档。
随后,将调用 darc.parse.extract_links,
从 HTML 文档中提取所有可能的链接,并将这些
链接保存到 requests 数据库(参见 darc.db.save_requests)。
注意:
darc 支持 3.6 及以上的所有 Python 版本。
目前,它仅支持并在 Linux(Ubuntu 18.04)
和 macOS(Catalina)上经过测试。
在低于 3.8 的 Python 版本中安装时,darc 会
使用 |walrus|_ 自行编译,以保持向后兼容。
.. |walrus| replace:: walrus
.. _walrus: https://github.com/pybpc/walrus
.. code-block:: shell
pip install python-darc
请确保你的系统上已安装 Google Chrome 及对应版本的 Chrome Driver。
从 0.3.0 版本开始,我们引入了 Redis_ 作为任务
队列数据库后端。
.. _Redis: https://redis.io
自 0.6.0 版本起,除了 Redis_ 数据库之外,我们还引入了关系型数据库存储
(例如 MySQL、SQLite、PostgreSQL_ 等)作为任务队列数据库
后端,因为当任务队列变得非常大时,Redis_ 数据库的内存开销可能过高。
.. _MySQL: https://mysql.com/ .. _SQLite: https://www.sqlite.org/ .. _PostgreSQL: https://www.postgresql.org/
使用 darc 项目时,请确保已安装、配置并
运行其中一种后端数据库。
不过,darc 项目附带 Docker 和 Compose 支持。
请参阅项目根目录以获取相关文件和更多信息。
或者,你可以参考和/或从 Docker Hub_ 仓库安装:
.. code-block:: shell
docker pull jsnbzh/darc[:TAGNAME]
.. _Docker Hub: https://hub.docker.com/r/jsnbzh/darc
或从 GitHub Container Registry 获取更新、更全面的镜像:
.. code-block:: shell
docker pull ghcr.io/jarryshaw/darc[:TAGNAME]
docker pull ghcr.io/jarryshaw/darc-debug[:TAGNAME]
darc 项目提供了一个简单的 CLI::
usage: darc [-h] [-v] -t {crawler,loader} [-f FILE] ...
the darkweb crawling swiss army knife
positional arguments: link links to craw
optional arguments: -h, --help show this help message and exit -v, --version show program's version number and exit -t {crawler,loader}, --type {crawler,loader} type of worker process -f FILE, --file FILE read links from file
也可以通过模块入口点调用::
python -m darc ...
注意:
链接文件可以包含 注释 行,注释行应以 # 开头。
加载时会忽略空行和注释行。