我已经有一个脚本,可以使用简单的 HTML dom 抓取一个 csv 的所有 url。
输出如下:
CoolerMaster Devastator II Azul
<小时/>
Coolbox DeepTeam - Combo teclado, ratón y alfombrilla
<小时/>
Asus Claymore RED - Teclado gaming
<小时/>
INSERT INTO productos (nombre) VALUES('Asus Claymore RED - Teclado gaming')
Items added to the database!
INSERT INTO productos (nombre) VALUES('Asus Claymore RED - Teclado gaming')
Items added to the database!
INSERT INTO productos (nombre) VALUES('Asus Claymore RED - Teclado gaming')
Items added to the database!
正如您所看到的,抓取内容包含 3 个不同的产品,但是当我尝试插入到 MySQL 数据库时,它只保存最后一个产品 --- 但保存了 3 次。
在这里你可以看到我的 PHP 代码:
<?php
require 'libs/simple_html_dom/simple_html_dom.php';
set_time_limit(0);
function scrapUrl($url)
{
$html = new simple_html_dom();
$html->load_file($url);
global $name;
$names = $html->find('h1');
foreach ($names as $name) {
echo $name->innertext;
echo '<br>';
}
$rutaCSV = 'csv/urls1.csv'; // Ruta del csv.
$csv = array_map('str_getcsv', file($rutaCSV));
foreach ($csv as $linea) {
$url = $linea[0];
scrapUrl($url);
}
$servername = "localhost";
$username = "";
$password = "";
$dbname = "";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
foreach ($csv as $linea) {
$url = $linea[0];
$sql = "INSERT INTO productos (nombre) VALUES('$name->plaintext')";
print ("<p> $sql </p>");
if ($conn->query($sql) === TRUE) {
echo "Items added to the database!";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
}
$conn->close();
?>
所以,我需要的是 MySQL 查询添加:
INSERT INTO productos (nombre) VALUES('CoolerMaster Devastator II Azul')
Items added to the database!
INSERT INTO productos (nombre) VALUES('Coolbox DeepTeam - Combo teclado, ratón y alfombrilla')
Items added to the database!
INSERT INTO productos (nombre) VALUES('Asus Claymore RED - Teclado gaming')
Items added to the database!
最佳答案
您的代码中有很多问题。
- 首先,您有函数 scrapUrl,它接受 $url 作为参数,但不输出任何内容。它正在设置全局 $name 变量,但是,尽管它找到了多个名称,但它只将最后一个名称放入 $name 变量中,因为它正在遍历一系列 $names,将其文本放入 $name 中,然后查找下一个,因此,只有最后一项存储到您的 $name 变量中。
我建议您更改 scrapUrl 函数,以便它将抓取产品的名称存储到数组中,并返回该数组。
其次,我无法理解您如何将数据放入 csv 文件中,您提供的代码看起来不应该正常工作。您确定在 csv 文件中写入正确的数据吗?也许您只是从文件中读取数据 - 在这种情况下,我很抱歉。
第三种:您正在从 csv 读取数据,并且在循环中逐行移动时,但数据无处可去。在我看来,您应该将 $linea[0] 放入 SQL 查询中,但是当 $name 在 scrapUrl 中仅设置一次时,您将 $name->plaintext 放入其中,正如我上面提到的。
我建议您在 SQL 查询中使用正确的变量来将数据传递给它。
此外,最好使用 PDO 和准备好的语句,而不是在字符串文字 SQL 查询中插入原始数据。
关于PHP 循环 INSERT MySQL 获取每个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47010924/