【问题标题】:PHP / scraping - Get amazon product pricePHP / 抓取 - 获取亚马逊产品价格
【发布时间】:2015-11-03 21:03:57
【问题描述】:

我正在尝试检索亚马逊产品价格。 我尝试了两种方法:

  1. file_get_contents -> 正则表达式 -> 有效
  2. 使用 DOMXPath -> 出于某种原因不起作用

我注意到,如果 javascript 已启用,价格的 xpath 与 xpath 不同,而 javascript 已禁用

无论如何,如何使用 xpath 检索价格?

这就是我正在做的,但代码什么也没返回(即使它在任何其他网站上都可以运行):

(xpath 是使用 firebug 获取的)

$url = 'http://www.amazon.com/dp/product/B00TRQPSXM/';
$path = '/html/body/div[3]/form/table[3]/tbody/tr[1]/td/div/table/tbody/tr[2]';

$html = file_get_contents($url);

$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXpath($dom);

$elements = $xpath->query($path);

if($elements)
{   
    foreach($elements as $element)
    {
        echo $element->nodeName.'<br>';
        echo $element->nodeValue.'<br>';
    }
}

【问题讨论】:

  • 您正在处理外部资源。永远不要假设成功。始终检查 f_g_c() 是否确实返回了有用的 html。并且不要使用@ 来抑制错误。这相当于把你的手指塞进耳朵里然后“拉拉拉拉听不到你的声音”。
  • 就像 MarcB 所写的那样,想知道为什么 dom-&gt;loadHTML($html); 在抑制错误时不起作用是一个坏主意 (tm)。亚马逊网站通常以无效 HTML 闻名,因此您可能需要对其进行一些修复/恢复操作。 php.net/tidy / php.net/class.domdocument#domdocument.props.recover

标签: php dom xpath web-scraping domdocument


【解决方案1】:

您的请求将被阻止尝试几次后,亚马逊每次都会检查机器人访问。与其废弃违反亚马逊服务条款(或其他任何名称)的网站,不如使用他们在http://developer.amazonservices.com 找到的 API。您将通过this operation获得您想要的价格信息。

还有一个 php sdk 你可以使用。

无论哪种方式,file_get_contents() 在这里都不是一个选项,如果您想抓取页面,请使用 curl 并使其看起来像一个独特的访问者。

【讨论】:

  • 我没有被阻止。我知道我可以使用 API。 API 有一些限制,我正在寻找一个后备解决方案。没关系。为什么我无法使用 xpath 查询 file_get_contents 返回的 HTML?在任何其他网站上都可以正常工作。
  • 你没有得到你期望的页面,你得到一个错误页面,说请填写验证码。正如 Marc 在上面评论的那样,您只是看不到它,因为您抑制了错误。
  • 我的问题是 file_get_contents 和 loadHTML 方法有什么区别。这第一个有效,第二个无效。
  • 你有没有整理过如何刮不被堵?我也想知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多