裸体爬虫
裸体爬虫会爬取当天及过去N天telegra.ph上的所有页面,搜索特定关键词,检查裸体、非裸体图片和视频(不分析)的数量,并报告看起来有趣的页面(例如有超过10张裸体图片或有一个视频)
无效的有趣警告
无论你多大年龄,无论你多么宽容,无论你的性取向如何,无论你最喜欢什么样的变态行为,无论你的性视野有多广,使用NudeCrawler你都会发现很多你不喜欢的东西。
我写这个警告是因为我见过一些糟糕的东西。字面意思上的。
请仅将其用于合法和道德的目的。当然这是18+内容。
安装
推荐(也是最安全)的方法是使用docker:
mkdir /tmp/run
sudo docker run --rm -v /tmp/run:/work yaroslaff/nudecrawler nudecrawler -a Eva "Sasha Grey" "Belle Delphine" Amouranth
请看下面如何优化你的搜索和过滤。
替代安装方法
pipx install nudecrawler
或者,直接从git仓库安装:
pipx install git+https://github.com/yaroslaff/nudecrawler
在没有pipx的旧Linux系统上,你可以使用pip3(最好在虚拟环境中安装)。
启动裸体爬虫!
(我故意更改了结果中的链接,不想违反github政策)
$ nudecrawler sasha-grey
INTERESTING https://telegra.ph/sasha-grey-XXXXXXXX
裸体: 0 非裸体: 0
视频总数: 1
INTERESTING https://telegra.ph/sasha-grey-XXXXX
裸体: 9 非裸体: 6
INTERESTING https://telegra.ph/sasha-grey-XXXXX
裸体: 9 非裸体: 6
INTERESTING https://telegra.ph/sasha-grey-XXXXX
裸体: 6 非裸体: 3
默认情况下,使用内置的NudeNet检测(--detect nudenetb
)(但nudecrawler有开放架构,原生支持几种其他检测器,你也可以轻松连接到任何其他检测器)。
对于非常不耐烦的人,添加-a
(跳过裸体检测,打印所有找到的页面)和-v
(详细)选项来跳过检测。
配置文件
大多数nudecrawler选项可以从配置文件nudecrawler.toml中配置。Nudecrawler按以下位置查找配置文件(使用找到的第一个文件):
NUDECRAWLER_CONFIG
环境变量或-c
/--config
选项/work/nudecrawler.toml
(在docker容器内工作并将主机目录挂载为/work
时使用)- 当前工作目录中的
nudecrawler.toml
~/nudecrawler.toml
/etc/nudecrawler.toml
命令行给出的选项具有更高优先级。
高级用法
如何只获取最有趣的结果
Nudecrawler使用evalidate通过Python表达式(--expr
)过滤结果。使用-h
帮助将列出所有可用变量,如:total_images
, nude_images
, nonnude_images
, new_nude_images
, new_nonnude_images
, new_total_images
, total_video
。new_
变量是关于新图像的(在缓存中未找到)。例如--expr 'total_images>20 and new_nude_images>5'
将只打印超过20张图像和5张裸体图像(在缓存中未找到)的页面。这是跳过重复内容页面的好方法。
默认值:nude_images > 0
。
使用-a
/--all
尽快获取一些结果(但之后你可能想进行一些过滤)
考虑使用--days
, --total
来缩小/扩大搜索范围。
另请参阅"如何使用JSON日志文件"。
如何更快地搜索
如何更快地搜索:使用缓存
Nudecrawler使用非常简单的JSON格式缓存(有两个映射:图像URL到图像的SHA1哈希,以及哈希到判定)。有时这可以大大加快搜索速度,因为通常一些页面彼此非常相似,我们可以重用缓存中的判定,而不进行图像的繁重AI分析,有时甚至不下载图像。
配置部分
[cache]
# 缓存文件路径
cache = "/tmp/nccache.json"
cache-save = 1
cache-save
是我们应该多久将内存缓存保存到文件中。值为1时,每添加一个新文件到缓存就保存一次。对于很长时间的运行,将其设置为更高的值,如100或1000,因为保存大缓存很慢。
如何更快地搜索:对图像使用预过滤
为了加快处理速度,nudecrawler使用预过滤,对任何图像执行HTTP HEAD请求,只有当图像通过基本检查时才进行进一步处理:
- 图像URL必须返回状态200
- 如果服务器在响应头中返回Content-Length(telegra.ph使用Content-Length),它必须大于
--minsize
(minsize以Kb为单位指定,默认值为10Kb)。这可以避免我们下载/过滤图标或其他非常小的图像。
如何更快地搜索:在分析前丢弃无用页面
使用参数--total N
(部分[filter]
,选项total
)只分析有超过N张图像的页面(在预过滤阶段丢弃的图像不计数)。所以,如果total是20,那么有少于20张大图像的页面将被快速丢弃。
--max-pictures
(部分[filter]
,选项max-pictures
)将只分析前N张预过滤的图像。所以,如果一个页面有1000张图像,但max-pictures
是10,则只会分析前10张图像。(像nude_images
这样的变量永远不会高于N)
--max-errors
([filter]
部分,max-errors
选项)限制页面上的错误数量(如损坏的图片链接),如果发生N个错误,页面将被丢弃并不再进行进一步处理。
--min-content-length
([filter]
部分,max-content-length
选项)跳过内容长度太小的页面。
如何非常快速地搜索(无需检测)
如果你只想在telegra.ph中查找现有页面(不想检测那里的图片nudity或进行任何其他过滤),你可以结合使用nudecrawler-makeurls
工具和bulk-http-check
$ time nudecrawler-makeurls "sasha grey" -c 10 | bulk-http-check -n 100 |grep "200$"
https://telegra.ph/sasha-grey-01-12 OK 200
https://telegra.ph/sasha-grey-01-14 OK 200
...
https://telegra.ph/sasha-grey-12-12 OK 200
real 0m5.089s
user 0m1.079s
sys 0m0.444s
5秒内找到所有(61个)标题为"Sasha Grey"的telegra.ph页面。
长时间运行
停止/恢复
使用工作列表和--stats文件时,当前状态会定期保存到这个文件中。如果需要恢复,只需使用命令nudecrawler --resume PATH/TO/stats.json
容器中的内存泄漏(如果在docker容器中使用检测器)
你可以用sudo docker stats
或sudo docker stats --no-stream
检查容器内存使用情况。容器通常会随时间消耗越来越多的内存,最终导致内存不足。为防止这个问题,可以组合使用--stop
和--refresh
,如--stop 1000 --refresh refresh-nsfw-api.sh
,这将每1000张图片调用一次刷新脚本。刷新脚本应停止当前容器并重新启动。参见refresh-nsfw-api.sh源码示例,非常简单。安装nudecrawler python包时不会安装这个shell脚本。
基准测试/测试
在同一页面上测试,不同技术(默认阈值)给出不同结果。 页面A:belle delphine from 16th Jan(64张轻微性感图片,主要是内衣,少数裸露乳房) 页面B:sasha grey from 18 Apr(16张图片,12张明显nsfw,4张明显安全)
过滤技术 | A时间 | A裸露数 | B时间 | B裸露数 |
---|---|---|---|---|
:nude(内置) | 127秒 | 63 | 34秒 | 14(假阳性/假阴性) |
detect-image-nsfw_api(docker) | 90秒 | 49 | 23秒 | 12 |
detect-image-aid(docker) | 124秒 | 10 | 28秒 | 6(假阴性) |
detect-image-nudenet(脚本) | 90秒 | 57 | 24秒 | 12 |
使用词表
虽然你可以运行nudecrawler搜索几个词,如nudecrawler "sasha grey" "Belle Delphine" Amouranth
,但你可能想用非常长的词表长时间运行。
最简单的情况(词表不太大),只需使用-w
,如:
# 详细输出,无过滤(报告所有页面),使用词表
nudecrawler -v -a -w wordlist.txt
如果你有非常大的词表,最好先用更快的工具如bulk-http-check预检查,它更快,只做简单检查(我们只需过滤出200和404页面),在最小的VPS服务器上每小时可处理数百万页面。
将词表转换为URL列表
# 只生成URL
nudecrawler-makeurls -w wordlist.txt > urls.txt
用bulk-http-check验证,得到这种格式的输出文件:
https://telegra.ph/abazhurah-02-26 OK 404
https://telegra.ph/ab-03-01 OK 200
https://telegra.ph/aaronov-02-22 OK 404
https://telegra.ph/abazhurami-02-25 OK 404
过滤它,只保留存在的页面,并去掉日期:
grep "OK 200" .local/urls-status.log | cut -f 1 -d" "| sed 's/-[0-9]\+-[0-9]\+$//g' | sort | uniq > .local/urs.txt
列表(urls.txt)看起来像:
https://telegra.ph/
https://telegra.ph/a
https://telegra.ph/ab
https://telegra.ph/aba
https://telegra.ph/Abakan
....
这个列表(~300Kb,11k个URL)是从150万词的俄语词表创建的。它只包含过去10天内至少有一个页面使用该标题的词。所以它有"Анжелика"或"Анфиса"(美丽的女性名字),但没有"Абажурами"或"Абажуродержателем"(因为telegra.ph上没有这些标题的页面)。
现在你可以将这个文件用作词表(nudecrawler会检测到它已经是基本URL,只会在URL后面添加日期)。
如何使用JSON日志文件
如果--log
文件名以.json
或.jsonl
结尾,nudecrawler将以JSONL格式保存日志(每行是一个页面的JSON)。示例:
{"status": "有趣", "url": "https://telegra.ph/Masha-NN-NN-N", "total_images": 29, "nude_images": 17, "new_nude_images": 17, "nonnude_images": 12, "new_nonnude_images": 12, "total_video": 0}
{"status": "有趣", "url": "https://telegra.ph/Masha-NN-NN-N", "total_images": 3, "nude_images": 3, "new_nude_images": 3, "nonnude_images": 0, "new_nonnude_images": 0, "total_video": 0}
你可以保存几乎所有页面,然后用jq进行过滤(只获取有趣的记录,只获取有趣的字段):
jq 'select(.nude_images>1 and .total_images>1) | {"url": .url, "total": .total_images}' < /tmp/n.json
使用不同的裸体检测器
NudeCrawler可以与不同的裸体检测器配合使用,并且很容易扩展。选项-a
/--all
将完全禁用检测,它会报告所有页面。
内置的:nude
过滤器基于nude.py(是nude.js的Python移植版),大多数情况下效果不错,默认使用(不需要像keras/tensorflow检测器那样安装很多依赖,最好作为Docker镜像使用),但速度较慢。
有两个选项可以连接用户过滤器,--detect-image SCRIPT
和--detect-url SCRIPT
,第一个会调用脚本并传递下载图像的文件名进行分析,第二个会调用脚本并传递图像的URL进行分析。脚本应该返回0(图像是SFW)或1(图像是NSFW)。助记符:返回代码是有趣图像的数量。
如果你使用/bin/true
作为脚本,它会将所有图像检测为裸体,而/bin/false
会将所有图像检测为非裸体。
脚本通常安装在/usr/local/bin中,如果它在$PATH中,你不需要指定脚本的完整路径,nudecrawler会在$PATH中找到它。
检测器:nsfw_api(推荐)
使用nsfw_api:
启动:
sudo docker run --rm --name nsfw-api -d -p 3000:3000 ghcr.io/arnidan/nsfw-api:latest
使用选项--detect nsfwapi
此检测器理解DETECTOR_VERBOSE,以及每个NSFW类别(色情、性感、漫画)的特殊阈值, 另外,DETECTOR_THRESHOLD为所有类别设置默认阈值。
DETECTOR_VERBOSE=1 DETECTOR_THRESHOLD_HENTAI=0.9 bin/detect-image-nsfw-api.py /tmp/sketch-girl.jpg ; echo $?
Safe /tmp/sketch-girl.jpg: {'hentai': 0.57, 'drawing': 0.4, 'porn': 0.02, 'neutral': 0.01, 'sexy': 0.0}
0
检测器:adult-image-detector
sudo docker run --rm -d -p 9191:9191 --name aid --memory=1G opendating/adult-image-detector
并使用选项--detect aid
adult-image-detector对我来说效果很好且速度快,但存在内存泄漏问题,因此需要越来越多的RAM。它适合短时间运行。
检测器:NudeNet
安装NudeNet(需要一点技巧)
使用NudeNet不需要docker,但你需要安装pip3 install -U flask nudenet python-daemon
(考虑使用virtualenv,因为nudenet有很多依赖)。此外,NudeNet需要文件~/.NudeNet/classifier_model.onnx
中的模型,如果文件缺失,NudeNet会(不成功地)尝试从https://github.com/notAI-tech/NudeNet/releases/download/v0/classifier_model.onnx 下载文件,但存在问题,github可能会显示警告页面而不是真正的.onnx文件,因此下载的是这个页面(这显然是错误的)。
正确的解决方法很简单 - 安装NudeNet后手动下载模型(不要使用wget!)并将其放在~/.NudeNet/
中。
或者你可以从我的临时网站下载:wget -O ~/.NudeNet/classifier_model.onnx https://nudecrawler.netlify.app/classifier_model.onnx
(但我不能保证它会永远存在)并将其放在~/.NudeNet中。
在NudeCrawler中使用NudeNet
NudeNet过滤以客户端-服务器方式实现。在另一个终端(或screen/tmux)上启动服务器(PATH_TO/detect-server-nudenet.py),并在NudeCrawler中添加选项--detect nudenet
。
编写自己的检测器
如果你想编写自己的检测器,可以参考现有的检测器脚本作为示例,但以下是主要规则:
- 图像URL或PATH作为argv[1]传递
- 如果图像安全且无聊则返回0,如果图像有趣则返回1
- 如果有任何技术问题(超时或404)则返回0
- 可以通过环境指定额外配置,NudeCrawler会将环境传递给你的脚本
- NudeCrawler还会设置环境变量
NUDECRAWLER_PAGE_URL
和NUDECRAWLER_IMAGE_URL
构建docker容器
仓库包含Dockerfile。使用sudo docker build --build-arg VERSION=0.3.10 -t yaroslaff/nudecrawler:0.3.10 -f docker/Dockerfile .
来构建它。
运行docker容器(示例):
mkdir /tmp/run
sudo docker run --name nudecrawler --rm -v /tmp/run:/work yaroslaff/nudecrawler nudecrawler -a Eva "Sasha Grey" "Belle Delphine" Amouranth
如果你为docker指定文件(如 -w
、--stats
、--resume
、--log
、--cache
),路径将从 /work 开始修改。例如,-w urls.txt
将变为 -w /work/urls.txt
,这在主机上对应 /tmp/run/urls.txt。