欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php通过curl单独抓取网页可以,抓取多个会出错

程序员文章站 2022-05-26 13:25:36
...

使用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等等。
php通过curl单独抓取网页可以,抓取多个会出错

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('/(? $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()函数获取内容
php通过curl单独抓取网页可以,抓取多个会出错

这是在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等等。
php通过curl单独抓取网页可以,抓取多个会出错

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('/(? $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()函数获取内容
php通过curl单独抓取网页可以,抓取多个会出错

这是在makePage内部打印链接的结果,链接用浏览器打开没有问题.

你的代码呢???

你的PHP代码并没有出错, 初步怀疑是你请求时传递的 url 不正确, 见下图:

php通过curl单独抓取网页可以,抓取多个会出错

你代码中输出的那个错误, 其实是你获取到的网页上输出的内容.


再次更新,我想我知道你请求出错的原因是什么了:
你从网页中获取到的URL地址为: Detail.aspx?ArticleChannelId=81&ArticleId=2777,

php通过curl单独抓取网页可以,抓取多个会出错

其中中 & 这个字符为 & 的HTML实体符, 在你输出的时候(即你的截图中)它显示的是&, 而当你去真正请求的时候, 是使用的 下面这样的东东:

php通过curl单独抓取网页可以,抓取多个会出错

你只需要把它进行还原或者简单的, 把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('/
.+?\s+\[(\d+\-\d+)\]/', $html, $links);

array_shift($links);//删除掉第一个

$size = count($links[0]);

for($i=0; $iGet(ROOT_URL . $url);//拼接完整的URL

    //$html 就是页面的内容
}

因为无聊帮你更新一下代码, 上面为我自己根据你之前的代码编写而成, 下图为运行结果(makePage里面加你自己的代码):

php通过curl单独抓取网页可以,抓取多个会出错

makePage($link)
$link有值么,类型对么?

php通过curl单独抓取网页可以,抓取多个会出错

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频


网友评论

文明上网理性发言,请遵守 新闻评论服务协议

我要评论
  • php通过curl单独抓取网页可以,抓取多个会出错
  • 专题推荐

    作者信息
    php通过curl单独抓取网页可以,抓取多个会出错

    认证0级讲师

    推荐视频教程
  • php通过curl单独抓取网页可以,抓取多个会出错javascript初级视频教程
  • php通过curl单独抓取网页可以,抓取多个会出错jquery 基础视频教程
  • 视频教程分类
    相关标签: php curl