时间:2021-07-01 10:21:17 帮助过:16人阅读
使用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有值么,类型对么?
人气教程排行
-
174次
1
php如何获取跳转前的url
-
174次
2
php格林威治时间转换成当前时间的方法
-
174次
3
为什么php不能做大型系统?
-
174次
4
range函数怎么用
-
174次
5
php中计算页面加载时间几种方法总结_PHP教程
-
174次
6
求帮助,关于paypal支付返回值修改订单状态
-
174次
7
typecho怎么配置文章内容页?
-
174次
8
PhpStorm左侧structure不显示文件的方法列表是这么回事?
-
174次
9
查看PHP的环境变量_PHP
-
174次
10
PHP Primary script unknown 解决方法总结
-
174次
11
php的命名空间与自动加载实现方法
-
174次
12
解决laravel 出现ajax请求419(unknown status)的问题
-
173次
13
php 如何删除mysql记录
-
173次
14
PHP如何替换数组中的指定元素
-
173次
15
怎么去除字符串中非汉字、非字母、非数字的字符
-
173次
16
mysql如何一次执行多条SQL语句
-
173次
17
修改header里面的Connection为close解决方法
-
173次
18
PHP基于session.upload_progress 实现文件上传进度显示功能详解
-
173次
19
php5.6.x到php7.0.x特性小结
-
172次
20
php为什么会出现504错误