java抓取网页内容(Java目录:先爬取网页源码,先定义一个方法)

优采云 发布时间: 2021-10-02 16:04

  java抓取网页内容(Java目录:先爬取网页源码,先定义一个方法)

  Java目录:

  最近在学习数据可视化。我想分析一下近年来各个城市的温度和空气质量的变化。我需要一些数据,所以我从互联网上抓取了一些有用的数据进行分析。

  思路:先爬取网页源码,然后用正则表达式从源码中获取需要的数据。

  可以通过以下方式获取网页源代码并在控制台输出。

   String urlStr = ""; // 网址

try {

//创建一个url对象来指向要采集信息的网址

URL url = new URL(urlStr);

//将读取到的字节转化为字符

InputStreamReader inStrRead = new InputStreamReader(url.openStream(),"utf-8");

//读取InputStreamReader转化成的字符

BufferedReader bufRead = new BufferedReader(inStrRead);

//读到的内容不为空

while (bufRead.readLine() != null) {

System.out.println(bufRead.readLine());

}

bufRead.close();

} catch (IOException e) {

e.printStackTrace();

}

  在这里测试一下

  String urlStr = "http://datacenter.mep.gov.cn/report/air_daily/air_dairy.jsp?&lang=";

  控制台输出如下结果。

  

  拿到网页的源码后,我们就可以使用正则表达式来获取我们需要的数据了。

  我们先来分析一下源码。

  

  

  我想要的数据 采集

  以北京为例分析,我们得到如下正则表达式

   // 城市正则

private String regularCity = ">[\u4e00-\u9fa5]{2,}市";

// 日期正则

private String regularDate = ">(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))";

// AQI指数正则

private String regularAQI = ">[0-9]{2,}";

// 空气质量级别正则

private String regularQuality = ">[\u4e00-\u9fa5]";

  我们首先定义一个方法,使用我们定义的正则表达式和网页的源代码来过滤数据。

   /*

* 从网页源代码中过滤数据

* @param regular 正则

*

* @param code 源代码

*/

public String DataAcqu(String regular, String code) {

// 编译正则表达式

Pattern p = Pattern.compile(regular, Pattern.CASE_INSENSITIVE);

Matcher m = p.matcher(code);

if (m.find()) {

// 返回采集到的数据

return m.group();

} else {

return "";

}

}

  然后我们就可以得到我们需要的数据

   public DataCode() {

// 用户输入网页地址

Scanner scan = new Scanner(System.in);

// 存储用户输入的网页地址

String urlStr = scan.nextLine();

try {

//创建一个url对象来指向要采集信息的网址

URL url = new URL(urlStr);

//将读取到的字节转化为字符

InputStreamReader inStrRead = new InputStreamReader(url.openStream(),

"utf-8");

//读取InputStreamReader转化成的字符

BufferedReader bufRead = new BufferedReader(inStrRead);

String readStr = "";

// 创建一个DataAcqu类的对象(前面自己定义的用于采集数据的类)

DataAcqu dataAcq = new DataAcqu();

int i = 0; // 记录采集到的数据数量

// 如果读到的数据不为空

while ((readStr = bufRead .readLine()) != null) {

// 采集城市数据

String cityStr = dataAcq.DataAcqu(regularCity, readStr);

// 如果采集到符合条件的数据,打印出来

if (!cityStr.equals("")) {

// 将采集到的数据前后多余部分去掉(前面正则表达式为了准确取到相应的值,加入了">"和"")

cityStr = cityStr.substring(1, cityStr.indexOf(""));

System.out.println("城市:" + cityStr);

}

// 采集日期数据

String dateStr = dataAcq.DataAcqu(regularDate, readStr);

// 如果采集到符合条件的数据,打印出来

if (!dateStr.equals("")) {

dateStr = dateStr.substring(1, dateStr.indexOf(""));

System.out.println("日期:" + dateStr);

}

// 采集AQI指数数据

String AQIStr = dataAcq.DataAcqu(regularAQI, readStr);

// 如果采集到符合条件的数据,打印出来

if (!AQIStr.equals("")) {

AQIStr = AQIStr.substring(1, AQIStr.indexOf(""));

System.out.println("AQI指数:" + AQIStr);

}

// 采集空气质量级别数据

String qualityStr = dataAcq.DataAcqu(regularQuality, readStr);

// 如果采集到符合条件的数据,打印出来

if (!qualityStr.equals("")) {

qualityStr = qualityStr.substring(1,

qualityStr.indexOf(""));

System.out.println("空气质量级别:" + qualityStr);

System.out.println();

i++;

}

}

br.close(); // 读取完成后关闭读取器

System.out.println("采集完成,共采集到数据:" + i);

} catch (IOException e) {

e.printStackTrace();

}

}

  运行后控制台输出如下信息

  

  如果要将输出结果输出到输出文件,只需在代码中添加类似如下的代码即可

  // 将数据输出到文件

PrintStream ps = new PrintStream("E:\\Java\\DataAcquisition\\data");

//将输出位置切换到文件

System.setOut(ps);

  

  这样,我们就爬取到了我们需要的数据。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线