网络爬虫
实现步骤分析:
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();
}
}
豆瓣网址图:
爬取效果图: