【问题标题】:Inserting scraped data using php curl into MySQL使用 php curl 将抓取的数据插入 MySQL
【发布时间】:2012-06-23 23:30:59
【问题描述】:

过去几天我一直在编写这个脚本,但似乎找不到将数据插入 MySQL 的方法。我是 PHP/MYSQL 的初学者,之前只写过几个简单的脚本。我能够回显抓取的数据并且没有收到任何错误消息,但是当我检查 phpmyadmin 时,查询不起作用(结果没有输入到数据库中)。

这是我一直在处理的代码

require ("mysqli_connect.php"); 
include('../simple_html_dom.php');

ini_set('user_agent', 
  'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3');

// get DOM from URL or file
$html = file_get_html('http://www.asos.com/Women/Jeans/Cat/pgecategory.aspx?cid=3630&via=lhn');
// find all images

foreach($html->find('#items') as $a)       
    echo $a->innertext .'<br>';

foreach($html->find('span.price') as $p)
    echo $p->innertext .',';    

$q = "INSERT INTO jeans (`image`, `price`) VALUES ('$a', '$p')";
$r = @mysqli_query ($dbc, $q) or die ("Update query failed : " . mysql_error());;  //Run the Query.

【问题讨论】:

  • 谢谢尼克,甚至为此苦苦挣扎!
  • 尝试回显$q并在phpmyadmin中运行它;这将显示您的 SQL 是否存在错误,或者您的数据库连接是否存在错误。
  • 如果 $a->innertext 和 $p->innertext 包含有效值,您可能想要插入它们。
  • 你有 mysqli_query 和 mysql_error。考虑到您的要求是 mysqli_connect,我认为最后的 mysql_error() 函数应该是 mysqli_error()。这可能会帮助您获得更多信息。
  • 谢谢 Kingcoyote,我没发现。我将其更改为 mysqli,它向我显示了错误消息:警告:mysqli_error() 只需要 1 个参数,0 在第 32 行的 /domainname.com 中给出

标签: php mysql curl insert screen-scraping


【解决方案1】:

在您的示例代码中,$a 和 $p 是对象,请尝试以下操作:

$a = '';
foreach($html->find('#items') as $item) {
    $a.= $item->innertext .'<br>';
}

$p = '';
foreach($html->find('span.price') as $price) {
    $p.= $price->innertext.',';    
}

接下来,从@mysqli_query 中删除@,尽量不要使用它,而是尝试正确地捕获/处理错误。

接下来,请花几分钟时间研究参数化查询和 PDO,不要接受未知输入(至少来自第 3 方)并将它们直接注入到您的 sql 中:

$q = "INSERT INTO jeans (`image`, `price`) VALUES ('$a', '$p')";

即:不要那样做^

最后,您可能想要验证 get 的响应。

希望有帮助!

【讨论】:

  • 您好 Somedev,感谢您抽出时间查看我的问题并提供解决方案。您在哪里定义了 $a 和 $p 变量,我应该在引号之间将其留空吗?此外,我按照您的建议研究了参数化查询和 PDO,但由于我是个大新手,所以我无法理解它。我将如何在这里实现它?这正是我想做的:多个插入查询。再次感谢。
【解决方案2】:

您通过在mysqli_query 之前添加@ 来抑制错误

尝试改变这个:

$q = "INSERT INTO jeans ('image', 'price') VALUES ('$a', '$p')";
mysqli_query ($dbc, $q) or die ("Update query failed : " . mysql_error());;  //Run the Query.

【讨论】:

  • 你好,edwardmp。谢谢你这么快回复。我现在已经删除了 @ 符号并实现了 somedev 的上述代码,但现在它只是回显了 Update Query Failed :
【解决方案3】:

我想我知道出了什么问题。

如果你只是使用

echo file_get_contents("http://www.asos.com/Women/Jeans/Cat/pgecategory.aspx?cid=3630");

(或者只是 asos.com,没关系),你会发现你总会回来的:

抱歉,我们找不到该页面或出现问题...

返回或在这里尝试:

女性男性家庭服务台

因为您指定的元素都不在此页面上,所以您的代码不会返回任何内容。

我的猜测是 asos.com 会阻止从他们的网站上进行抓取。

【讨论】:

  • 你可能没有伪造你的用户代理。如果您查看上面的代码,我将我的用户代理设置为 Mozilla,因为它们允许他们抓取他们的网站。所以我可以检索信息,但我似乎无法将其插入我的数据库:(
  • 查看我的其他帖子。 Travis Pessetto 已对其进行了调整,将反引号替换为单引号。
  • 在代码中定义用户代理比在.ini中更简洁。使用这样的东西; $context = stream_context_create(); stream_context_set_params($context, array('user_agent' =&gt; 'UserAgent/1.0'); file_get_html('http://www.google.com/', 0, $context);
  • 好的,我会进行调整以使其更清晰。我仍然没有更接近将所需的内容添加到数据库中:s。我已经成功抓取了页面,并且可以使用 $a 来回显数据。或 $p 。但我似乎无法将这些数据输入 MySQL。
【解决方案4】:

记得使用 mysql_real_escape_string 函数来避免保存内容的麻烦。下面的例子。

$query2 = sprintf("INSERT INTO jeans(image, price)  
                 VALUES ('%s','%s')",mysql_real_escape_string($a),
                                     mysql_real_escape_string($p))
mysql_query($query2) or die(mysql_error()."<br />".$query2); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2012-06-12
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多