我正在编写一个简单的抓取工具,它从engadget.com获取文章的链接,并为每篇文章保存整个html文档
$target_url = "http://www.engadget.com/all/page/1/";
$html = new simple_html_dom();
$html->load_file($target_url);
foreach($html->find('script') as $script){
if($script->type == "application/ld+json"){
$json_data = strip_tags($script);
if($content = json_decode($json_data)){
$listElements = $content->itemListElement;
foreach($listElements as $element){
echo "Running..";
$article_url = $element->url;
$article_page = new simple_html_dom();
try{
$article_page->load_file($article_url);
} catch (Exception $e) {
sleep(20);
$article_page->load_file($article_url);
} finally {
$filename = "raw_file".$file_num.".txt";
$file = fopen("C:\\xampp\\htdocs\\files\\".$filename,"w");
fwrite($file, $article_page);
fclose($file);
$file_num++;
}
}
}
}
}
大多数时候这种方法很好但有时页面无法加载,我得到503错误。为了解决这个问题,目前我暂停执行20秒,然后重试相同的url。这显着减少了失败案例,但有时它仍然在第二次尝试中失败。 有没有更好的方法来确保我从页面获取数据。有没有办法继续尝试直到页面响应?
答案 0 :(得分:2)
网站可能已设置请求间隔限制以避免数据收集。出于某种原因......所以,不要只是复制别人的网站内容:)
如果有API,请使用它来加载/获取内容。
(从技术上讲,你可以让你的网站循环请求,直到它有正确的响应,使用间隔和重置时间限制,以避免PHP停止。)
答案 1 :(得分:1)
每次发生异常时都可以增加间隔时间,然后再试一次,这可能是一个好主意,例如:
foreach ($listElements as $element) {
echo "Running..";
$article_url = $element->url;
$article_page = new simple_html_dom();
$interval = 0;
$tries = 0;
$success = false;
while (!$suceess && $tries < 5) {
try {
sleep($interval);
$article_page->load_file($article_url);
$success = true;
} catch (Exception $e) {
$interval += 20;
$tries ++;
$article_page->load_file($article_url);
} finally {
$filename = "raw_file".$file_num.".txt";
$file = fopen("C:\\xampp\\htdocs\\files\\".$filename,"w");
fwrite($file, $article_page);
fclose($file);
$file_num++;
}
}
}