java网络爬虫爬取百度新闻

原创 2016年08月28日 14:10:35


采用commons-httpclient

commons-httpclient是一个遗留版本,现在官方已经不推荐使用了。


lucene采用4.3版本

所需jar包

wKiom1b0E3uz0lXjAAAyFb6bkVY732.png


package com.lulei.util;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.log4j.Logger;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.NRTManager;
import org.apache.lucene.search.NRTManager.TrackingIndexWriter;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.SearcherFactory;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.NIOFSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;

public class MyCrawl {
    private static int maxConnectTimes = 3;
    private static HttpClient httpClient = new HttpClient();
    private static Logger log = Logger.getLogger(MyCrawl.class);
    private static Header[] responseHeaders = null;
    private static String pageSourceCode = "";
    // 网页默认编码方式
    private static String charsetName = "iso-8859-1";

    // 正则匹配需要看网页的源码,firebug看的不行
    // 爬虫+建立索引
    public static void main(String[] args) {

        String urlSeed = "http://news.baidu.com/n?cmd=4&class=sportnews&pn=1&from=tab";
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("Referer", "http://www.baidu.com");
        params.put(
                "User-Agent",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36");
        GetMethod getMethod = new GetMethod(urlSeed);

        Iterator iter = params.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry entry = (Map.Entry) iter.next();
            String key = (String) entry.getKey();
            String val = (String) entry.getValue();
            getMethod.setRequestHeader(key, val);
        }

        // 得到网页源码放到pageSourceCode变量中
        try {
            readPage(getMethod, "utf-8", urlSeed);
        } catch (Exception e) {

            e.printStackTrace();
        }

        System.out.println(pageSourceCode);
        String regexStr = "&#8226;<a href=\"(.*?)\"";
        Pattern pattern = Pattern.compile(regexStr, Pattern.CASE_INSENSITIVE
                | Pattern.DOTALL);
        Matcher matcher = pattern.matcher(pageSourceCode);
        int count = 0;
        while (matcher.find()) {
            System.out.println(matcher.group());
            System.out.println(matcher.group(1));
            System.out.println(matcher.groupCount());
            count++;
        }
        System.out.println(count);
    }

    private static boolean readPage(HttpMethod method, String defaultCharset,
            String urlStr) throws HttpException, IOException {
        int n = maxConnectTimes;
        while (n > 0) {
            try {
                if (httpClient.executeMethod(method) != HttpStatus.SC_OK) {
                    log.error("can not connect " + urlStr + "\t"
                            + (maxConnectTimes - n + 1) + "\t"
                            + httpClient.executeMethod(method));
                    n--;
                } else {
                    // 获取头信息
                    responseHeaders = method.getResponseHeaders();
                    // 获取页面源代码
                    InputStream inputStream = method.getResponseBodyAsStream();
                    BufferedReader bufferedReader = new BufferedReader(
                            new InputStreamReader(inputStream, charsetName));
                    StringBuffer stringBuffer = new StringBuffer();
                    String lineString = null;
                    while ((lineString = bufferedReader.readLine()) != null) {
                        stringBuffer.append(lineString);
                        stringBuffer.append("\n");
                    }
                    pageSourceCode = stringBuffer.toString();
                    InputStream in = new ByteArrayInputStream(
                            pageSourceCode.getBytes(charsetName));
                    String charset = CharsetUtil.getStreamCharset(in,
                            defaultCharset);
                    // 下面这个判断是为了IP归属地查询特意加上去的
                    if ("Big5".equals(charset)) {
                        charset = "gbk";
                    }
                    if (!charsetName.toLowerCase()
                            .equals(charset.toLowerCase())) {
                        pageSourceCode = new String(
                                pageSourceCode.getBytes(charsetName), charset);
                    }
                    return true;
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println(urlStr + " -- can't connect  "
                        + (maxConnectTimes - n + 1));
                n--;
            }
        }
        return false;
    }

    // 实时搜索
    @Test
    public void search() {
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(
                Version.LUCENE_43, analyzer);
        indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
        String indexFile = "D:/index/knnik";
        Directory directory = null;
        try {
            directory = NIOFSDirectory.open(new File(indexFile));
            // 创建索引
            IndexWriter indexWriter = new IndexWriter(directory,
                    indexWriterConfig);
            TrackingIndexWriter trackingIndexWriter = new TrackingIndexWriter(
                    indexWriter);
            NRTManager nrtManager = new NRTManager(trackingIndexWriter,
                    new SearcherFactory());

            // 查询索引
            IndexSearcher indexSearch = nrtManager.acquire();
            /*
             * //一般的获取indexSearch的方法,非实时 IndexReader
             * indexReader=DirectoryReader.open(directory);
             * 
             * IndexSearcher indexSearch=new IndexSearcher(indexReader);
             */

            Term term = new Term("content", "我们");
            Query query = new TermQuery(term);
            TopDocs topDocs = indexSearch.search(query, 10);
            System.out.println("--------查询结果总数------");
            int totalHits = topDocs.totalHits;
            System.out.println("totalHits" + ":" + totalHits);

            for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
                // scoreDoc.doc获取的docID
                int docId = scoreDoc.doc;

                System.out.println("docId:" + docId);
                Document document = indexSearch.doc(docId);
                System.out.println(document.get("id"));
                System.out.println(document.get("title"));
                System.out.println(document.get("content"));
                System.out.println(document.get("url"));
            }

            nrtManager.release(indexSearch);
            nrtManager.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


代码github托管地址:https://github.com/quantmod/JavaCrawl/blob/master/src/com/yuanhai/test/MyCrawl.java


参考文章:

http://blog.csdn.net/xiaojimanman/article/details/40891791


本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1755054

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java爬虫,信息抓取的实现

今天公司有个x
  • lmj623565791
  • lmj623565791
  • 2014年04月09日 15:50
  • 183101

java新闻爬取

本来想爬今日头条,在网上找了很多方法,走了很多弯路,异步刷新没能解决,本人爬虫小白。后来发现json数据和本地cookie也有关,感觉前路艰难。果断换到网易新闻,网易新闻相对来说获取数据比较简单,通过...
  • bk13323626016
  • bk13323626016
  • 2017年07月26日 14:10
  • 540

Java实现爬虫给App提供数据(Jsoup 网络爬虫)

需求 ##最近基于 Material Design 重构了自己的新闻 App,数据来源是个问题。有前人分析了知乎日报、凤凰新闻等 API,根据相应的 URL 可以获取新闻的 JSON 数据。为了锻炼写...
  • never_cxb
  • never_cxb
  • 2016年01月24日 18:04
  • 12126

网络爬虫讲解(附java实现的实例)

网络蜘蛛即Web Spider,是一个很形象的名字。把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛是通过网页的链接地址来寻找网页,从 网站某一个页面(通常是首页)开始,读...
  • luojinping
  • luojinping
  • 2011年10月13日 17:43
  • 68248

Java--实现网络爬虫抓取RSS新闻(1)网络爬虫详解

网络爬虫定义 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。 可以更形象的理解:网络相当于一个巨大的蜘...
  • bcserzhou
  • bcserzhou
  • 2015年05月17日 21:26
  • 2152

java爬虫(Jsoup)爬取某新闻站点标题

需要一个包:jsoup-1.7.3.jar 有一定的java和js基础的人,一看就懂了! 一个不错的Jsoup中文文档下载地址:http://download.csdn.net/detail/ap...
  • disiwei1012
  • disiwei1012
  • 2016年06月08日 17:14
  • 4333

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

写在前面最近看到Gecoo爬虫工具,感觉比较简单好像,所有写个DEMO测试一下,抓取网站 http://zj.zjol.com.cn/home.html,主要抓取新闻的标题和发布时间做为抓取测试对象...
  • whzhaochao
  • whzhaochao
  • 2016年04月08日 14:15
  • 3089

java Jsoup实现新闻网页的爬取,标题,正文,图片,新闻时间,网页链接的解析示例

一下代码为一个Jsoup爬取新闻网页的简单示例,可直接运行。 import java.io.File; import java.io.FileOutputStream; import java.i...
  • yxmaomao1991
  • yxmaomao1991
  • 2016年01月20日 20:58
  • 3172

java爬虫之爬取博客园推荐文章列表

这几天学习了一下Java爬虫的知识,分享并记录一下;写一个可以爬取博客园十天推荐排行的文章列表...
  • weixin_38011359
  • weixin_38011359
  • 2017年03月31日 10:46
  • 1037

java爬虫抓取新闻

  • 2016年07月05日 12:00
  • 8KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java网络爬虫爬取百度新闻
举报原因:
原因补充:

(最多只允许输入30个字)