thinkphp 新浪新闻采集代码演示

<?php
namespace Home\Controller;
use Think\Controller;

class CollectController extends Controller {
    //采集新闻列表包括标题,链接,简介并保存
    public function index() {
        $contents = file_get_contents(‘http://news.sohu.com/guoneixinwen.shtml‘); //搜狐国内新闻首页
        $contents = mb_convert_encoding($contents, "UTF-8", "gb2312");
        $preg = ‘/maxPage = (\d+);/is‘;
        preg_match_all($preg, $contents, $arr);
        $num = $arr[1][0]; //新闻列表url最新顺序码
        $preg1 = ‘/(上一页|下一页|尾页|末页)/‘;//根据页面情况写正则
        preg_match_all($preg1, $contents, $arr1);
        if (isset($_GET[‘id‘])) {
            if ($arr1[1] !== null && $_GET[‘id‘] <= C(‘COLLECT_PAGE‘)) { //配置中数组采集页数
                $url = ‘http://news.sohu.com/guoneixinwen_‘ . ($num - $_GET[‘id‘]) . ‘.shtml‘; //搜狐国内新闻分页
                $id = ++$_GET[‘id‘];
            }
            else {
                echo ‘列表采集结束,将继续采集正文内容‘;
                $this->index1();
            }
        }
        else {
            //实时新闻,避免重复,数据,图片要清空,也可以保存上次的页码,留下次继续,但比较复杂,这里是清空
            $this->deleteTable(‘think_news‘); //清空表
            delFile(ROOT . ‘/z2/Public/Uploads/sohu/‘); //清空图片
            $url = ‘http://news.sohu.com/guoneixinwen.shtml‘; //搜狐国内新闻首页
            $id = 1;
        }
        echo ‘第‘ . $id . ‘页列表采集中......‘;
        $contents = mb_convert_encoding(file_get_contents($url), "UTF-8", "gb2312"); //转码
        $preg = ‘/<h3><span class="com-num"><a target="_blank" href="#">comment num<\/a><\/span><a target="_blank" href="(http:\/\/.*)(?#链接)">(.*)(?#标题)<\/a><\/h3>\s*<p>(.*)(?#简介)<a target="_blank" href="http:\/\/.*">.*<\/a><\/p>/Uims‘;
        preg_match_all($preg, $contents, $arr);
        $news = M(‘News‘);
        foreach ($arr[1] as $key => $value) {
            $data[‘title‘] = $arr[2][$key];
            $data[‘url‘] = $value;
            $data[‘info‘] = $arr[3][$key];
            $news->create($data);
            $news->add();
        }
        echo ‘<script>location.href="‘ . U(‘collect/index‘, array(‘id‘ => $id)) . ‘"</script>‘;
    }
    //根据采采集的url采集正文内容及图片并保存
    public function index1() {
        $news = M(‘News‘);
        if (isset($_GET[‘cid‘])) $cid = $_GET[‘cid‘];
        else $cid = 0;
        $map[‘id‘] = array(‘gt‘, $cid);
        $result = $news->field(‘id,url‘)->where($map)->find();
        if (null != $result) {
            $contents = mb_convert_encoding(file_get_contents($result[‘url‘]), "UTF-8", "gb2312");
            $preg = ‘/(<div itemprop="articleBody">.*)(?#正文)<!-- seo标签描述 -->/is‘;
            preg_match_all($preg, $contents, $arr);
            $contents1 = $arr[1][0]; //正文内容
            if (!!$path = $this->getPath($contents1)) { //正文内的图片远程路径数组
                $savePath = $this->saveImage($path); //保存图片并获取本地保存绝对路径
                $contents1 = str_ireplace($path, $savePath, $contents1); //远程图片路径替换为本地绝对路径

            }
            $news->where(‘id=‘ . $result[‘id‘])->setField(‘contents‘, htmlspecialchars($contents1));
            echo ‘id为‘ . $result[‘id‘] . ‘的正文内容采集中......‘;
            $cid = ++$cid;
            echo ‘<script>location.href="‘ . U(‘collect/index1‘, array(‘cid‘ => $cid)) . ‘"</script>‘;
        }
        else {
            echo ‘正文内容采集结束,以下是采集内容显示‘;
            echo ‘<script>location.href="‘ . U(‘collect/index2‘) . ‘"</script>‘;
        }
    }
    //内容显示简页
    public function index2() {
        $news = M(‘News‘);
        $result = $news->where($map)->select();
        $this->assign(‘aa‘, $result);
        //$a = $this->buildHtml(‘1‘, HTML_PATH . ‘/collect/‘, APP_PATH . ‘Admin/View/Login/index.html‘);
        //echo $a;
        $this->display();

    }
    //清空表
    private function deleteTable($table) {
        $sql = "TRUNCATE TABLE $table";
        M()->execute($sql);
    }
    //获取正文内容中的远程图片路径并返回,参数采集的正文内容
    private function getPath($contents) {
        $path = array();
        if ($contents == null) return false;
        $preg = ‘/<img src="(http:\/\/.*)" alt=.*\/>/Uis‘;
        if (preg_match_all($preg, $contents, $arr)) {
            foreach ($arr[1] as $key => $value) {
                $path[] = $value; //获取远程图片路径
            }
            return $path; //返回远程图片路径
        }
        return false;
    }
    //保存图片并返回本地绝对路径,参数远程图片路径数组
    private function saveImage($path) {
        if ($path == ‘‘) return false;
        $pathArr = array();
        foreach ($path as $key => $value) {
            $url = $value; //远程图片路径
            $filename = substr($value, strripos($value, ‘/‘)); //图片名.后缀
            $savePath = ‘./Public/Uploads/sohu‘ . $filename; //保存路径
            ob_start(); //开启缓冲
            readfile($url); //读取图片
            $img = ob_get_contents(); //保存到缓冲区
            ob_end_clean(); //关闭缓冲
            $fp2 = @fopen($savePath, "a"); //打开本地保存图片文件
            fwrite($fp2, $img); //写入图片
            fclose($fp2);
            $pathArr[] = ‘http://localhost:9096/z2/‘ . str_ireplace(‘./‘, ‘‘, $savePath); //保存图片绝对路径
        }
        return $pathArr; //返回本地保存绝对路径
    }
}
/*
z2是我的app名
相关代码
//删除文件夹里的文件,放公共函数文件里
function delFile($dir) {
    $dh = opendir($dir);
    while ($file = readdir($dh)) {
        if ($file != "." && $file != "..") {
            $fullpath = $dir . "/" . $file;
            if (!is_dir($fullpath)) {
                unlink($fullpath);
            }
            else {
                deldir($fullpath);
            }
        }
    }
    closedir($dh);
}
//入口文件
define(‘ROOT‘,$_SERVER[‘DOCUMENT_ROOT‘]);
//配置文件
‘COLLECT_PAGE‘=> ‘10‘,//采集新闻列表页数
//图片本地保存目录‘./Public/Uploads/sohu‘
//index2模板代码
<volist name=‘aa‘ id=‘vo‘>
    <div style="width:800px;margin:0 auto;">
    <h2>{$vo.id}.{$vo.title}</h2>
        {$vo.contents|htmlString_decode}
        <p>原文链接:<a href="{$vo.url}" target="blank">{$vo.url}</a></p>
    </div><br><br><br><br><br><br><br>
</volist>
//表结构
--
-- `think_news`
--
CREATE TABLE IF NOT EXISTS `think_news` (
  `id` int(5) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `url` varchar(255) DEFAULT NULL,
  `info` text,
  `contents` text,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC ;
*/
时间: 2024-10-12 21:18:43

thinkphp 新浪新闻采集代码演示的相关文章

前嗅ForeSpider教程:采集新浪新闻

最近后台有很多童鞋问怎么采集新闻,今天小编以采集新浪新闻为例,来为大家进行演示,同样适用于其他新闻网站的采集,具体操作如下: ? 第一步:新建任务 ①点击左上角"加号"新建任务,如图1:?②在弹窗里填写采集地址,任务名称,如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集当前列表页新闻的正文数据,正文数据是通过点击列表链接进入的,所以本次需要抽取列表链接,所以点击抽取链接,如图3:第二步:通过定位过滤.地址过滤,得到所需链接 ①按住Ctrl+鼠标左键,进行区域选择,按住Shi

Python_网络爬虫(新浪新闻抓取)

爬取前的准备: BeautifulSoup的导入:pip install BeautifulSoup4 requests的导入:pip install requests 下载jupyter notebook:pip install jupyter notebook 下载python,配置环境(可使用anocanda,里面提供了很多python模块) json 定义 :是一种格式,用于数据交换. Javascript 对象 定义 : 一种javascript的引用类型 中文格式除了' utf-8

Android仿新浪新闻SlidingMenu界面的实现 .

先看看原图: 如图所示,这种侧滑效果以另一种方式替代了原先tab导航的那种用户体验方式 给人耳目一新的感觉,现已被广大知名应用所效仿,如新浪新闻,网易新闻,人人网等 那么这种效果该如何实现呢?那就需要用到一个开源库SlidingMenu Github地址:https://github.com/jfeinstein10/SlidingMenu 里面包含了demo示例,相关效果图如下: 同时该库又依赖另一个开源库ActionBarSherkLock ,有关该库的介绍,请看此博文http://blog

Python爬虫:新浪新闻详情页的数据抓取(函数版)

上一篇文章<Python爬虫:抓取新浪新闻数据>详细解说了如何抓取新浪新闻详情页的相关数据,但代码的构建不利于后续扩展,每次抓取新的详情页时都需要重新写一遍,因此,我们需要将其整理成函数,方便直接调用. 详情页抓取的6个数据:新闻标题.评论数.时间.来源.正文.责任编辑. 首先,我们先将评论数整理成函数形式表示: 1 import requests 2 import json 3 import re 4 5 comments_url = 'http://comment5.news.sina.c

python爬虫:抓取新浪新闻内容(从当前时间到之前某个时间段),并用jieba分词,用于训练自己的分词模型

新浪新闻内容采用的是ajax动态显示内容,通过抓包,发现如下规律: 每次请求下一页,js那一栏都会出现新的url: "http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1" "||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&ta

机器学习实战教程(五):朴素贝叶斯实战篇之新浪新闻分类

原文链接: Jack-Cui,https://cuijiahua.com/blog/2017/11/ml_5_bayes_2.html 一.前言 上篇文章机器学习实战教程(四):朴素贝叶斯基础篇之言论过滤器讲解了朴素贝叶斯的基础知识.本篇文章将在此基础上进行扩展,你将看到以下内容: 拉普拉斯平滑 垃圾邮件过滤(Python3) 新浪新闻分类(sklearn) 二.朴素贝叶斯改进之拉普拉斯平滑 上篇文章提到过,算法存在一定的问题,需要进行改进.那么需要改进的地方在哪里呢?利用贝叶斯分类器对文档进行

朴素贝叶斯应用-机器学习-新浪新闻分类器

朴素贝叶斯应用-机器学习-新浪新闻分类器 本文代码及数据均来自于https://cuijiahua.com/blog/2017/11/ml_5_bayes_2.html 这个例子比较有实践意义,不仅使用了jieba.sklearn,并且其中用到的思想也是很实用的. jieba "结巴"中文分词:做最好的Python中文分词组件 "Jieba" jieba有三种分词模式:全模式.精确模式和搜索引擎模式 示例: #encoding=utf-8 import jieba

Fragment+TabHost模仿新浪新闻布局界面

Fragment+TabHost模仿新浪新闻布局界面 支持平台:Android   运行环境:Eclipse   开发语言:Java 下载地址:http://sina.lt/yZe 源码简介 采用FragmentTabHost的综合布局实现的新浪新闻的效果. 源码运行截图  

新浪新闻客户端源码

高仿新浪新闻客户端,实现了大部分功能以及界面部分,自动获取新闻信息数据.定位当前位置获取气象信息数据并展示,有兴趣的可以看看. 下载地址:http://www.devstore.cn/code/info/1014.html 运行截图: