新浪新闻爬虫程序

package com.lxf.crawler;
import java.io.File;
import java.io.FileWriter;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.Tag;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.util.NodeList;
import com.lxf.dao.bean.NewsBean;
import com.lxf.dao.imp.NewsDao;
import com.lxf.dao.inf.NewsDaoInf;
/**
 * <爬虫程序> 从新浪新闻中爬取新闻分类、标题及内容 (需导入htmlparser.jar包)
 *
 * @author 刘向峰
 */
public class SinaNews {
    /**
     * 测试入口
     *
     * @param args
     */
    public static void main(String args[]) {
        // china world
        // society media opinion
        String type = "world";
        File file = new File(type);
        if (!file.exists())// 如果不存在就创建
        {
            file.mkdirs();
        }
        SinaNews gn = new SinaNews();
        String a = gn.getNews(type);
        // gn.writefile(a, "SinaNews.html",type);
    }
    // 抓取信息 组成良好格式
    public String getNews(String type) {
        NewsDaoInf dao = new NewsDao();
        try {
            NodeFilter filter = new TagNameFilter("ul");
            Parser parser = new Parser();
            Parser bodyparser = new Parser();
            parser.setURL("http://news.sina.com.cn/" + type + "/");// 互联网模块的地址
            // System.out.println(parser.getEncoding());
            parser.setEncoding("gb2312");
            NodeList list = parser.extractAllNodesThatMatch(filter);
            StringBuilder newsStr = new StringBuilder(
                    "<!DOCTYPE html><html><head></head><body><table>");// 新闻表格字符串
            SinaNews gn = new SinaNews();
            for (int i = 0; i < list.size() - 1; i++) {
                Tag node = (Tag) list.elementAt(i);
                for (int j = 1; j < node.getChildren().size(); j++) {
                    String textstr = node.getChildren().elementAt(j).toHtml()
                            .trim();
                    if (textstr.length() > 0) {
                        int linkbegin = textstr.indexOf("href=");// 截取<a>链接字符串起始位置
                        int linkend = textstr.indexOf("\">");// 截取<a>链接字符串结束位置
                        String sublink = textstr.substring(linkbegin + 6,
                                linkend);
                        // 链接字符串
                        String link = "";
                        if (sublink.indexOf("target") != -1) {
                            link = sublink.substring(0, sublink.indexOf("\""));
                        } else {
                            link = sublink;// 链接字符串
                        }
                        int titlebegin = textstr.indexOf("\">");
                        int titleend = textstr.indexOf("</a>");
                        String title = textstr.substring(titlebegin + 2,
                                titleend).trim();
                        System.out.println("正在抓取: " + title);
                        // 通过标题判断该新闻是否已经存在
                        if (dao.hasNews(title)) {
                            System.out.println("【该记录已经存在】");
                            continue;
                        }
                        if (title.contains("视频:") || title.contains("视频:")) {
                            System.out.println("【无法获得视频新闻】");
                            continue;
                        }
                        if (title.contains("(图)")) {
                            title = title.replace("(图)", "");
                        }
                        try {
                            /** 新闻内容处理开始 */
                            NodeFilter bodyfilter = new AndFilter(
                                    new TagNameFilter("div"),
                                    new HasAttributeFilter("id", "artibody"));
                            bodyparser.setURL(link);// 地址url
                            // bodyparser.setEncoding(bodyparser.getEncoding());
                            bodyparser.setEncoding("gb2312");
                            NodeList bodylist = bodyparser
                                    .extractAllNodesThatMatch(bodyfilter);
                            // 新闻内容字符串
                            if (bodylist.elementAt(0) == null) {
                                System.out.println("【新闻无内容】");
                                continue;
                            }
                            String newstextstr = bodylist.elementAt(0).toHtml()
                                    .trim();
                            // 只保留正文内容,保留P标签以保持其排版
                            int bodybegin = newstextstr.indexOf("<p>");
                            int bodyend = newstextstr.lastIndexOf("</p>") + 4;
                            int bodyimgbegin = newstextstr
                                    .indexOf("<div class=\"img_wrapper\">");
                            int bodyimgend = newstextstr
                                    .lastIndexOf("<span class=\"img_descr\">");
                            String body = "";
                            if (bodybegin < 0) {
                                body = newstextstr;
                            } else {
                                body = newstextstr
                                        .substring(bodybegin, bodyend);
                            }
                            if (bodyimgbegin >= 0) {
                                body = newstextstr.substring(bodyimgbegin,
                                        bodyimgend) + "</div>" + body;
                            }
                            /** 写入数据库 */
                            NewsBean newsBean = new NewsBean(0, title, body,
                                    link, link.substring(
                                            link.lastIndexOf("/") - 10,
                                            link.lastIndexOf("/")), type);
                            dao.add(newsBean);
                            // gn.writefile(body, link,type); // 写文件
                        } catch (Exception e) {
                            System.out.println("抓取信息子页面出错,出错信息为:");
                            e.printStackTrace();
                            /** 新闻内容处理结束 */
                        }
                        /** 将标题拼接到字符串中 */
                        newsStr.append("<tr><td><a target=\"_blank\" href=\""
                                + link + "\">");
                        newsStr.append(title);
                        newsStr.append("</a></td></tr>");
                    }
                }
            }
            newsStr.append("</table></body></html>");
            return newsStr.toString();
        } catch (Exception e) {
            System.out.println("抓取信息出错,出错信息为:");
            e.printStackTrace();
            return "";
        }
    }
    // 写文件
    public void writefile(String str, String filename, String type) {
        if (filename.contains(".cn/")) {
            filename = type
                    + "\\"
                    + filename.substring(filename.indexOf(".cn/") + 4).replace(
                            "/", "_");
        } else {
            filename = type + "\\" + filename;
        }
        File file = new File(filename);
        if (!file.exists() && filename.indexOf("/") != -1)// 如果不存在就创建
        {
            file.mkdirs();
        }
        try {
            FileWriter writer = new FileWriter(filename);
            writer.write(str);
            writer.close();
            System.out.println("成功生成新闻页面" + filename);
        } catch (Exception e) {
            System.out.println("将信息写入文件" + filename + "发生错误,错误信息为:");
            e.printStackTrace();
        }
    }
}
时间: 2024-10-03 20:04:34

新浪新闻爬虫程序的相关文章

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

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

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

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

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

门户级UGC系统的技术进化路线——新浪新闻评论系统的架构演进和经验总结(转)

add by zhj:先收藏了 摘要:评论系统是所有门户网站的核心标准服务组件之一.本文作者曾负责新浪网评论系统多年,这套系统不仅服务于门户新闻业务,还包括调查.投票等产品,经历了从单机到多机再到集群,从简单到复杂再回归简单的过程. 评论系统,或者称为跟帖.留言板,是所有门户网站的核心标准服务组件之一.与论坛.博客等其他互联网UGC系统相比,评论系统虽然从产品功能角度衡量相对简单,但因为需要能够在突发热点新闻事件时,在没有任何预警和准备的前提下支撑住短短几分钟内上百倍甚至更高的访问量暴涨,而评论

腾讯、网易、新浪新闻网站爬虫编写记录及评论格式分析

0 前言 先说说看这篇博客你能知道什么:1 腾讯.网易.新浪不同新闻的地址格式以及评论内容的地址格式(返回数据为json的异步接口):2 一些比较通用的设计方法,对软件设计的菜鸟可能有帮助: 之前也说了要写这边博客,现在终于写出来了.我的毕业设计的指导老师说毕设论文的字数不够--所以我决定把这些本不应该出现在论文中的实现细节凑到论文中.至于下面说到的东西要解决什么问题,各位可以先看看这个网站(我毕设的初步结果,目前还在优化中,包括代码结构还有UI设计):http://reetseenews.du

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

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

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

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

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

朴素贝叶斯应用-机器学习-新浪新闻分类器 本文代码及数据均来自于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的综合布局实现的新浪新闻的效果. 源码运行截图