我正在编写一个简单的爬虫,它从 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 重试。这大大减少了失败的情况,但有时在第二次尝试中也会失败。有没有更好的方法来确保我从页面获取数据。有没有办法继续尝试直到页面响应?
该网站可能设置了请求间隔限制以避免数据收集。出于某种原因...因此,不要只是复制别人的网站内容:)
或者,如果有 API,请使用它来加载/获取内容。
(从技术上讲,您可以让您的站点循环请求,直到它有正确的响应,使用间隔和重置时间限制以避免 PHP 停止。
也许每次发生异常时动态增加间隔并重试是一个好主意,如下所示:
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++;
}
}
}