goutte http请求不创建多个实例
goutte http request not creating multiple instances
当我尝试在 while 循环中使用 goutte 时,goutte 实例只创建一次,现在重复了 20 次,因为我希望每个循环都有一个新实例。过滤掉数据的结果是第一个实例中的数据重复二十次,而我想要的是所有 20 页上的单独数据。
while($count <=20) {
$new_url = $url .$count;
$check[] = $new_url;
//get a goutte object of each new url returned after each loop
$crawler = Goutte::request('GET', $new_url);
//get all text from a table data of class narrow
$results = $crawler->filter($lin)->each(function ($node, $i) {
return $node->text();
});
$pattern = 'tr>td.pu>a';
//get all the links inside table data of class a
$links = $crawler->filter($pattern)->each(function ($node, $i) {
$href = $node->extract(array('href')); // This is a DOMElement Object
return $href;
});
//filter the links for the needed one which is always greater than 30 characters
foreach($links as $link){
if(strlen($link[0]) > 30){
$p_links[] = $link;
}
}
for($i =0; $i<count($results)-3; $i++){
$content[] = ['comments' => $results[$i], 'links' => 'http://www.nairaland.com' . $p_links[$i][0]];
}
//add the data to an array
$data[] = $content;
$count++;
$crawler = null;
}
然后我在 while 循环外返回了数据
您正在使用自己的集成(Lavavel 中的 Goutte),因此请查看您的 Goutte::request()
以找出原因。
此外,以后请仅包含相关代码,以简化对问题的理解(我认为循环内的大部分代码都与此post中的问题无关,但也许我错了).
我最终能够通过将循环内的整个 goutte 代码移动到另一个函数然后在循环内调用该函数来解决这个问题。这是有效的,因为每个 goutte 实例都是在循环内的每个函数调用中独立创建和使用的。
当我尝试在 while 循环中使用 goutte 时,goutte 实例只创建一次,现在重复了 20 次,因为我希望每个循环都有一个新实例。过滤掉数据的结果是第一个实例中的数据重复二十次,而我想要的是所有 20 页上的单独数据。
while($count <=20) {
$new_url = $url .$count;
$check[] = $new_url;
//get a goutte object of each new url returned after each loop
$crawler = Goutte::request('GET', $new_url);
//get all text from a table data of class narrow
$results = $crawler->filter($lin)->each(function ($node, $i) {
return $node->text();
});
$pattern = 'tr>td.pu>a';
//get all the links inside table data of class a
$links = $crawler->filter($pattern)->each(function ($node, $i) {
$href = $node->extract(array('href')); // This is a DOMElement Object
return $href;
});
//filter the links for the needed one which is always greater than 30 characters
foreach($links as $link){
if(strlen($link[0]) > 30){
$p_links[] = $link;
}
}
for($i =0; $i<count($results)-3; $i++){
$content[] = ['comments' => $results[$i], 'links' => 'http://www.nairaland.com' . $p_links[$i][0]];
}
//add the data to an array
$data[] = $content;
$count++;
$crawler = null;
}
然后我在 while 循环外返回了数据
您正在使用自己的集成(Lavavel 中的 Goutte),因此请查看您的 Goutte::request()
以找出原因。
此外,以后请仅包含相关代码,以简化对问题的理解(我认为循环内的大部分代码都与此post中的问题无关,但也许我错了).
我最终能够通过将循环内的整个 goutte 代码移动到另一个函数然后在循环内调用该函数来解决这个问题。这是有效的,因为每个 goutte 实例都是在循环内的每个函数调用中独立创建和使用的。