java网络爬虫项目--慕课猿问爬取

2019-06-15 00:00:00 项目 爬虫 网络

什么是网络爬虫?

维基百科

网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。

百度百科

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

java网络爬虫练习项目

一个比较简单的java练习项目。

需要知识

  • 什么是网络爬虫
  • Java基础
  • 正则表达式

项目思路

在慕课网的猿问页面,寻找一个你喜欢的问题页面,利用http请求获取问题页面的源码,然后通过正则表达式,不断爬取相关问题页面。

项目介绍

该项目存在三个类
Imooc.java : imooc问题bean类
Spider.java: 封装用来爬取页面的方法类
Main.java: 运行起始页面

  • Imooc.java类是要爬取内容的对象类,属性成员有问题,问题链接,问题描述,答案列表和下一个问题链接。
package bean;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import spider.Spider;

/**
 * 单个问题页面对象
 * @author hjy
 *
 */
public class Imooc {
    public String question;
    public String quesUrl;
    public String quesDescription;
    public Map<String,String> answers;
    public String nextUrl;

    public Imooc(String url) {
        question="";
        quesUrl=url;
        quesDescription="";
        answers = new HashMap<String,String>();
        nextUrl="";

//          获取单个问题页面源码
        String codeSource = Spider.getSource(url);

//          正则表达式获取question
        Pattern pattern=Pattern.compile("js-qa-wenda-title.+?>(.+?)</h1>");
        Matcher matcher=pattern.matcher(codeSource);
        if(matcher.find()){
            question = matcher.group(1);
        }

//          正则表达式获取问题描述
        pattern=Pattern.compile("js-qa-wenda.+?rich-text\">(.+?)</div>");
        matcher=pattern.matcher(codeSource);
        if(matcher.find()){
            quesDescription = matcher.group(1).replace("<p>", "").replace("</p>", "");
        }

//           正则表达式获取答案列表      
        pattern=Pattern.compile("detail-name.+?>(.+?)</a>.+?answer-content.+?>(.+?)</div>");//获取回答者name
        matcher=pattern.matcher(codeSource);
        while(matcher.find()){
            String answer = matcher.group(2).replace("<p>", "");
            answer = answer.replace("</p>", "");
            answer = answer.replace("<br />", "");
            answers.put(matcher.group(1),answer);
        }

//          正则表达式获取下一个url   爬取获取相关问题的url
        pattern=Pattern.compile("class=\"relwenda\".+?href=\"(.+?)\".+?</a>");//获取回答者name
        matcher=pattern.matcher(codeSource);
        while(matcher.find()){
            nextUrl="http://www.imooc.com"+matcher.group(1);
//          防止相关文题是本问题无线循环下去
            if(!nextUrl.equals(quesUrl)){
                break;
            }
        }
    }

    @Override
    public String toString() {
        return "问题为:"+ question +"\n问题地址为:"+quesUrl+
                "\n问题的表述为:"+quesDescription+"\n"
                + "回答的内容为:"+answers+"\n指向下一个链接地址为:"+nextUrl+"\n";
    }

//  测试方法
    public static void main(String[] args) {
        String url = "http://www.imooc.com/wenda/detail/345010";
        Imooc imooc = new Imooc(url);
        System.out.println(imooc);
    }
}
  • Spider.java类封装了2个可能用到的方法,getSource方法获取网页源代码和getImoocPage获取页面Url列表。
package spider;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import bean.Imooc;

/**
 * 1.获取网页源码
 * 
 */
public class Spider {

    /**
     * 获取网页源代码
     * @param url 网址
     * @return
     */
    public static String getSource(String url){
        BufferedReader reader=null;
        String result = "";
        try {
            URL realUrl = new URL(url);
//          打开和url之间的连接
            URLConnection conn = realUrl.openConnection();

            reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line="";
            while((line=reader.readLine())!=null){
                result+=line;
            }
//          System.out.println(result);
            if(reader!=null)
                reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

//  测试是否获得慕课问答页面源码
//  测试是否获取问题的url
    public static void main(String[] args) {
        String url = "http://www.imooc.com/wenda";
        String regex = "class=\"content\".+?href=\"(.+?)\".+?</a>";
        String result = getSource(url);
        List<String> wendaUrl = getImoocPage(result,regex);
        System.out.println(wendaUrl);
    }

//  没有用到
/**
 * 获取问题页面url
 * @param quesSource 页面源码
 * @param regex      匹配正则表达式
 * @return
 */
    public static List<String> getImoocPage(String quesSource,String regex){
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(quesSource);
        List<String> quesUrl = new ArrayList<String>();
        while(matcher.find()){
            String url = "http://www.imooc.com"+matcher.group(1);
            quesUrl.add(url);
        }
//      System.out.println(quesUrl);    
        return quesUrl;
    }

}
  • Main.java类
package main;
import java.util.ArrayList;
import java.util.List;
import bean.Imooc;
public class Main {

public static void main(String[] args) {
        String url = "http://www.imooc.com/wenda/detail/345252";
//      List<Imooc> imoocs = new ArrayList<Imooc>();
        Imooc imooc;
//      限定爬取数量
        for(int i=0; i<5;i++){      
            imooc = new Imooc(url);
//          imoocs.add(imooc);
            url = imooc.nextUrl;
            System.out.println(imooc);
        }
    }
}

项目源码

IMOOCSpider项目已上传到我的github上—-传送门
欢迎Star

下载下来后导入eclipse即可运行。

项目运行结果

《java网络爬虫项目--慕课猿问爬取》

相关文章