php禁止网页抓取(我写技术博客有两个原因:CDN服务提供商会分配给你若干个节点)

优采云 发布时间: 2021-11-24 01:01

  php禁止网页抓取(我写技术博客有两个原因:CDN服务提供商会分配给你若干个节点)

  我写技术博客有两个原因:一是总结我最近的研究成果,二是把这些成果分享给大家。所以就我而言,我还是更喜欢写文章让更多人看到。我最近注意到我博客的大部分流量来自谷歌,几乎没有来自百度。而本文旨在提出这个问题并试图解决它。当然,换成云主机服务商可以很直接很清楚的解决这个问题,但这不是本文的重点,暂不提及。

  为什么在 Github Pages 上禁用了百度爬虫?

  关于这个问题,我联系了Github Support部门,得到的答复是这样的:

  嗨,杰瑞,

  很抱歉给您带来麻烦。我们目前正在阻止百度用户代理抓取 GitHub Pages 站点,以响应该用户代理对过多请求负责,这导致了其他 GitHub 客户的可用性问题。

  这不太可能很快改变,因此如果您需要百度用户代理能够抓取您的网站,您将需要将其托管在其他地方。

  再次对给您带来的不便表示歉意。

  干杯,

  亚历克斯

  简单来说,百度爬虫爬的太猛了,给很多Github用户造成了可用性问题,禁用百度爬虫的举动可能还会继续。(不知道跟之前的大炮有没有关系)

  因此,我只能自己做,才能得到足够的温饱。让我们讨论解决这个问题的方法。

  解决问题-CDN

  那么我们先来了解一下CDN的原理。

  CDN原理

  CDN的全称是Content Delivery Network,即内容分发网络,一般用于分发静态内容,如图片、视频、CSS、JS文件等。

  

  如果不使用 CDN,所有用户请求将被定向到单个源服务器。如果启用了 CDN 服务,CDN 服务提供商会为您分配多个节点。以上图为例,例如3个东海岸节点和3个西海岸节点分配给您的服务器。

  这时,用户不会直接向源服务器发送请求,而是向边缘服务器发送请求。再看下图。当您第一次访问资源 foo.png 时,边缘服务器没有 foo.png 的缓存。所以它会向原创服务器发送请求并获取 foo.png。下一次所有通过这个节点的请求,因为有缓存,不需要再次向源服务器发送请求,而边缘服务器直接返回文件的缓存。这样可以大大减少时延,减少源站的压力。

  

  CDN 服务如何确定您从哪个边缘服务器获取资源?实际上,在发送DNS请求时,您要访问的域名会映射到最近节点的IP。确定哪个是最近的节点,最简单的策略是基于IP,但是每个CDN服务商可能有不同的策略,这里就不展开讨论了。

  CDN 的局限性

  CDN确实可以解决很多问题,但也有一定的局限性。最重要的一点是:永远不要使用 CDN 来缓存动态内容。

  我们来看一个例子,假设服务器端有这样一个PHP文件hello.php:

  如果 CDN 缓存了这个文件,将会产生非常糟糕的后果。例如,Jerry 首先访问 hello.php 页面,获取了 Hello, Jerry 的内容。此时内容已经缓存到节点A,Tom离节点A最近,所以当Tom访问hello.php时,会直接得到缓存的内容:Hello, Jerry。这时候,汤姆的心一定是崩溃了。

  您还应该避免在以下情况下使用 CDN: 根据用户代理选择返回移动版或桌面版页面。UA判断这对解决我们的问题很重要,下面会提到。当然,Github Pages上部署的网站都是静态站点,所有用户进来看到的内容大体是一样的。所以通过CDN缓存整个站点是没有问题的。

  可行性分析

  Github使用UA判断百度爬虫,返回403 Forbidden。百度爬虫的UA大致是这样的:

  Mozilla/5.0(兼容;Baiduspider/2.0;+)

  那么使用CDN解决这个问题的关键就是让百度爬虫不直接向Github服务器发送请求,而是通过CDN边缘服务器的缓存抓取网站的内容。边缘服务器本身不关心UA,所以问题解决了。

  但问题真的这么简单吗?

  并不真地。

  来看看,我使用百度站长工具进行爬行诊断测试结果:

  

  结果只是偶尔能爬成功,结果很失望吧?下面我们来分析一下原因,先列举一些我目前知道的:

  所有成功爬取的页面都访问了209.9.130.5个节点

  所有爬取失败的页面都访问了209.9.130.6个节点

  我的本地ping会ping到209.9.130.8个节点

  嗯,细心的同学应该已经发现问题了。大部分百度爬虫请求都指向了209.9.130.6节点,但是这个节点上没有页面缓存。!!如果百度爬虫是页面的第一个访问者,CDN的边缘服务器会使用百度爬虫的UA向Github服务器请求,结果自然是拒绝。

  最终我们通过CDN得到了解决这个问题的必要条件:你的博客必须有巨大的流量!只有这样才能保证CDN的每个边缘服务器上都有任意页面的缓存。我认为几乎不可能满足这个要求,除非有像 React 主页这样的 网站。

  最后一句话总结:CDN方案不靠谱。

  当然,我没有放弃,我做了一些奇怪的事情......首先我找到了所有的BaiduSpider IP,然后我想假装是这些IP来请求内容,以便在所有百度蜘蛛的边缘服务器上可能会爬行。建立缓存。

  函数卷曲($url,$ip){

  $ch = curl_init();

  curl_setopt_array($ch, [

  CURLOPT_URL => $url,

  CURLOPT_TIMEOUT => 10,

  CURLOPT_HEADER => 真,

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线