php通過curl單獨抓取網頁可以,抓取多個會出錯

來源:互聯網
上載者:User

使用curl單獨抓取http://jobs.hubu.edu.cn/Detail.aspx?ArticleChannelId=81&ArticleId=5722可行,但是如果抓取相同類型的一系列網站就會出錯,將他們放在數組
$linkList中,分別是http://jobs.hubu.edu.cn/Detail.aspx?ArticleChannelId=81&ArticleId=5722, http://jobs.hubu.edu.cn/Detail.aspx?ArticleChannelId=81&ArticleId=5325等等。

function getJobsHubuNotice(){                $curl = curl_init('http://jobs.hubu.edu.cn/List.aspx?ArticleChannelId=81');    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);    $result = curl_exec($curl);            //內容處理    $result = strip_tags($result,'');    $result = stristr($result, 'nbsp當前位置:');    $result = str_replace('nbsp當前位置:', '', $result);    $result = stristr($result, '當前1/2頁',true);    $result = stristr($result, '通知公告');    $result = str_replace('通知公告', '', $result);    preg_match_all('/(?<=href=\").*?(?=\")/', $result, $arrayTemp);    $linkList = $arrayTemp[0];    preg_match_all('/(?<=title=\").*?(?=\")/', $result, $arrayTemp);    $titleList = $arrayTemp[0];    preg_match_all('/(?<=\[)\d*\-\d*(?=\])/', $result, $arrayTemp);    $dateList_temp = $arrayTemp[0];    $dateList = array();    $linkList = str_replace('Detail.aspx', 'http://jobs.hubu.edu.cn/Detail.aspx', $linkList);    foreach ($dateList_temp as $key => $value) {        $dateList[$key] = date('Y').'-'.$value;    }    $JobsHubu = array();            //分別獲得網頁上的每條通知的標題,連結,時間    $JobsHubu[0] = $dateList;    $JobsHubu[1] = $titleList;    $JobsHubu[2] = $linkList;    return $JobsHubu;}//function makePage($link){        .......   //省略部分代碼       else if(starts($link,'jobs.hubu'))      {        echo "進入makePage函數";        echo "處理網頁".$link.'
'; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL , $link); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($curl); //echo $result; //echo "result結束"; $result = strip_tags($result); $result = stristr($result, ' > 通知公告'); $result = str_replace(' > 通知公告', '', $result); $result = stristr($result, '$(document).ready',true); $result = trim($result); $result = str_replace("\r\n", '
', $result); $result = preg_replace('/(\){1,}/', '
', $result); echo $result; echo '

'; echo "退出makePage函數"; return $result; }}

先用getJobsHubuNotice()函數擷取新聞的連結,標題,日期,然後用makePage()函數擷取內容

這是在makePage內部列印連結的結果,連結用瀏覽器開啟沒有問題.

回複內容:

使用curl單獨抓取http://jobs.hubu.edu.cn/Detail.aspx?ArticleChannelId=81&ArticleId=5722可行,但是如果抓取相同類型的一系列網站就會出錯,將他們放在數組
$linkList中,分別是http://jobs.hubu.edu.cn/Detail.aspx?ArticleChannelId=81&ArticleId=5722, http://jobs.hubu.edu.cn/Detail.aspx?ArticleChannelId=81&ArticleId=5325等等。

function getJobsHubuNotice(){                $curl = curl_init('http://jobs.hubu.edu.cn/List.aspx?ArticleChannelId=81');    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);    $result = curl_exec($curl);            //內容處理    $result = strip_tags($result,'');    $result = stristr($result, 'nbsp當前位置:');    $result = str_replace('nbsp當前位置:', '', $result);    $result = stristr($result, '當前1/2頁',true);    $result = stristr($result, '通知公告');    $result = str_replace('通知公告', '', $result);    preg_match_all('/(?<=href=\").*?(?=\")/', $result, $arrayTemp);    $linkList = $arrayTemp[0];    preg_match_all('/(?<=title=\").*?(?=\")/', $result, $arrayTemp);    $titleList = $arrayTemp[0];    preg_match_all('/(?<=\[)\d*\-\d*(?=\])/', $result, $arrayTemp);    $dateList_temp = $arrayTemp[0];    $dateList = array();    $linkList = str_replace('Detail.aspx', 'http://jobs.hubu.edu.cn/Detail.aspx', $linkList);    foreach ($dateList_temp as $key => $value) {        $dateList[$key] = date('Y').'-'.$value;    }    $JobsHubu = array();            //分別獲得網頁上的每條通知的標題,連結,時間    $JobsHubu[0] = $dateList;    $JobsHubu[1] = $titleList;    $JobsHubu[2] = $linkList;    return $JobsHubu;}//function makePage($link){        .......   //省略部分代碼       else if(starts($link,'jobs.hubu'))      {        echo "進入makePage函數";        echo "處理網頁".$link.'
'; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL , $link); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($curl); //echo $result; //echo "result結束"; $result = strip_tags($result); $result = stristr($result, ' > 通知公告'); $result = str_replace(' > 通知公告', '', $result); $result = stristr($result, '$(document).ready',true); $result = trim($result); $result = str_replace("\r\n", '
', $result); $result = preg_replace('/(\){1,}/', '
', $result); echo $result; echo '

'; echo "退出makePage函數"; return $result; }}

先用getJobsHubuNotice()函數擷取新聞的連結,標題,日期,然後用makePage()函數擷取內容

這是在makePage內部列印連結的結果,連結用瀏覽器開啟沒有問題.

你的代碼呢???

你的PHP代碼並沒有出錯, 初步懷疑是你請求時傳遞的 url 不正確, 見:

你代碼中輸出的那個錯誤, 其實是你擷取到的網頁上輸出的內容.

再次更新,我想我知道你請求出錯的原因是什麼了:
你從網頁中擷取到的URL地址為: Detail.aspx?ArticleChannelId=81&ArticleId=2777,

其中中 & 這個字元為 & 的HTML實體符, 在你輸出的時候(即你的中)它顯示的是&, 而當你去真正請求的時候, 是使用的 下面這樣的東東:

你只需要把它進行還原或者簡單的, 把URL中的 & 替換為 & 然後再去請求就ok了.

再次更新:

ch = curl_init();        curl_setopt($this->ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; QQDownload 685; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)');//UA        curl_setopt($this->ch, CURLOPT_TIMEOUT, 40);        curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, TRUE);        curl_setopt($this->ch, CURLOPT_AUTOREFERER, true);        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, TRUE);        curl_setopt($this->ch, CURLOPT_ENCODING, 'UTF-8');        curl_setopt($this->ch, CURLOPT_COOKIEJAR, $cookie_jar);        curl_setopt($this->ch, CURLOPT_COOKIEFILE, $cookie_jar);    }    function __destruct(){        curl_close($this->ch);    }    final public function setReferer($ref=''){        if($ref != ''){            curl_setopt($this->ch, CURLOPT_REFERER, $ref);        }    }    final public function Get($url, $header=false, $nobody=false){        curl_setopt($this->ch, CURLOPT_POST, false);        curl_setopt($this->ch, CURLOPT_URL, $url);        curl_setopt($this->ch, CURLOPT_HEADER, $header);        curl_setopt($this->ch, CURLOPT_NOBODY, $nobody);        return curl_exec($this->ch);    }    final public function Post($url, $data=array(), $header=false, $nobody=false){        curl_setopt($this->ch, CURLOPT_URL, $url);        curl_setopt($this->ch, CURLOPT_HEADER, $header);        curl_setopt($this->ch, CURLOPT_NOBODY, $nobody);        curl_setopt($this->ch, CURLOPT_POST, true);        curl_setopt($this->ch, CURLOPT_POSTFIELDS, http_build_query($data));        return curl_exec($this->ch);    }}const ROOT_URL = 'http://jobs.hubu.edu.cn/';$home = 'http://jobs.hubu.edu.cn/List.aspx?ArticleChannelId=81';$http = new HttpClient('cookie.txt');//擷取列表頁$html = $http->Get($home);//用正則匹配出來 當前頁 所有的 文章preg_match_all('/.+?<\/a>\s+\[(\d+\-\d+)\]/', $html, $links);array_shift($links);//刪除掉第一個$size = count($links[0]);for($i=0; $i<$size; $i++){//有匹配到結果    $title = $links[0][$i];    $url = htmlspecialchars_decode($links[1][$i]);//還原URL中的 HTML 實體符為原始的字元    $date = date('Y') . '-' . $links[2][$i];    echo $date, "\t", $title, "\t", $url, "\n";    //makePage($url);}function makePage($url){    global $http;//使用全域變數中的那個 HttpClient 執行個體    $html = $http->Get(ROOT_URL . $url);//拼接完整的URL    //$html 就是頁面的內容}

因為無聊幫你更新一下代碼, 上面為我自己根據你之前的代碼編寫而成, 為運行結果(makePage裡面加你自己的代碼):

makePage($link)
$link有值麼,類型對嗎?

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.