使用 PHP 进行网络抓取
Web crawling using PHP
我正在编写一个简单的爬虫,它从 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,请将其用于 load/get 内容。
(从技术上讲,您可以让您的站点循环请求直到它有正确的响应,使用间隔和重置时间限制以避免 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++;
}
}
}
我正在编写一个简单的爬虫,它从 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,请将其用于 load/get 内容。
(从技术上讲,您可以让您的站点循环请求直到它有正确的响应,使用间隔和重置时间限制以避免 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++;
}
}
}