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