java实现简单爬虫

JSOUP介绍

Jsoup是一个Java的Html解析引擎,并且可直接访问远程url地址,并且可通过各种类型的选择器进行dom节点的筛选,因此我们可以尝试用Jsoup实现一个简单的爬虫程序,以下以某一图片网站为例,模拟进行图片的爬取。
本文仅用于学习交流。

准备

首先找到一个准备爬取的网站,获取起网站根路径,作为BASE_URL:

网络协议
protocol:https:
路径url
BASE_URL:${protocol}//xxx.xxx.com/

页面结构如下:
在这里插入图片描述
在此页面,我们要获取的内容包含两部分,上面的图片集的页面地址,以及下面分页页签的地址:
在这里插入图片描述
所以,对应li标签内的a标签选择器:

.ali .il_img a

此时,我们可以获取到当前图片集的链接地址:

$(this).attr("href")

获取到图片集链接地址后,我们链接到当前图片集内:
在这里插入图片描述
页面结构大概如下:
在这里插入图片描述

逻辑相同,我们尝试获取超链接,对应选择器路径:

.pli .il_img a

根据选择器获取对应元素后,跳转到对应页面,页面内包含我们要抓取的图片:
在这里插入图片描述
页面结构:
在这里插入图片描述
此img元素即为我们想要抓取的图片的地址:

#imgis

至此,一个页面内的图片的抓取工作已经完成,下面我们要进行多页数据的抓取,首先我们在开始步骤时取的分页组件数据,我们只用一只获取下一页内容即可:

.page-next

JSOUP API介绍

  • 链接
Connection connect = Jsoup.connect(BASE_URL);
//忽略返回类型 在获取json数据时不设置此项会报错
connect.ignoreContentType(true);
//设置请求头
//connect.header();
//设置cookie 也可在请求头中设置
//connect.cookie();
//设置请求方式
//connect.method();
//执行请求
Document document = connect.get();
  • 选择
    选择器整体逻辑与jquery选择器类似;
    在这里插入图片描述
    在这里插入图片描述

代码实现

逻辑以及API已经介绍完毕,简单代码实现逻辑如下,下载功能可自行实现:
maven坐标:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.13.1</version>
</dependency>

代码:

private static final String PROTOCOL = "https:";
//TODO 路径已调整 不同网站页面结构不同,需自行配置
//如需实现不同网站数据的爬取 可自行设置动态选择器
private static final String BASE_URL = PROTOCOL + "//www.xxx.xxx.com";

public static void main(String[] args) throws Exception {
    Connection connect = Jsoup.connect(BASE_URL + "/tupian");
    //忽略返回类型 在获取json数据时不设置此项会报错
    connect.ignoreContentType(true);
    //设置请求头
    //connect.header();
    //设置cookie 也可在请求头中设置
    //connect.cookie();
    //设置请求方式
    //connect.method();
    //执行请求
    Document document = connect.get();
    do{
        //获取图片集
        Elements imgs = document.select(".ali .il_img a");
        if(CollectionUtils.isNotEmpty(imgs)){
            //进入图片集
            getImgs(imgs);
        }
        //更新url以及document
        Elements next = document.getElementsByClass(".page-next");
        if(CollectionUtils.isNotEmpty(next)){
            document = Jsoup.connect(BASE_URL + next.get(0).attr("href")).get();
        }else{
			break;
		}
    }while(true);


}

private static void getImgs(Elements imgs) throws Exception{
    for(Element element : imgs){
        String href = element.attr("href");
        //连接到图片集页面
        Document document = Jsoup.connect(BASE_URL + href).get();
        //获取图片列表
        Elements select = document.select(".pli .il_img a");
        if(CollectionUtils.isNotEmpty(select)){
            //执行图片下载操作
            download(select);
        }
    }

}

/**
 * 图片下载
 *
 * @param select
 */
private static void download(Elements select) throws Exception{
    for(Element element : select){
        String href = element.attr("href");
        //连接到图片集页面
        Document document = Jsoup.connect(BASE_URL + href).get();
        Element img = document.getElementById("imgis");

        System.out.println(img.attr("src"));
        //TODO  download
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值