Php 将网页卷曲到数据库插入重复项

Php 将网页卷曲到数据库插入重复项,php,mysql,curl,Php,Mysql,Curl,我正在编写一个PHP脚本来获取网站内容,并将每个网页插入MySQL表中的一个单独帖子中。我选择的方法是cURL、一些正则表达式、preg_match_all、几个foreach循环,最后是MySQL查询。代码很好,所以我不会在这里发布 问题在于,当向数据库插入的帖子不到200篇时,脚本工作正常,但当数量超过~200篇时,浏览器从未停止加载。我想存储749个网页(每个网页的内容都是纯文本)。当我按stop键查看数据库时,数据库中大约有2000篇文章,每篇文章大约有5个副本 因此,我得出的结论是,有

我正在编写一个PHP脚本来获取网站内容,并将每个网页插入MySQL表中的一个单独帖子中。我选择的方法是cURL、一些正则表达式、preg_match_all、几个foreach循环,最后是MySQL查询。代码很好,所以我不会在这里发布

问题在于,当向数据库插入的帖子不到200篇时,脚本工作正常,但当数量超过~200篇时,浏览器从未停止加载。我想存储749个网页(每个网页的内容都是纯文本)。当我按stop键查看数据库时,数据库中大约有2000篇文章,每篇文章大约有5个副本

因此,我得出的结论是,有些东西(浏览器、服务器、数据库?)无法处理那么多页面,会中止进程并重新启动。我曾尝试在PHP中增加最大执行时间,对于cURL也是如此,但结果相同

这是我之前的一篇文章,在这个过程的早期我遇到了一些问题

我的问题很简单:有人知道这里出了什么问题吗

编辑;好吧,既然已经请求了,代码如下:

EDIT2;经过反复试验,我发现这个神奇的数字是152。脚本可以存储前151页,但当我将页数更改为152页时,数据库表中的文章数突然翻了一番,变成304页。有什么想法吗

EDIT3(好的一个):事实证明,脚本实际上执行了它在本地服务器上应该执行的操作。当我在web主机服务器上运行它时,问题就出现了

<?php
header('content-type: text/html; charset=utf-8');

// Initialize cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://data.riksdagen.se/anforandelista/?anflista=true&rm=&anftyp=Nej&d=&ts=&parti=sd&iid=&sz=1000&utformat=xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec ($ch);

 // Some regex preg_match fun
 $regex = '/<anforande_url_xml>(.*?)<\/anforande_url_xml>/';
 $regex1 = '/<avsnittsrubrik>(.*?)<\/avsnittsrubrik>/';
 $regex2 = '/<anforande_url_xml>http:\/\/data.riksdagen.se\/anforande\/(.*?)<\/anforande_url_xml>/';
 $regex3 = '/<dok_datum>(.*?)<\/dok_datum>/';
 $regex4 = '/<talare>(.*?)<\/talare>/';
 preg_match_all($regex, $contents, $link);
 preg_match_all($regex1, $contents, $rubrik);
 preg_match_all($regex2, $contents, $id);
 preg_match_all($regex4, $contents, $talare);
 preg_match_all($regex3, $contents, $datum);

 // Display list of all posts
 $j = 0;
 echo "<pre>";
 foreach ($link[1] as $row) {
echo $j . " <a href=\"display.php?id=" . $id[1][$j] . "\">" . $rubrik[0][$j] . "</a>" . "<br />";
$j++;
 }

ini_set('max_execution_time', 300);

// Create array with all URLs
foreach ($link[1] as $row) {
$link[] = $row;
}

// Insert the core content to array
$lines = Array();
foreach ($link[1] as $row) {
$contents = file_get_contents($row);
$regex = '/<anforandetext>(.*?)<\/anforandetext>/s';
preg_match_all($regex, $contents, $output);

if (is_array($output) && isset($output[0]) && !empty($output[0])){
$lines[] = $output[1];  
}
}

// Connect. Yes, I know decprecated. Later issue.
mysql_connect("host", "user", "pass") or die("Gick inte att ansluta.");
mysql_select_db("db");

// Insert into db
$h = 0;
foreach ($lines as $row) {
$utf_title = utf8_decode($rubrik[1][$h]);
$utf_speaker = utf8_decode($talare[1][$h]);
$utf_contents = utf8_decode($row[0]);
$date = utf8_decode($datum[1][$h]);

$query = "INSERT INTO riksdag (title, speaker, contents, date) VALUES('$utf_title', '$utf_speaker', '$utf_contents', '$date')";
mysql_query($query);
$h++;
}

echo "</pre>";

curl_close ($ch);
?>

您是否使用过任何工具来检查正在进行的呼叫?也许通过观察交通,你会看到它在循环。小提琴手,打嗝,线鲨。。。所有这些都应该有效。或者使用调试器或以其他方式调试代码-应该能够告诉您正在经历的场景。如何确定要扫描的URL?您是否采取措施防止扫描同一URL两次?如果代码正常,就不会有问题。不,在浏览器、服务器或数据库中都没有神奇的重复。提供代码以便我们能够提供帮助。我提供了上面的代码。正如你所看到的,这有点复杂。这就是为什么我想坚持主要问题。ficuscr,不,我从来没有使用过这样的工具。应该吗?用正则表达式解析HTML是不可靠的。请参阅以了解原因,以及使用PHP执行此操作的正确方法的示例。