IO流的练习——网络爬虫

88 阅读2分钟

网络爬虫

实现步骤分析:

1.定义变量记录网址
2.爬取数据,把从网址上爬取的数据拼接成一个字符串
	爬取数据步骤:
		1.定义一个StringBuilder对象,用于拼接爬取到的数据
		2.创建URL对象
		3.链接上所要爬取的网址
			注意:保证网络式通畅的,而且这个网址是可以链接上的
		4.读取数据
			注意:读取的网址信息,会包含汉字,所以可以将获取的字节流转换成字符流
		5.释放资源
		6.把读取的数据直接返回
3.利用正则表达式,将其中符合要求的数据获取出来
	获取符合要求数据步骤:
		1.创建一个集合,用于存放数据
		2.按照正则表达式规则,获取数据
		3.将获取的数据存入到集合中
		4.返回集合
4.对符合要求的数据进行处理,得到想要的形式
5.将处理好的数据读写到文件中

代码演示如下:

package com.lyj.io_practice;


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

public class Test01 {
    /*
    * 爬取:豆瓣电影 Top 250
    * */
    public static void main(String[] args) throws IOException {
        //1.定义net变量记录网址
        String net = "https://movie.douban.com/top250";
        //2.爬取数据
        //System.out.println(webCrawler(net));
        String data = webCrawler(net);
        //3.利用正则表达式,将其中符合要求的数据获取出来
        String regex = "<span class=\"title\">(.*?)</span>.*?<span class=\"rating_num\" property=\"v:average\">(.*?)</span>.*?<span class=\"inq\">(.*?)</span>";
        ArrayList<String> dataList = getData(data, regex);
        //System.out.println(dataList);

        //4.将数据写到文件中
        BufferedWriter bw = new BufferedWriter(new FileWriter("day10\\豆瓣电影.txt"));
        for (String s : dataList) {
            bw.write(s);
            bw.newLine();
        }
        //5.释放资源
        bw.close();
    }


/*
* 获取符合要求的数据
*
* */

    public static ArrayList<String> getData(String data,String regex){

        //1.创建一个集合,用于存放数据
        ArrayList<String> list = new ArrayList<>();

        //2.按照正则表达式规则,获取数据
        Pattern pattern = Pattern.compile(regex,Pattern.DOTALL);
        Matcher matcher = pattern.matcher(data);
        while (matcher.find()){
            //利用正则表达式---捕获分组 去拼接自己想要的格式
            String str = "电影名称:"+matcher.group(1) + "\n评分:" + matcher.group(2)+ "\n影评:" + matcher.group(3)+"\n";
            //3.将获取的数据存入到集合中
            list.add(str);
        }
        //4.返回集合
        return list;
    }
    /*
    * 爬取网站数据
    * */
    private static String webCrawler(String net) throws IOException {

        //1.定义一个StringBuilder
        StringBuilder sb = new StringBuilder();

        //2.创建URL对象
        URL url = new URL(net);

        //3.链接上索要爬取的网址
        URLConnection urlConnection = url.openConnection();

        //4.读取数据
        InputStreamReader isr = new InputStreamReader(urlConnection.getInputStream());
        int len;
        while ((len = isr.read()) != -1){
            sb.append((char) len);
        }
        //5.释放资源
        isr.close();
        return sb.toString();
    }
}

豆瓣网址图:

image-20240224213634621.png

爬取效果图:

image-20240224213744959.png