datasette-block-robots 作者 simonw

点赞

README 源代码

datasette-block-robots

PyPI Changelog License

Datasette 插件,使用 robots.txt 阻止机器人和爬虫

安装

在与 Datasette 相同的环境中安装此插件。

$ pip install datasette-block-robots

用法

安装插件后,您的 Datasette 实例上的 /robots.txt 将返回以下内容

User-agent: *
Disallow: /

这将请求所有机器人和爬虫不要访问您网站上的任何页面。

这是一个插件实际运行的演示:https://sqlite-generate-demo.datasette.io/robots.txt

配置

默认情况下,插件将使用 Disallow: / 阻止对网站的所有访问。

如果您希望搜索引擎索引首页,而不爬取数据库、表格或行页面本身,您可以使用以下配置

{
    "plugins": {
        "datasette-block-robots": {
            "allow_only_index": true
        }
    }
}

这将返回一个类似这样的 /robots.txt

User-agent: *
Disallow: /db1
Disallow: /db2

为每个附加的数据库添加一条 Disallow 行。

要使用自定义路径阻止访问网站的特定区域,请将其添加到您的 metadata.json 配置文件中

{
    "plugins": {
        "datasette-block-robots": {
            "disallow": ["/mydatabase/mytable"]
        }
    }
}

这将生成一个看起来像这样的 /robots.txt

User-agent: *
Disallow: /mydatabase/mytable

或者,您可以使用 literal 配置选项设置 robots.txt 文件的全部内容。如果您使用 YAML 而非 JSON 并且有 metadata.yml 文件,可以这样做

plugins:
    datasette-block-robots:
        literal: |-
            User-agent: *
            Disallow: /
            User-agent: Bingbot
            User-agent: Googlebot
            Disallow:

此示例将阻止所有爬虫,但 Googlebot 和 Bingbot 除外,它们被允许爬取整个网站。

与其他插件配合使用

此插件向 Datasette 添加了一个新的插件钩子,名为 block_robots_extra_lines(),其他插件可以使用它来向 robots.txt 文件添加额外的行。

该钩子可以选择接受以下参数

  • datasette: 当前的 Datasette 实例。您可以使用它执行 SQL 查询或读取插件配置设置。
  • request: 表示对 /robots.txt 的传入请求的 Request 对象

钩子应返回一个字符串列表,每个字符串代表要添加到 robots.txt 文件中的一行。

它也可以返回一个 async def 函数,该函数将被等待并用于生成行列表。如果您需要在钩子实现中进行 await 调用,请使用此选项。

此示例使用钩子向 robots.txt 文件添加 Sitemap: http://example.com/sitemap.xml

from datasette import hookimpl

@hookimpl
def block_robots_extra_lines(datasette, request):
    return [
        "Sitemap: {}".format(datasette.absolute_url(request, "/sitemap.xml")),
    ]

此示例根据数据库查询阻止访问路径

@hookimpl
def block_robots_extra_lines(datasette):
    async def inner():
        db = datasette.get_database()
        result = await db.execute("select path from mytable")
        return [
            "Disallow: /{}".format(row["path"]) for row in result
        ]
    return inner

datasette-sitemap 是使用此钩子的一个插件示例。

开发

要在本地设置此插件,请首先检出代码。然后创建一个新的虚拟环境

cd datasette-block-robots
python3 -mvenv venv
source venv/bin/activate

或者如果您正在使用 pipenv

pipenv shell

现在安装依赖项和测试

pip install -e '.[test]'

运行测试

pytest