我目前正在尝试从网站抓取大量数据,但我正在努力解决这个问题。它有一个a-z索引和1-20索引,所以它有一堆循环和DOM东西。但是,它在第一次运行时设法抓取并保存了大约10,000行,但现在我大约在15.000左右,并且每次运行只会爬行大约100行。
可能是因为它必须跳过已经插入的行(检查一下)。我想不出一种轻松跳过某些页面的方法,因为1-20索引变化很大(一个字母有18页,其他字母只有2页)。
我正在检查是否已存在具有给定ID的记录,如果没有,请插入它。我认为这将是缓慢的,所以现在在脚本星星之前我检索所有行,然后检查in_array(),假设它更快。但它不会起作用。
所以我的抓取器导航26个字母,每个字母20页,然后每页最多50次,所以如果你计算它,那就很多了。
想到逐字逐句地运行它,但是因为我仍然被困在" a"并且不能跳到" b"因为我会错过来自" a"。
的记录希望我已经解释了这个问题,足以让有人帮助我。我的代码看起来像这样:(我已经删除了一些东西,猜测所有重要的东西都在这里给你一个想法)
function in_array_r($needle, $haystack, $strict = false) {
foreach ($haystack as $item) {
if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
return true;
}
}
return false;
}
/* CONNECT TO DB */
mysql_connect()......
$qry = mysql_query("SELECT uid FROM tableName");
$all = array();
while ($row = mysql_fetch_array($qru)) {
$all[] = $row;
} // Retrieving all the current database rows to compare later
foreach (range("a", "z") as $key) {
for ($i = 1; $i < 20; $i++) {
$dom = new DomDocument();
$dom->loadHTMLFile("http://www.crawleddomain.com/".$i."/".$key.".htm");
$finder = new DomXPath($dom);
$classname="table-striped";
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
foreach ($nodes as $node) {
$rows = $finder->query("//a[contains(@href, '/value')]", $node);
foreach ($rows as $row) {
$url = $row->getAttribute("href");
$dom2 = new DomDocument();
$dom2->loadHTMLFile("http://www.crawleddomain.com".$url);
$finder2 = new DomXPath($dom2);
$classname2="table-striped";
$nodes2 = $finder2->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname2 ')]");
foreach ($nodes2 as $node2) {
$rows2 = $finder2->query("//a[contains(@href, '/loremipsum')]", $node2);
foreach ($rows2 as $row2) {
$dom3 = new DomDocument();
//
// not so important variable declarations..
//
$dom3->loadHTMLFile("http://www.crawleddomain.com".$url);
$finder3 = new DomXPath($dom3);
//2 $finder3->query() right here
$query231 = mysql_query("SELECT id FROM tableName WHERE uid='$uid'");
$result = mysql_fetch_assoc($query231);
//Doing this to get category ID from another table, to insert with this row..
$id = $result['id'];
if (!in_array_r($uid, $all)) { // if not exist
mysql_query("INSERT INTO')"); // insert the whole bunch
}
}
}
}
}
}
}
答案 0 :(得分:1)
$uid
未定义,此查询也没有意义:
mysql_query("INSERT INTO')");
您应该启用错误报告:
ini_set('display_errors',1);
error_reporting(E_ALL);
在您提出疑问后,您应该or die(mysql_error());
另外,我不妨说,如果我没有其他人愿意的话。不要使用mysql_*
函数。它们已被弃用,将从未来的PHP版本中删除。试试PDO。