Heim > Artikel > Backend-Entwicklung > php通过curl单独抓取网页可以,抓取多个会出错
使用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等等。
<code class="php">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,'<a>'); $result = stristr($result, 'nbsp当前位置:'); $result = str_replace('nbsp当前位置:', '', $result); $result = stristr($result, '当前1/2页',true); $result = stristr($result, '通知公告'); $result = str_replace('通知公告</a>', '', $result); preg_match_all('/(? $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.'<br>'; $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", '<br>', $result); $result = preg_replace('/(\<br>){1,}/', '<br>', $result); echo $result; echo '<br><br>'; echo "退出makePage函数"; return $result; } }</code>
先用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等等。
<code class="php">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,'<a>'); $result = stristr($result, 'nbsp当前位置:'); $result = str_replace('nbsp当前位置:', '', $result); $result = stristr($result, '当前1/2页',true); $result = stristr($result, '通知公告'); $result = str_replace('通知公告</a>', '', $result); preg_match_all('/(? $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.'<br>'; $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", '<br>', $result); $result = preg_replace('/(\<br>){1,}/', '<br>', $result); echo $result; echo '<br><br>'; echo "退出makePage函数"; return $result; } }</code>
先用getJobsHubuNotice()函数获取新闻的链接,标题,日期,然后用makePage()函数获取内容
这是在makePage内部打印链接的结果,链接用浏览器打开没有问题.
你的PHP代码并没有出错, 初步怀疑是你请求时传递的 url 不正确, 见下图:
你代码中输出的那个错误, 其实是你获取到的网页上输出的内容.
再次更新,我想我知道你请求出错的原因是什么了:
你从网页中获取到的URL地址为: Detail.aspx?ArticleChannelId=81&ArticleId=2777
,
其中中 &
这个字符为 &
的HTML实体符, 在你输出的时候(即你的截图中)它显示的是&
, 而当你去真正请求的时候, 是使用的 下面这样的东东:
你只需要把它进行还原或者简单的, 把URL中的 &
替换为 &
然后再去请求就ok了.
再次更新:
<code class="php"><?php class HttpClient{ private $ch; function __construct($cookie_jar){ $this->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('/<td class="newslist" align="left"><a id=".+?" title="(.+?)" href="(.+?)" target="_self">.+?\s+\[(\d+\-\d+)\]/', $html, $links); array_shift($links);//删除掉第一个 $size = count($links[0]); for($i=0; $iGet(ROOT_URL . $url);//拼接完整的URL //$html 就是页面的内容 } <p>因为无聊帮你更新一下代码, 上面为我自己根据你之前的代码编写而成, 下图为运行结果(<code>makePage</code>里面加你自己的代码):</p> <p><img data-src="/img/bVp375" alt="php通过curl单独抓取网页可以,抓取多个会出错" ></p> <p class="answer fmt" data-id="1020000003789942"> </p> <p>makePage($link)<br>$link有值么,类型对么?</p> </a></td></code>