【问题标题】:PHP doesn't let me output the html of certain sites, why?PHP不允许我输出某些网站的html,为什么?
【发布时间】:2016-07-15 14:17:17
【问题描述】:

我正在尝试构建一个基本的网络爬虫。它几乎适用于任何网站,但有些网站我无法废弃,这是为什么呢?这是我在一个有效的网站(这个网站)上的代码:

<!doctype html>
<html lang="en-US">
  <body>
    <?php
      $url ='http://stackoverflow.com/';
      $output = file_get_contents($url);
      echo $output;
    ?>
  </body>
</html>

当在我自己的本地主机上运行时,它会将 stackoverflow.com 的内容输出到我的站点中。这是一个不适合的网站:

<!doctype html>
<html lang="en-US">
  <body>
    <?php
      $url ='https://www.galottery.com/en-us/home.html';
      $output = file_get_contents($url);
      echo $output;
    ?>
  </body>
</html>

我没有加载网站,而是收到此错误:

警告:file_get_contents(https://www.galottery.com/en-us/home.html):打开流失败:HTTP 请求失败! HTTP/1.1 403 Forbidden in C:\xampp\htdocs\projects\QD\webScraping\index.php 第 6 行

为什么这对某些网站有效,而对其他网站无效?我认为这可能是因为其中一个是 HTTPS 站点,但我已经为 https://google.com 之类的其他站点尝试了此代码,并且效果很好。

我正在使用 XAMMP 运行本地 PHP。

【问题讨论】:

  • 他们很可能在他们的服务器上安装了一些东西来阻止人们抓取他们的网站
  • 您是否尝试过从浏览器访问该网页?如果您无法访问它,那么您已被该站点阻止
  • 远程站点正在根据我们不可能知道的某些策略阻止请求。也许是由于缺少用户代理或类似的。顺便说一句,如果您要在公共网站上使用这种策略,请务必获得相关权限,否则您可能会陷入法律困境
  • 可以使用与此帮助不同的方法吗?
  • 403 Forbidden 说出了它所说的 :) 该网站不希望您的抓取工具在那里。例如,它可以是 htaccess 保护。有时您可以通过使用 useragent 来通过这种保护(例如,请参见此处:stackoverflow.com/a/2107792/6347483

标签: php web-scraping


【解决方案1】:

成功了;

<?php

$ops =  array(
    'http' => array(
        'method' => "GET",
        'header' => "Accept-language: en\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n" .
                    "Cookie: foo=bar\r\n" . 
                    "User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n"
    )
);

$context = stream_context_create($ops);

echo file_get_contents('https://www.galottery.com/en-us/home.html', false, $context);

【讨论】:

  • 他们需要一些带有这些的标题。
  • 谢谢!这非常有效,不要忘记您的关闭?&gt;
【解决方案2】:

要么他们检查 UserAgent,要么他们禁止你的 IP 地址。

要模拟正确的UserAgent,你必须使用curl,像这样:

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);

curl_setopt($ch, CURLOPT_URL, "https://www.galottery.com/en-us/home.html");
$result = curl_exec($ch);

echo $result;

虽然,他们可能会使用一些 javascript 重定向,例如。首先你加载网页,他们正在设置一个cookie并执行document.location.href重定向。比他们检查那个cookie。

更新:刚刚测试,我的解决方案运行良好。

【讨论】:

  • 需要注意的是,很多人认为这是一个粗鲁的举动。
  • @ceejayoz,真的吗?为什么?我模拟自己浏览器的工作,这有什么不礼貌的?
  • 因为抓取网站通常违反其服务条款,而抓取限制通常是有充分理由的。
  • 我明白你的意思,但我认为只有当我将其他网站用于某些非法目的时才属于违规行为。你不觉得吗?
  • 很棒的帖子,但我没有 curl。
猜你喜欢
  • 2011-05-04
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 2011-06-17
  • 2020-10-29
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多