【问题标题】:Scraping Book Prices刮书价格
【发布时间】:2011-07-03 19:40:16
【问题描述】:

我正在尝试编写一个抓取应用程序,但遇到了问题。我的 PHP Curl 代码没有以书籍的价格拉起页面。它让我回到了域的网络根目录。

我正在尝试按 ISBN 搜索网站。

我这几天一直在用头撞墙。任何帮助将不胜感激!

代码:

<form method="post" for="new-search" name="SearchTerm" class='form-validate' id="SearchTerm" action="index.php">
    <textarea rows="3" name="SearchTerm" id="SearchTerm" cols="40" class="validate-required error"></textarea><div class="error" id="SearchTerm-error">
    <br>                        
    <button class="search primary" type="submit">continue</button>

</form>


<?php

/*
echo("<pre>");print_r($_GET);echo("</pre>");
echo("<pre>");print_r($_POST);echo("</pre>");
*/

$isbn = $_POST['SearchTerm'];


$userAgent = 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16';

$fields = array(
    'url' => ("http://www.bookleberry.com/Search/SearchKeyword"),
    'qurl' => ("http://www.bookleberry.com/Search/SearchKeyword/" . $_POST['SearchTerm']),
    'SearchTerm' => ($_POST['SearchTerm']),
    'Page' => ('1'),
    'class' => ('textfield validate-required'),
    'for' => ('new-search'),
    'result-count' => ('1'),
    'status' => 'success',
);

$SearchTerm = ($fields['SearchTerm']);
$url = ($fields['url']);
$Page = ($fields['Page']);


echo("<pre>");
print_r($fields);
echo("</pre>");

if ($isbn != NULL){

    //open connection
    $ch = curl_init($url);
    //set the url, number of POST vars, POST data
    curl_setopt($ch, CURLOPT_HEADER, $userAgent);
    curl_setopt($ch, CURLOPT_URL, $url);
        echo "before curl_exec:<br>";
        echo "curl_errno=". curl_errno($ch) ."<br>";
        echo "curl_error=". curl_error($ch) ."<br>";
    curl_setopt($ch,CURLOPT_POST,count($fields));
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "?SearchTerm=$SearchTerm");
    curl_setopt($ch, CURLOPT_HTTPGET, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 9999999);
     curl_setopt($ch,CURLOPT_HTTPHEADER,array (
        "Accept: application/json"
    ));




    $info = curl_getinfo($ch);

    //execute post
    $result = curl_exec($ch);
    print $result;


print "<pre>\n";
print_r(curl_getinfo($ch));  // get error info

?>

【问题讨论】:

  • 我想说的是因为内容似乎是 AJAX 填充的。用 PHP/CURL 抓取不会让你走得太远,你需要拦截 AJAX 调用,并得到 javascript 在后台使用的结果。

标签: php curl web-scraping


【解决方案1】:

别伤你的头,用它!

  • 安装fiddler
  • 使用浏览器发出请求,在 fiddler 中查看发布的确切内容。这包括所有标题、cookie 和表单变量。
  • 使用您的代码发帖,再次检查提琴手
  • 比较两者之间的差异并调整您的脚本。
  • 重复。

还有助于安装firebug。使用复制 Xpath,并将其放入 php DOM xpath 查询中,使得抓取变得有趣而简单!

【讨论】:

  • 我喜欢用于网页抓取的 DOM Xpath 查询理念
  • @emailenin - 请记住删除 firebug 放入的 &lt;tbody&gt; 元素
  • 您提供的步骤,是我在抓取网站时经常使用的步骤;)
  • 另外,你应该比较IE和Firefox返回的源。好像一直都不太一样! (标签中的属性名称等)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
相关资源
最近更新 更多