使用PHP进行Web爬网

时间:2016-03-04 00:26:17

标签: php web-crawler simple-html-dom

我正在编写一个简单的抓取工具,它从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。这显着减少了失败案例,但有时它仍然在第二次尝试中失败。 有没有更好的方法来确保我从页面获取数据。有没有办法继续尝试直到页面响应?

2 个答案:

答案 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++;
        }
    }
}