【问题标题】:Goutte won't load an ASP SSL pageGoutte 不会加载 ASP SSL 页面
【发布时间】:2013-06-15 08:57:57
【问题描述】:

我正在试用Goutte,这是一个基于 Symfony2 组件的 PHP 网络爬虫。我已经成功地以纯文本和 SSL 形式检索了 Google。但是,我遇到了一个无法加载的 ASP/SSL 页面。

这是我的代码:

// Load a crawler/browser system
require_once 'vendor/goutte/goutte.phar';

// Here's a demo of a page we want to parse
$uri = '(removed)';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', $uri);
echo $crawler->text() . "\n";

相反,对于这个站点,上述代码末尾的回显给了我这个:

错误请求(无效的标头名称)

我可以在 Firefox 中很好地看到该站点,并且可以使用 wget --no-check-certificate 很好地检索它的 HTML,而无需其他选项(例如,设置标头或用户代理)。

我怀疑我需要在 Goutte 中设置一些 HTTP 标头。有没有人知道我应该尝试哪些?

【问题讨论】:

  • (旁白:如果有人想知道这里的否决票,我怀疑这个问题已成为我帐户的报复性否决票的避雷针。在我进行合理的编辑或投反对票但有人不喜欢的地方,这个问题得到了报复。呸!:-))。
  • 天哪;忽略加号,现在是 -10 :-O

标签: php http goutte symfony-components


【解决方案1】:

我发现我的浏览器和wget 都在标题中添加了一个非空的用户代理字段,所以我假设 Goutte 在这里没有设置任何内容。在获取之前将此标头添加到浏览器对象可以解决问题:

// Load a crawler/browser system
require_once 'vendor/goutte/goutte.phar';

// Here's a demo of a page we want to parse
$uri = '(removed)';

use Goutte\Client;

// Set up headers
$client = new Client();
$headers = array(
    'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:21.0) Gecko/20100101 Firefox/21.0',
);
foreach ($headers as $header => $value)
{
    $client->setHeader($header, $value);
}

$crawler = $client->request('GET', $uri);
echo $crawler->text() . "\n";

我在这里复制了我的浏览器代理字符串,但在这种情况下,我认为任何东西都可以工作 - 只要它被设置。

顺便说一句,我在这里使用了浏览器 UA,因为我试图准确地复制浏览器环境来调试这个特定的问题。一旦它工作,我切换到自定义 UA,因此目标网站可以根据需要将其检测为机器人(对于这个项目,我认为没有人拥有)。

【讨论】:

    【解决方案2】:

    我也有这个问题。

    添加 User-Agent 标头是不够的。我使用setServerParameter 函数添加了HTTP_USER_AGENT,它就像一个魅力。

    完整代码如下:

    // Load a crawler/browser system
    require_once 'vendor/goutte/goutte.phar';
    
    // Here's a demo of a page we want to parse
    $uri = '(removed)';
    $ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:21.0) Gecko/20100101 Firefox/21.0';
    
    use Goutte\Client;
    
    // Set up headers
    $client = new Client();
    $client->setHeader('User-Agent', $ua);
    $client->setServerParameter('HTTP_USER_AGENT', $ua);
    
    $crawler = $client->request('GET', $uri);
    echo $crawler->text() . "\n";
    

    【讨论】:

    • 嗯,这很奇怪——应该是其中之一。 setServerParameter() 可以单独工作吗?我想他们会做同样的事情。
    • 旁白:虽然浏览器 UA 适合开发,但我认为这对生产来说不是一个好习惯,因为如果目标愿意,爬虫应该可以让目标轻松阻止它们。我已经编辑了我的答案以说明这一点。
    • 它们应该是相同的,但就我而言,它们是不同的。是的,这很奇怪,因为它只发生在带有 SSL 的 ASP 上。
    • 我使用了 Goutte 3.1.0 版和 Guzzle 6.0.2。
    • 很奇怪。您是否能够从 Goutte 捕获请求标头以检查差异?
    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多