javascript - 如何让爬虫必须在页面中运行javascript?

标签 javascript web-crawler

我想实现一些反爬虫机制来保护我网站中的数据。在阅读了 SO 中的许多相关主题后,我将重点关注“强制运行 javascript”。

我的计划是:

  1. 在 JavaScript 文件 C 中实现特殊函数 F(例如 MD5SUM)

    输入:当前用户的cookie字符串(每次响应时cookie都会变化)

    输出:验证字符串V

  2. 将 V 与其他参数一起发送到敏感后端接口(interface)以请求有值(value)的数据

  3. 后端服务器有验证函数T来检查V是否正确

困难的部分是如何混淆F。如果爬虫能够轻松理解F,那么他们将在没有C的情况下获得V并绕过javascript。

确实,js混淆器有很多,但我将通过实现一个在C中没有出现的生成器函数G来实现目标。

G(K) 生成 F,其中 K 是一个大整数。 F应该足够复杂,以至于爬虫作者必须花很多时间才能理解F。再给定一个K', G(K') = F', F' 在某种程度上应该看起来像一个新函数,同样,爬虫作者必须花几个小时才能破解。

G 的一种可能实现可能是从整数到许多连接的逻辑门(如迷宫)的数字电路的映射。用javascript语法表示为F。由于F必须在javascript中运行,所以爬虫必须运行PhantomJS。此外,我可以在F中插休眠眠来减慢爬虫速度,而普通用户几乎察觉不到50-100ms的延迟。

我知道有一组检测爬虫的方法。它们将被应用。我们只讨论“强制运行 javascript”主题。 你能给我一些建议吗?有没有更好的解决办法?

最佳答案

使用登录来防止全世界看到数据是一种选择。

如果您不希望登录用户获取您提供给他们的所有数据,您可以限制用户每分钟的请求数,如果已达到,则增加页面加载的延迟。由于用户已登录,您可以轻松地在服务器端跟踪请求,即使它们设法更改 cookie/localStorage/IP/浏览器等。

您可以对某些文本使用图像,这将迫使它们使用一些占用大量资源的机制来转换为可用信息。

您可以添加隐藏文本,这甚至会阻止用户复制/粘贴(您在每 3-4 个真实字母上使用填充有 3-4 个随机字母的跨度,并使它们的字体大小为 0)。这样它们就不会被看到,但仍然会被复制,并且很可能会从爬虫中获取。

拒绝来自已知爬虫 HTTP header 签名的连接,尽管任何爬虫都可以模拟这些签名。 Greasemonkey 或某些脚本扩展甚至可以将常规浏览器变成爬虫,因此这种情况发生的几率很小。

现在,强制使用 javascript

问题是你不能真正强制执行任何 JavaScript。每个有权访问该页面的人都可以看到 JavaScript 所做的事情,因此,如果您要完成某种 MD5 哈希,则可以用任何语言来实现。

这主要是不可行的,因为爬虫可以访问客户端 JavaScript 可以访问的所有内容。

强制使用支持 javascript 的爬虫是可以规避的,即使不能,凭借当今任何人都可以使用的计算能力,启动 phantomJS 实例是非常容易的...正如我上面所说,任何稍微懂 javascript 的人knowledge 可以简单地使用浏览器自动点击您的网站,这将使一切都无法检测到。

应该做什么

防止爬虫窃取您的数据并防止任何自动化的唯一万无一失的方法是询问只有人类才能做的事情。我想到了验证码。

想想你的真实用户

您应该记住的第一件事是,您的网站对于普通用户来说开始变得烦人,他们不会回来。仅仅因为有人想要提取数据就必须在每个页面请求上输入 8 个字符的验证码,这对任何人来说都变得太乏味了。此外,阻止未知的浏览器代理可能会阻止合法用户访问您的网站,因为他们使用奇怪的浏览器。

这对您的合法用户的影响以及您努力对抗爬虫的时间可能太高,以至于无法接受某些爬虫的发生。因此,最好的选择是重写 TOS 以明确禁止任何类型的抓取,记录每个用户的每次 http 访问,并在需要时采取行动。

Disclaimer: I'm scrapping over a hundred websites monthly, following external links to totalise about 3000 domains. At the time of posting, none of them are resisting, while they employ one or more techniques of the above. When a scrapping error is detected, it does not take long to fix it...

The only thing is to crawl respectfully, not over crawl or make too many requests in a small time frame. Just doing that will circumvent most popular anti crawlers.

关于javascript - 如何让爬虫必须在页面中运行javascript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45370251/

相关文章:

php - 爬取页面时,如何从<a href>或<frame src>属性获取完整URL

java - HTML 混合编码?

javascript - mongoDB 数据库探查器查询和获取更多选项

python - 获取 HTML 源代码,包括 javascript 和身份验证的结果

javascript - [Vue 警告] : Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders

javascript - 无需使用 Node.js 设置本地服务器?

ajax - Google Ajax Crawlable 规范的纯 JavaScript 解决方案

java - 有没有办法用 Selenium 获取影子根中的元素信息?

javascript - 从 Controller 调用其他 Controller 内的函数

javascript - 使用 Google Analytics onclick 事件进行 w3c 验证