网络编程笔记二:一个java爬虫的实现(静态页面)

这一份博客直接贴代码了,因为:),作为平时的学习我习惯写完代码后反观一次,做比较详细的注释。

在这里BB一句,有时候我们学点东西之前总会正儿八经正襟危坐地问啊问啊“怎么入门怎么入门怎么入门呢”。个人有点小感慨:边学边做就是很好的开始,特别是有一个任务有一个目的地学习,知识就是个无向循环图,你可能会为了一个任务,不说“学到”,你也会接触到很多其它方面的知识,你以前学过的东西也都铺垫成你追求其它知识的道路。所以不要再喊着“入门”了直接上路吧!

比如说,下面我们来爬取豆瓣影评(静态页面,即还不去处理由js来承载的评论),然后我们就接触到了一点服务端与客户端交互的知识,一点有关于java流的东西,一点正则的东西 (每一个这样的括号(.*?)都对应了要提取的部分)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Spider {

    public static String SendGet(String url, String decode){
        //定义一个字符串用来存储网页内容
        String result = "";
        //定义一个缓冲字符输入流
        BufferedReader in = null; //为什么要用buffered,因为是可追加的。为什么不用byte,因为是定长的。若未超长则可追加,若超长了则不能追加
        try{
            //将string 转成url对象
            URL realUrl = new URL(url);
            //初始化一个链接到那个url的连接
            URLConnection connection = realUrl.openConnection();
            //开始实际的连接
            connection.connect();
            //初始化bufferedReader输入流来读取url的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream(), decode));
            //用来临时存储抓取到的每一行数据
            String line;
            while((line = in.readLine()) != null){
                //遍历抓取到的每一行都放到result中去
                result += line;
            }
        } catch (Exception e){
            System.out.println("something wrong when sending GET requirement! " +e);
            e.printStackTrace();
        }
        //无论成功与否,用finally来关闭输入流
        finally{
            try{
                if(in != null){
                    in.close();
                }
            } catch(Exception e2){
                e2.printStackTrace();
            }
        }
        return result;
    }

    public static String RegexString(String targetStr, String patternStr){
        //定义一个样式模板,此中使用正则表达式,括号中是要抓的内容
        Pattern pattern = Pattern.compile(patternStr);
        //定义一个matcher用来做匹配
        Matcher matcher = pattern.matcher(targetStr);
        if(matcher.find()){
            String res = "";
            for(int i = 0; i <= matcher.groupCount(); i ++){
                res = res + matcher.group(i) + " ";
            }
            return res;
        }
        return "Nothing";
    }

    public static void GetDouBan(String content){
        //ArrayList<douban> results = new ArrayList<douban>();
        Pattern pattern = Pattern.compile("subject-title.*?>(.*?)<.*?allstar(.*?)0 main-title-rating.*?short-content\">(.*?)<"); //正则表达式匹配我们需要的地方
        Matcher matcher = pattern.matcher(content);
        boolean isfind = matcher.find();
        while(isfind){  
        //group(0)取出的是全部内容
            System.out.println("name: " + matcher.group(1));
            System.out.println("score: " + matcher.group(2));
            System.out.println("comment: " + matcher.group(3));
            isfind = matcher.find();
        }

    }
    /**/
    public static void main(String[] args) {

        String url = "https://movie.douban.com/review/best/";
        String result = SendGet(url, "utf-8");
        GetDouBan(result);

        }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值