使用 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,请使用它来加载/获取内容。

(从技术上讲,您可以让您的站点循环请求,直到它有正确的响应,使用间隔和重置时间限制以避免 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++;
        }
    }
}

最新更新