MENU

Typecho 的反垃圾斗争

2017-08-11-Cove

网络世界虽然丰富多彩,但是也充满了各种垃圾。昨晚,在后台访问日志里有两个爬虫无视规则疯狂的爬取站点数据,其中一个是阿里的 YisouSpider 而另一个则是 MJ12bot 。好不容易解决爬虫问题,今天中午又出现了一堆来自乌克兰的垃圾评论。

短时间内,我对互联网的下限的认识就被刷新了。下面,我们记录下自己的反垃圾斗争,希望在以后能帮助到别人。

反爬虫

其实理论上爬虫是无法根治的而且也不是所有的爬虫都是有害程序。有些爬虫,例如 ,Googlebot 和 bingbot 对于网站的 SEO 还是有帮助的。 而且合规的爬虫程序会按照站点 robots.txt 文件规定进行内容爬取。但是也有很多像 YisouSpider 这样既流氓又无效的爬虫。这群垃圾疯狂起来甚至都有点小型 DDOS 的意味了。更为关键的是这些爬虫对站点本身无任何益处,所以必须惩治它们。

反爬虫的策略大致有两种:

  1. 编写 robots.txt 规则。

  2. 直接封锁 IP。

  3. 根据 User-Agent 进行封锁。

第一个方法相对来说是最弱的,因为流氓几乎都不会查看 robots.txt 文件中的规则。但是我们还是有必要了解下它是如何进行设置的。

User-agent: YisouSpider
Disallow: /

User-agent: MJ12bot 
Disallow: /

user-agent: *
Disallow: /admin/
Disallow: /install/
Disallow: /usr/
Disallow: /install.php
Disallow: /config.inc.php
sitemap:https://bignerdcoding.com/sitemap.xml

其中前两个规则拒绝了 YisouSpiderMJ12bot 的爬虫请求,而后面的规则屏蔽了其他爬虫对特性文件夹的爬虫请求。

针对不受规矩的爬虫程序我们可以通过 IP 封锁。将日志中这些爬虫的 IP 找到,并将其写入 iptables:

// 写入爬虫地址
iptables  – I  RH – Firewall – 1 – INPUT – s  110 . 75 . 171 . 0 / 24  – j DROP

.....


// 检查规则是否生效
iptables -L INPUT –line-numbers |  grep 110.75.164. |  grep -P "DROP|REJECT"

当然这些爬虫程序的 IP 资源非常多,手动写 iptable 将会变成一件非常繁琐的事。不过好在我们可以在 Nginx 规则中直接根据 User-agent 进行屏蔽。

server {
    listen      80;
    server_name domain.com;
    if ($http_user_agent ~* "(YisouSpider|EasouSpider|EtaoSpider|MJ12bot|Python-urllib|AhrefsBot|dotbot|grapeshot|DeuSu)") {
        return 403;
    }
    
    ....
}

server {
    listen 443;
    server_name domain.com;
    if ($http_user_agent ~* "(YisouSpider|EasouSpider|EtaoSpider|MJ12bot|Python-urllib|AhrefsBot|dotbot|grapeshot|DeuSu)") {
        return 403;
    }
    ...
}

相比较而言,最后一种方法针对流氓最高效。当然,最理想的方法是同时采用方法一和方法三,这样既可以针对垃圾爬虫又可以对合法爬虫做出约束。

反垃圾评论

除了垃圾爬虫程序之外,个人站点的另一个毒瘤就是垃圾评论。这些垃圾评论会严重影响站点的体验和质量。而且往往这些评论机器人和爬虫一样,它们都会拥有强大的 IP 地址库(可能来源于肉鸡),所以手动禁止根本就是杯水车薪。

针对 Typecho 以及 WordPress 站点,它们可以使用 Akismet 神奇插件来解决这个顽疾。只需注册 Akismet 或者 Typepad 反垃圾服务,我们就可以让 Akismet 插件自动截获垃圾评论。你只需在后台定期删除这些垃圾数据。

当然,如果你连后台删除都不行操作的话。你也可以在 Nginx 配置里进行 IP 段封锁。例如,我遭受的垃圾评论主要来源地址为:91.200.12.63、91.200.12.10、91.200.12.6、91.200.12.137、91.200.12.102 等地址。所以我直接在 Nginx 中屏蔽 91.200.12.0/24 网段:

server {
    listen      80;
    server_name domain.com;
    deny 91.200.12.0/24;
    ....
}

server {
    listen 443;
    server_name domain.com;
    deny 91.200.12.0/24;
    
    ...
}

总结

世界终归不是完美的,总有一些人和公司在贪婪的支配下变得毫无底线和规则意识。

标签: 反垃圾, 爬虫