php - 实时识别爬虫 - PHP - 跟踪内存中的访问文件

标签 php linux memory nginx

背景

合法的蜘蛛很棒。它是网络的一部分,我很高兴他们访问我的网站。

没有经过授权的抓取我网站的蜘蛛是坏的,我想摆脱它们。

我有一个 PHP 应用程序可以监控我的网站访问文件。每次带有可疑 UserAgent 的用户访问该站点时,系统都会检查访问日志中是否有来自同一 IP 地址的条目,并对其行为做出判断。如果它不是人,而且我没有授权它,那么它会被记录下来,我可能会(也可能不会)采取阻止等措施。

它的工作方式是每次加载页面时都会发生检查访问文件的过程。我只检查可疑的 UserAgent,因此检查次数保持在最低限度。

问题

我想做的是检查每次访问该站点(即检查访问文件的最后 50 行以查看是否与该访问 IP 相关)。但这意味着我的 Web 服务器处理的每个子进程都希望打开一个访问日志文件。这听起来像是资源和 I/O 阻塞的噩梦。

有没有一种方法可以将 access.log 文件“拖尾”到某种中央内存中,所有 Web 进程都可以同时访问(或至少非常快)。也许将它加载到 Memcache 或类似的。但我如何实时做到这一点?因此 access.log 文件的最后 500 行连续加载到内存中(但只有 500 行被删除,而不是不断增加的数字)。

所以简单来说:是否有 php 或 linux 或“其他”方式将不断增加的文件(即 nginx 日志文件)缓冲到内存中,以便其他进程可以同时访问信息(或至少比所有读取更快硬盘驱动器上的文件)。

最佳答案

重要的是要知道编写良好的服务将始终能够模仿浏览器的行为,除非您做了一些非常奇怪的事情会影响合法访问者的用户体验。

但是,即使是复杂的爬虫,也有一些措施可以应对:

0。忘记......

… 引荐来源网址和 UA 字符串。这些很容易伪造,一些合法用户没有通用的。你会得到很多假阳性/阴性结果,但收获不大。

1。 throttle

像 Apache 或 nginx 这样的 Web 服务器具有核心或附加功能来限制某些请求的请求率。例如,您可以允许每两秒下载一个 *.html 页面,但不限制 JS/CSS 等资源。 (请记住,您还应该通过 robots.txt 将延迟通知合法机器人)。

2。 Fail2ban

Fail2ban 做的事情与您想要做的类似:它扫描日志文件以查找恶意请求并阻止它们。它对恶意软件机器人非常有效,应该可以将其配置为处理爬虫(至少是不太聪明的爬虫)。

--

这些是专门回答您的问题的,但还有一些您可以考虑:

3。修改内容

这实际上是一个非常有趣的事情:有时,我们会对 HTML 页面和 JSON 提要进行较小的(自动)修改,这会迫使抓取工具调整其解析器。有趣的是,我们在他们的网站上看到过时的数据几天,直到他们 catch 来。然后我们再修改一下。

4。限制:验证码和登录

除了 Web 服务器级别的限制外,我们还计算每个 IP 地址每小时的请求数。如果超过一定数量(对于合法用户来说应该足够了),则对 API 的每个请求都需要解决验证码问题。

其他 API 需要身份验证,因此它们甚至不会进入这些区域。

5.滥用通知

如果定期访问某个 IP 地址或子网,您可以对他们运行机器人的网络服务进行 WHOIS 查询。通常,他们有滥用行为联系人,而且通常这些联系人非常渴望听到有关违反政策的信息。因为他们最不想看到的就是进入黑名单(如果他们不合作,我们会提交给他们)。

另外,如果您在抓取工具的网站上看到广告,您应该通知广告网络他们被用于盗取 Material 的事实。

6。 IP 禁令

很明显,您可以阻止单个 IP 地址。我们所做的甚至是阻止整个数据中心,例如 AWS、Azure 等。网络上提供了所有这些服务的 IP 范围列表。

当然,如果有合作伙伴服务从数据中心合法访问您的网站,您必须将他们列入白名单。

顺便说一句,我们不在 Web 服务器中执行此操作,而是在防火墙级别 (IPtables) 执行此操作。

7.法律措施

如果您认为爬虫可能害怕您方面的法律诉讼,您应该毫不犹豫地联系他们并明确他们侵犯了您的版权和使用条款,他们可能会受到法律诉讼。

8.结语

毕竟,与爬虫战斗是“与风车的战斗”,可能需要付出很大的努力。你将无法阻止所有这些,但你应该专注于那些伤害你的东西,例如。浪费你的资源或赚取本应属于你的钱。

祝你好运!

关于php - 实时识别爬虫 - PHP - 跟踪内存中的访问文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25186518/

相关文章:

linux - RPM SPEC Systemd 启用并启动

c++ - SuSE Linux网络异常系统日志文件

python - 使用 Numpy 加载文本时出现内存错误

javascript - 如何从对象和类中清除 javascript 中浏览器的内存?

php - PDO异常 SQLSTATE[23000] :in php

php - static::$model::$table - 如何实现这一点?

php - utf8_encode 函数用途

c - 自动释放局部变量

C++ Void双指针干扰另一个

PHP fatal error : Allowed memory size of 268435456 bytes exhausted