使用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有值麼,類型對嗎?