一.如何根据网页分析后台数据?
百度搜索关键字:城市+天气,如山阳天气,得到下图:
右键检查,打开Elements,往下拉,找到class为"op_weather4_twoicon"的div标签,如图:
仔细观察,我们可以发现所有的天气数据都保存在这个div容器内中,而五天内的天气数据则对应每一个a标签<a class=“op_weather4_twoicon_today OP_LOG_LINK” /a>.具体对应字段如下:
数据 | class名称 |
---|---|
日期 | class=“op_weather4_twoicon_date” |
温度 | class=“op_weather4_twoicon_temp” |
风力大小 | class=“op_weather4_twoicon_wind” |
空气质量 | class=“op_weather4_twoicon_realtime_quality_wrap” |
二.jsoup怎么用?
好了,那么我们到底该如何获取到这些数据呢?
我们可以使用jsoup,有人可能会问jsoup到底是干什么的,其实jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。你只要知道它是用来解析html的jar包就可以了,嗯就是一个jar.无非就是假装以浏览器的身份发起请求获取服务器响应回来的html数据,然后按照格式进行相应节点的解析罢了.那它该怎么用呢?
1.根据url发起请求,获取文档数据
String url = "https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=%E5%95%86%E6%B4%9B%E5%A4%A9%E6%B0%94";
Document document = Jsoup.connect(url).get();
2.解析文档
Elements elements = document.getElementsByClass("op_weather4_twoicon").get(0).getElementsByTag("a");
System.out.println(elements);
结果如下:
好了数据都在elements里面,根据需要继续进行具体解析就ok.因为我们要获取天气,温度等数据,上面已经说了,只要根据对应标签的class名获取该标签的文本值就好了.
3.获取具体数据,按需格式输出
for(Element element:elements){
System.out.println(element.getElementsByClass("op_weather4_twoicon_date").text());
System.out.println(element.getElementsByClass("op_weather4_twoicon_temp").text());
System.out.println(element.getElementsByClass("op_weather4_twoicon_weather").text());
System.out.println(element.getElementsByClass("op_weather4_twoicon_wind").text());
System.out.println(element.getElementsByClass("op_weather4_twoicon_realtime_quality_wrap").text());
}
结果:
可以看到,五天的数据都有了.我们只需要根据需要格式化输出就好了.下面给出完整的代码:
三.完整代码
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.Scanner;
/**
* 抓取任意城市县区天气
* @author XiaoXin
* @date 2020/2/13 下午5:00
*/
public class Test {
public static void main(String[] args) {
System.out.println("请输入城市名称:");
String city = new Scanner(System.in).nextLine();
// String url = "https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=%E5%95%86%E6%B4%9B%E5%A4%A9%E6%B0%94";
String prefix = "https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=";
String sufix = "天气";
try {
String url = prefix+city+sufix;
System.out.println(url);
Document document = Jsoup.connect(url).get();
Elements elements = document.getElementsByClass("op_weather4_twoicon").get(0).getElementsByTag("a");
String date = null;//农历或星期
String tempreature = null;//温度范围
String curTemp = null;//当日实时温度
String wind = null;//风力大小
String air = null;//天气
String curAir = null;//当日实时天气
String day = null;//阳历时间
String quality = null;//空气质量
for(Element element:elements) {
System.out.println("-------------------------");
date = element.getElementsByClass("op_weather4_twoicon_date").text();
day = element.getElementsByClass("op_weather4_twoicon_date_day").text();
tempreature = element.getElementsByClass("op_weather4_twoicon_temp").text();
curTemp = element.getElementsByClass("op_weather4_twoicon_shishi_title").text();
if(curTemp!=null&& curTemp.length()>0){
curTemp = curTemp+"℃";
}
curAir = element.getElementsByClass("op_weather4_twoicon_shishi_sub").text();
quality = element.getElementsByClass("op_weather4_twoicon_realtime_quality_wrap").text();
air = element.getElementsByClass("op_weather4_twoicon_weath").text();
wind = element.getElementsByClass("op_weather4_twoicon_wind").text();
System.out.println(date +" "+day+ "\n" +curTemp+" "+curAir+"\n"+ tempreature + "\n" + air +"\n"+ wind+"\n"+quality);
System.out.println("--------------------------");
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
四.结果对比图
总结:如果输入省份或其他任意关键字,比如java,获取天气,你觉得会有结果吗?