Php 从一个表(mysql)获取每个标题,从另一个表获取url,并使用标题提取每个url上的数据
我有两个表“product_title”有产品标题,“product_list_url”有产品列表页面的url。我想从产品标题表中获取标题,逐个获取并转到每个url,在页面上搜索相同的标题,如果找到,提取一些数据并保存到数据库中 我想检查每个url上的每个产品。但未能获得所需的结果 这是我的密码Php 从一个表(mysql)获取每个标题,从另一个表获取url,并使用标题提取每个url上的数据,php,mysql,Php,Mysql,我有两个表“product_title”有产品标题,“product_list_url”有产品列表页面的url。我想从产品标题表中获取标题,逐个获取并转到每个url,在页面上搜索相同的标题,如果找到,提取一些数据并保存到数据库中 我想检查每个url上的每个产品。但未能获得所需的结果 这是我的密码 <?php set_time_limit(0); $dbhost = "localhost"; $dbuser = "root"; $dbpass = ""; $dbname = "crawl";
<?php
set_time_limit(0);
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "";
$dbname = "crawl";
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ("Error connecting to database");
mysql_select_db($dbname, $conn);
$q1 = mysql_query("SELECT * FROM `product-title`");
$q2 = mysql_query("SELECT * FROM `product-list-url`");
while($res1 = mysql_fetch_assoc($q1)){
$product_title = $res1['title'];
while($res2 = mysql_fetch_assoc($q2)){
$url = $res2['url'];
$html = file_get_contents($url);
$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$found = $xpath->evaluate("boolean(//span[contains(text(), '$product_title')])");
if($found == false){
echo "Not Found";
}
else{
$elements = $xpath->evaluate("//span[contains(text(), '$product_title' )]/following-sibling::div/span[@class='list_sale_price']");
if (!is_null($elements)) {
foreach ($elements as $element) {
$nodes = $element->childNodes;
foreach ($nodes as $node) {
$price = $node->nodeValue;
$price1 = preg_replace('/[^0-9-.]/','',$price);
$date = date('y-m-d');
mysql_query("INSERT INTO `prices` (`ptitle`, `price`, `date`) VALUES ('$product_title', '$price1', '$date')") or die(mysql_error());
}
}
}
}
}
}
?>
首先,mysql的使用是不好的。关于这个话题,我想你在寻找答案。您的表产品标题
必须对每个产品具有某种唯一的ID,对吗?我假设您的产品列表url
表也具有与第一个表中的产品匹配的ID。因为我没有任何表格结构,所以我会给你们举一些例子
SELECT t1.title
, t2.url
FROM `product-title` t1
JOIN `product-list-url` t2 ON t1.id = t2.id
只需重置指针,就可以处理第一个产品标题之后的记录。未测试,也未检查文档处理
<?php
set_time_limit(0);
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "";
$dbname = "crawl";
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ("Error connecting to database");
mysql_select_db($dbname, $conn);
$q1 = mysql_query("SELECT * FROM `product-title`");
$q2 = mysql_query("SELECT * FROM `product-list-url`");
while($res1 = mysql_fetch_assoc($q1))
{
$product_title = $res1['title'];
while($res2 = mysql_fetch_assoc($q2))
{
$url = $res2['url'];
$html = file_get_contents($url);
$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$found = $xpath->evaluate("boolean(//span[contains(text(), '$product_title')])");
if($found == false)
{
echo "Not Found";
}
else
{
$elements = $xpath->evaluate("//span[contains(text(), '$product_title' )]/following-sibling::div/span[@class='list_sale_price']");
if (!is_null($elements)) {
foreach ($elements as $element) {
$nodes = $element->childNodes;
foreach ($nodes as $node) {
$price = $node->nodeValue;
$price1 = preg_replace('/[^0-9-.]/','',$price);
$date = date('y-m-d');
mysql_query("INSERT INTO `prices` (`ptitle`, `price`, `date`) VALUES ('$product_title', '$price1', '$date')") or die(mysql_error());
}
}
}
}
}
mysql_data_seek($q2, 0);
}
?>
您的查询将从产品标题中获取第一条记录,并从产品列表url中搜索所有值。但是,它不会将结果集指针重置回第一条记录,因此对于产品标题上的每一条其他记录,获取产品列表url上的记录不会返回任何记录。尝试添加mysql\u data\u seek($q2,0)
在循环产品列表url以将指针重置回第一条记录后,将所有产品标题记录读入内存会快得多,从产品列表url获取每条记录一次,并根据每条存储的记录检查内容。它显示错误“连接超时,localhost上的服务器响应时间太长。”我的数据库中有4个URL和10个产品标题。它的速度很慢并不让我感到惊讶(它正在抓取40个XML文档,并将它们处理为可读格式),但令人惊讶的是它超时了。XML文档有多大?脚本的时间限制是多少?URL是外部的吗?您能否发布测试数据以便我们可以进行更多的调查?我没有使用XML文档。我正在处理使用html的外部URL,我已经设置了设置时间限制(0);
<?php
set_time_limit(0);
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "";
$dbname = "crawl";
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ("Error connecting to database");
mysql_select_db($dbname, $conn);
$product_titles = array();
$q1 = mysql_query("SELECT * FROM `product-title`");
while($res1 = mysql_fetch_assoc($q1))
{
$product_titles[] = $res1['title'];
}
$q2 = mysql_query("SELECT * FROM `product-list-url`");
while($res2 = mysql_fetch_assoc($q2))
{
$url = $res2['url'];
$html = file_get_contents($url);
$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
foreach($product_titles as $product_title)
{
$found = $xpath->evaluate("boolean(//span[contains(text(), '$product_title')])");
if($found == false)
{
echo "Not Found";
}
else
{
$elements = $xpath->evaluate("//span[contains(text(), '$product_title' )]/following-sibling::div/span[@class='list_sale_price']");
if (!is_null($elements))
{
foreach ($elements as $element)
{
$nodes = $element->childNodes;
foreach ($nodes as $node)
{
$price = $node->nodeValue;
$price1 = preg_replace('/[^0-9-.]/','',$price);
$date = date('y-m-d');
mysql_query("INSERT INTO `prices` (`ptitle`, `price`, `date`) VALUES ('$product_title', '$price1', '$date')") or die(mysql_error());
}
}
}
}
}
}
?>