文档章节

使用 jsoup 爬取数据

sun_beauty
 sun_beauty
发布于 2017/02/16 14:46
字数 693
阅读 77
收藏 1

1、因为工作安排,临时让我这从没摸过爬虫的人爬数据,过程吧,还算可以,网上开源的有,加上伟大的群友的帮忙,算是出了一版运行结果正确的爬虫,现在记录下,有什么隐患,欢迎广大同行批评指正。

2、代码结构:

如上图,结构很简单,引用了jsoup jar包,Rule类具体的爬虫代码,Air类是要获取的页面数据实体类。

3、代码:

Air.java:

package com.zyy.splider.rule;

public class Air {
    String indexNo ;//序号
    String city;//城市
    String date; //日期
    String aqi; //AQI指数
    String level;//空气质量级别
    String prev;//首要污染物
    public Air(
            String indexNo,
            String city,
            String date,
            String aqi,
            String level,
            String prev){
        this.indexNo = indexNo;
        this.city = city;
        this.date = date;
        this.aqi = aqi;
        this.level = level;
        this.prev = prev;
    }
    public String getIndexNo() {
        return indexNo;
    }
    public void setIndexNo(String indexNo) {
        this.indexNo = indexNo;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public String getAqi() {
        return aqi;
    }
    public void setAqi(String aqi) {
        this.aqi = aqi;
    }
    public String getLevel() {
        return level;
    }
    public void setLevel(String level) {
        this.level = level;
    }
    public String getPrev() {
        return prev;
    }
    public void setPrev(String prev) {
        this.prev = prev;
    }
    
}
 

 

Rule.java

package com.zyy.splider.rule;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/*
 * 规则类
 * 用于指定url,method,params等
 */
public class Rule {
    
    public static void main(String[] args) throws Exception {
        crawler();
       
    }
    //爬取
    public static void crawler() throws Exception{
        
        List<Air> cityInfo = new ArrayList<Air>();
        int index = 1;
        int line = 1;
        for(int i = 1;i < 14;i ++){
            
            System.out.println("==================================================" + i);
            String root_url="http://datacenter.mep.gov.cn/report/air_daily/air_dairy.jsp?page=" + i;
            
            Document document=Jsoup.connect(root_url).timeout(3000000).get();
            System.out.println("*****************************************");
            Elements links=document.getElementsByClass("report1_5");
            //Elements links = document.select("#report1 .report1_5");
            
            String indexNo = null ;//序号
            String city = null;//城市
            String date = null; //日期
            String aqi = null; //AQI指数
            String level = null;//空气质量级别
            String prev;//首要污染物
            for(Element link:links){
                System.out.println( link.text());
                
                if(index % 6 == 1){//序号
                     //air.setIndexNo(link.text()) ;
                    indexNo = link.text();
                }else if(index % 6 == 2){//城市
                    //air.setCity(link.text());
                    city = link.text();
                }else if(index % 6 == 3){ //日期
                    //air.setDate(link.text());
                    date = link.text();
                }else if(index % 6 == 4){ //AQI指数
                    //air.setAqi(link.text());
                    aqi = link.text();
                }else if(index % 6 == 5){ //空气质量级别
                    //air.setLevel(link.text());
                    level = link.text();
                }else if(index % 6 == 0){ //首要污染物
                    //air.setPrev(link.text());
                    prev= link.text();
                    //将air信息保存到cityInfo列表
                    cityInfo.add(new Air(indexNo, city, date, aqi, level, prev));
                    line ++;//表示一行结束,行号+1
                }
                index ++;
            }
            
        }
        
        //打印cityInfo中的信息
        for(int i = 0;i < cityInfo.size();i ++){
            System.out.println("第" + i + "条数据--------------------------------->");
            System.out.println("序号:" + cityInfo.get(i).getIndexNo());
            System.out.println("城市:" + cityInfo.get(i).getCity());
            System.out.println("日期:" + cityInfo.get(i).getDate());
            System.out.println("AQI指数:" + cityInfo.get(i).getAqi());
            System.out.println("空气质量级别:" + cityInfo.get(i).getLevel());
            System.out.println("首要污染物:" + cityInfo.get(i).getPrev());
        }
            
        }
    }
    
    
}
 

4、也不知道这算不算一个爬虫程序,反正要的数据算是都有了,代码很简单,运行测试真心痛苦,因为有分页,每页显示条数还是网站定死的,所以只能连发13个请求获取每页的数据,可能因为那个网站属于政府的网站,速度慢到死,,这里简单记录下,希望这是第一次也是最后一次爬网站。。。。。。

© 著作权归作者所有

sun_beauty
粉丝 8
博文 20
码字总数 7556
作品 0
通州
私信 提问
jsoup可以访问js运行之后的html页面吗?

jsoup可以访问js运行之后的html页面吗?比如有些数据是调用js从后台取得,我现在要得到这些数据,就要爬取js运行之后的页面,可是以我现在对jsoup的研究深度,发现jsoup没有这样的功能,请问...

菠萝啊哈哈
2012/02/15
6.9K
10
Java 多线程爬虫框架 - AiPa

一款小巧、灵活的Java多线程爬虫框架(AiPa) 1.框架简介 AiPa 是一款小巧,灵活,扩展性高的多线程爬虫框架。 AiPa 依赖当下最简单的HTML解析器Jsoup。 AiPa 只需要使用者提供网址集合,即可...

像风一样i
2018/09/29
4.2K
6
Java爬虫实战—利用xpath表达式抓取页面信息

前言 之前有写过如何利用Jsoup去爬取页面信息《Java爬虫实战——利用Jsoup爬取网页资源》,那里主要是借助Jsoup的Selector语法去定位和筛选页面信息,那样使用起来有一定的局限性,并且不太方...

测试开发栈
2017/09/12
0
0
Jsoup获取全国地区数据属性值(省市县镇村)

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。 最近手头在做一些东西,需...

JAVA_NINA
2016/06/07
159
0
java爬虫问题二: 使用jsoup爬取数据class选择器中空格多选择怎么解决

问题描述: 在使用jsoup爬取其他网站数据的时候,发现class是带空格的多选择,如果直接使用doc.getElementsByClass(“class的值”),这种方法获取不到想要的数据。 爬取网站页面结构如下: 其...

凯哥java
2018/03/02
29
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部