使用jsoup抓取新闻信息

1,jsoup简介

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。jsoup 是基于 MIT 协议发布的,可放心使用于商业项目。

jsoup 的主要功能如下:

1. 从一个 URL,文件或字符串中解析 HTML;

2. 使用 DOM 或 CSS 选择器来查找、取出数据;

3. 可操作 HTML 元素、属性、文本;

2,jsoup使用

1,下载jsoup的jar包:http://jsoup.org/download

2, jsoup英文的开发手册:http://jsoup.org/cookbook/

3,jsoup的jsoup cookbook中文版:http://www.open-open.com/jsoup/

3,新闻抓取要求

新闻筛选过程:(以“新浪财经 “为例) http://finance.sina.com.cn/

1. 选择方向

(1)宏观新闻:宏观新闻:包括一些重大的国内外宏观调控,我国银监会等监管机构出台的一些文件,或者例如自贸区发展,金砖银行成立等国内重大金融新闻。

(2)公司新闻:包括客户公司或其他大型金融机构的管理层变动,兼并收购,战略转型,新推产品等新闻。

2. 网页选择

1.宏观新闻:进入http://finance.sina.com.cn/       -----》         首页“要闻“

2.公司新闻:进入http://finance.sina.com.cn/               选择“银行“ -》 ”要闻“

            

3,抓取要求

1,要求抓取要闻部分所有网址,标题,关键字。

2,要求抓取1中网址下的正文。

3,并且前一天看过的新闻不能存在于后一天。

4,代码实现

package sinaSpider;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class GetSinaInfo {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        getSinaInforamtion();
    }
    public static  void getSinaInforamtion()
    {
        Map<String,String> pathMap=createNewFiles();
        try {
            getSinaYaoWen(pathMap);
            getSinaChangJing(pathMap);
            getSinaBank(pathMap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void getSinaYaoWen(Map<String,String> pathMap) throws IOException
    {
        String YaoWenTextPath=pathMap.get("yaowen")+"//yaowen"+GetDate()+"outputText.txt";
        String YaoWenTitlePath=pathMap.get("yaowen")+"//yaowen"+GetDate()+"outputTitle.txt";
        String YaoWenUrlPath=pathMap.get("yaowen")+"//"+GetDate()+"url.txt";

        FileWriter urlWriter = new FileWriter(YaoWenUrlPath);
        FileWriter textWriter = new FileWriter(YaoWenTextPath);
        FileWriter titleWriter = new FileWriter(YaoWenTitlePath);

        String oldUrlPath=pathMap.get("yaowen")+"//"+GetYesterday()+"url.txt";
        String[] oldUrls=GetYesterdayInfo(oldUrlPath);

        Document doc = Jsoup.connect("http://finance.sina.com.cn/").timeout(5000).get();
        Elements ListDiv = doc.getElementsByAttributeValue("class","fin_tabs0_c0");
        //System.out.println(ListDiv);
                 for (Element element :ListDiv) {
             Elements links = element.getElementsByTag("a");
             for (Element link : links) {
                 String linkHref = link.attr("href").trim();
                 String linkText = link.text().trim();
                 if(judgeDup(oldUrls,linkHref))
                 {
                     getWebText(linkHref,linkText,textWriter,titleWriter,urlWriter);
                 }     

             }
         }
         textWriter.close();
         titleWriter.close();
         urlWriter.close();
    }

    public static void getSinaChangJing(Map<String,String> pathMap) throws IOException
    {
         String ChanJingTextPath=pathMap.get("chanjing")+"//chanjing"+GetDate()+"outputText.txt";
         String ChanJingTitlePath=pathMap.get("chanjing")+"//chanjing"+GetDate()+"outputTitle.txt";
         String ChanJingUrlPath=pathMap.get("chanjing")+"//"+GetDate()+"url.txt";
         FileWriter urlWriter = new FileWriter(ChanJingUrlPath);
         FileWriter textWriter = new FileWriter(ChanJingTextPath);
         FileWriter titleWriter = new FileWriter(ChanJingTitlePath);

         String oldUrlPath=pathMap.get("chanjing")+"//"+GetYesterday()+"url.txt";
         String[] oldUrls=GetYesterdayInfo(oldUrlPath);

         Document doc = Jsoup.connect("http://finance.sina.com.cn/chanjing/").timeout(5000).get();
         Elements ListDiv = doc.getElementsByAttributeValue("class","blk_03");
        //System.out.println(ListDiv);
         for (Element element :ListDiv) {
             Elements links = element.getElementsByTag("a");
             for (Element link : links) {

                 String linkHref = link.attr("href").trim();
                 String linkText = link.text().trim();
                 if(judgeDup(oldUrls,linkHref))
                 {
                     getWebText(linkHref,linkText,textWriter,titleWriter,urlWriter);
                 }
             }
         }
         textWriter.close();
         titleWriter.close();
         urlWriter.close();
    }
    public static void getSinaBank(Map<String,String> pathMap) throws IOException
    {

         String bankTextPath=pathMap.get("bank")+"//bank"+GetDate()+"outputText.txt";
         String bankTitlePath=pathMap.get("bank")+"//bank"+GetDate()+"outputTitle.txt";
         String bankUrlPath=pathMap.get("bank")+"//"+GetDate()+"url.txt";
         FileWriter urlWriter = new FileWriter(bankUrlPath);
         FileWriter textWriter = new FileWriter(bankTextPath);
         FileWriter titleWriter = new FileWriter(bankTitlePath);

         String oldUrlPath=pathMap.get("bank")+"//"+GetYesterday()+"url.txt";
         String[] oldUrls=GetYesterdayInfo(oldUrlPath);

         Document doc = Jsoup.connect("http://finance.sina.com.cn/money/bank/").timeout(5000).get();
         Elements ListDiv = doc.getElementsByAttributeValue("class","blk05");
        //System.out.println(ListDiv);

         for (Element element :ListDiv) {
            Elements links = element.getElementsByTag("a");
            for (Element link : links) {

                String linkHref = link.attr("href").trim();
                String linkText = link.text().trim();
                if(judgeDup(oldUrls,linkHref))
                {
                    getWebText(linkHref,linkText,textWriter,titleWriter,urlWriter);
                }
            }
        }
         textWriter.close();
         titleWriter.close();
         urlWriter.close();
    }

    public static void getWebText(String url,String subTitle,
                                  FileWriter textWriter,FileWriter titleWriter,
                                  FileWriter urlWriter) throws IOException
    {

        Document doc;
        doc = Jsoup.connect(url).timeout(10000).get();
        Elements ListDiv = doc.getElementsByAttributeValue("class","blkContainerSblkCon BSHARE_POP");
        if(ListDiv.isEmpty()!=true)
        {
            String webTitleKeywords=getTitleAndWebsite(url,subTitle)+getKeyWords(doc);
            System.out.println(webTitleKeywords);
            writeSTK(webTitleKeywords, titleWriter);
            textWriter.write(webTitleKeywords+"\n");
            urlWriter.write(url+"\n");
            for (Element element :ListDiv) {
                 Elements links = element.getElementsByTag("p");
                 for (Element link : links) {
                     String linkText = link.text().trim();
                     textWriter.write(linkText+"\n");
                   //  System.out.println(linkText);
                 }
             }
        }
    }
    public static String getTitleAndWebsite(String url,String subTitle)
    {
        String titleAndWebsite;
        titleAndWebsite=url+"\t"+subTitle;
        return titleAndWebsite;
    }
    public static void writeSTK(String webTitleKeywords,FileWriter writeWebTitle)
    {
        try {
            writeWebTitle.write(webTitleKeywords+"\n");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static String getKeyWords(Document doc)
    {
        Elements listKey=doc.getElementsByAttributeValue("class","art_keywords");
        String keywords ="\t keywords:";
        for(Element element:listKey)
        {
            Elements links = element.getElementsByTag("a");
             for (Element link : links) {
                 String linkText = link.text().trim();
                 keywords = keywords+linkText+",";
             }
        }
        return keywords;

    }

    public static String GetDate()
    {
         Date dt=new Date();
         SimpleDateFormat simpleDate=new SimpleDateFormat("yyyy-MM-dd");
        // System.out.println(simpleDate.format(dt));
         return simpleDate.format(dt);
    }

    public static String GetYesterday()
    {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE, -1);
        String  yestedayDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
       // System.out.println(yestedayDate);
        return yestedayDate;
    }
    public static String[] GetYesterdayInfo(String oldFilePath) throws IOException
    {
        String encoding="Utf-8";
        File file=new File(oldFilePath);
        if(file.exists())
        {
            return getOldUrls(file,encoding);
        }
        else
        {
            file.createNewFile();
            return getOldUrls(file,encoding);
        }

    }
    public static String[] getOldUrls(File file,String encoding) throws IOException
    {

            FileInputStream fis=new FileInputStream(file);
            InputStreamReader inStream=new InputStreamReader(fis,encoding);
            BufferedReader input=new BufferedReader(inStream);
            String url=input.readLine();
            StringBuilder sb = new StringBuilder("");
             while(url!=null){
                sb.append(url.trim());
                sb.append(",");
                url=input.readLine();
             }
            String sbStr = sb.toString();
            String oldUrls[]=sbStr.split(",");
            return oldUrls;

    }

    public static boolean judgeDup(String[] oldUrls ,String newUrl)
    {
        for(int i=0;i<oldUrls.length;i++)
        {
            if(newUrl.equals(oldUrls[i])==true)
            {
                return false;
            }
        }
        return true;
    }

    public static Map<String,String> createNewFiles()
    {
        String path=getWorkPath()+"//output";
        String [] fileNames = {"yaowen","chanjing","bank"};
        Map<String,String> pathMap=new HashMap<String,String>();
        String pathArray[] = new String[fileNames.length];
        for(int i=0;i<fileNames.length;i++)
        {
            String filePath=path+"//"+fileNames[i];
            File file=new File(filePath);
            if(!file.exists())
            {
                file.mkdirs();
            }
            pathArray[i]=file.getPath().replace("\\", "//");
            pathMap.put(fileNames[i], pathArray[i]);
        }
        return pathMap;
    }

    public static String getWorkPath()
    {
        String workspacePath = null;
        try {
            File directory = new File("");//参数为空
            workspacePath = directory.getCanonicalPath() ;
            //System.out.println(workspacePath);
            workspacePath = workspacePath.replace("\\", "//");
            //System.out.println(workspacePath);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return workspacePath;
    }
}

时间: 2024-11-04 21:27:51

使用jsoup抓取新闻信息的相关文章

jsoup抓取网页+详细讲解

jsoup抓取网页+详细讲解 Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HTML 中攫取你所需的信息和 扩展 HTMLParser 对自定义标签的处理能力.但现在我已经不再使用 htmlparser 了,原因是 htmlparser 很少更新,但最重要的是有了 jsoup . jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HT

PHP curl模拟浏览器抓取网站信息

curl是一个利用URL语法在命令行方式下工作的文件传输工具. 官方解释 curl是一个利用URL语法在命令行方式下工作的文件传输工具.curl是一个利用URL语法在命令行方式下工作的文件传输工具.它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP.curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies,

网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码

这一篇首先从allitebooks.com里抓取书籍列表的书籍信息和每本书对应的ISBN码. 一.分析需求和网站结构 allitebooks.com这个网站的结构很简单,分页+书籍列表+书籍详情页. 要想得到书籍的详细信息和ISBN码,我们需要遍历所有的页码,进入到书籍列表,然后从书籍列表进入到每本书的详情页里,这样就能够抓取详情信息和ISBN码了. 二.从分页里遍历每一页书籍列表 通过查看分页功能的HTML代码,通过class="current"可以定位当前页码所在span标签,此s

网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格

通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码) 接下来将通过ISBN码去amazon.com获取每本书对应的价格. 一.了解需要和分析网站 通过分析amazon.com得知,以ISBN码作为搜索关键字可查找到对应的书. 结果页码就有这本书的价格,既然价格是以$符号开头,那就可以通过正则表达式得到价格. 通过正则表达式匹配价格代码:

使用轻量级JAVA 爬虫Gecco工具抓取新闻DEMO

写在前面 最近看到Gecoo爬虫工具,感觉比较简单好用,所有写个DEMO测试一下,抓取网站 http://zj.zjol.com.cn/home.html,主要抓取新闻的标题和发布时间做为抓取测试对象.抓取HTML节点通过像Jquery选择器一样选择节点,非常方便,Gecco代码主要利用注解实现来实现URL匹配,看起来比较简洁美观. Gecoo GitHub地址 https://github.com/xtuhcy/gecco Gecoo 作者博客 http://my.oschina.net/u/

java中用jsoup抓取网页源码,并批量下载图片

一.导入jsoup的核心jar包jsoup-xxx.jar jar包下载地址:jsoup-1.8.2.jar 中文API地址:http://www.open-open.com/jsoup/parsing-a-document.htm 二.java中用jsoup抓取网页源码,并批量下载图片 package com.dgh.test; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; i

SpringCloud系列九:SpringCloudConfig 基础配置(SpringCloudConfig 的基本概念、配置 SpringCloudConfig 服务端、抓取配置文件信息、客户端使用 SpringCloudConfig 进行配置、单仓库目录匹配、应用仓库自动选择、仓库匹配模式)

1.概念:SpringCloudConfig 基础配置 2.具体内容 通过名词就可以发现,SpringCloudConfig 核心作用一定就在于进行配置文件的管理上.也就是说为了更好的进行所有微服务的配置项的管理,在 SpringCloud 设计架构里面就考虑到了针对于所有的核心配置文件(application.yml)进行的一项统一管理的工具. 2.1.SpringCloudConfig 的基本概念 现在可以思考一个问题:在一个实际的项目开发过程之中,有可能会出现有上百个微服务(创建微服务的标

Web Scraper 高级用法——抓取属性信息 | 简易数据分析 16

这是简易数据分析系列的第 16 篇文章. 这期课程我们讲一个用的较少的 Web Scraper 功能--抓取属性信息. 网页在展示信息的时候,除了我们看到的内容,其实还有很多隐藏的信息.我们拿豆瓣电影250举个例子: 电影图片正常显示的时候是这个样子: 如果网络异常,图片加载失败,就会显示图片的默认文案,这个文案其实就是这个图片的属性信息: 我们查看一下这个结构的 HTML(查看方法可见 CSS 选择器的使用的第一节内容),就会发现图片的默认文案其实就是这个 <img/> 标签的 alt 属性

Jsoup抓取、解析网页和poi存取excel综合案例——采集网站的联系人信息

需求:采集网站中每一页的联系人信息 一.创建maven工程,添加jsoup和poi的依赖包 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.16-be