java爬虫入门篇 ———jsoup轻松带你查看任意城市天气

一.如何根据网页分析后台数据?

百度搜索关键字:城市+天气,如山阳天气,得到下图:
在这里插入图片描述
右键检查,打开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,获取天气,你觉得会有结果吗?
在这里插入图片描述

发布了17 篇原创文章 · 获赞 2 · 访问量 672

猜你喜欢

转载自blog.csdn.net/qq_43615903/article/details/104300888
今日推荐