一、前言:

  使用jsoup爬取图片的动机是为了学(tu)习(mo)技(bu)术(gui),学会了就可以批量爬取你喜欢的图片啦(死肥宅想用这个功能干嘛,啊呸)。

二、正文:

  话不多说,进入正文。

  1.获取权限。

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

首先当然是在配置清单中配置一下权限了,我们需要网络权限和读写sdcard权限。

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
            //申请存储权限
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE }, 1);
        }

然后,如果你的测试机是android 6.0以上的,记得动态申请一下写权限,系统会默认给你读权限(不要申请读权限,虽然系统也会给你写权限,但是不能用,不要问我为什么这么清楚,我不会告诉你是因为我踩了这个坑)。正式应用要记得处理用户拒绝权限的情况哦。

2.配置jsoup

build.gradle

implementation 'org.jsoup:jsoup:1.12.1'

3.连接网站

private String url = "https://bing.ioliu.cn/";//每日必应图片地址
    public void scanThread(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                Document document;
                try {
                    document = Jsoup.connect(url).get();//连接网站
                    getLog(document.toString());//打印log
                }catch (IOException exception){
                    exception.printStackTrace();
                }
            }
        }).start();
    }

    private void getLog(String log) {
        for (int i = 0; i < log.length() / 2000 + 1; i++){
            if (log.length() < (i + 1)*2000){
                Log.d(TAG, "getLog: "+log.substring(i*2000));
                Log.d(TAG, "getLog: end ----------------------");
            }else {
                Log.d(TAG, "getLog: "+log.substring(i*2000,(i+1)*2000));
            }
        }
    }

因为涉及到网络请求,所以我们要另开个线程来调用网络。

首先,我们需要知道爬取的网站的地址:url = "https://bing.ioliu.cn/";//每日必应图片地址

然后,我们来连接网站:document = Jsoup.connect(url).get();//连接网站

连接后我们可以打印这个网站,因为String实在是太长了,所以我们需要拆分打印。

android 批量上传下载 进度 安卓批量下载图片_ide

这里很尴尬的发现必应每日的网站无法使用检查功能,要不然我们可以检查一下log是不是对的。

android 批量上传下载 进度 安卓批量下载图片_android_02

4.获取图片地址:

android 批量上传下载 进度 安卓批量下载图片_ide_03

我们先打开一张图片看看地址。

然后查看log:

android 批量上传下载 进度 安卓批量下载图片_android 批量上传下载 进度_04

有些小伙伴可能很机智的发现了有两个可以点击的链接,但是很抱歉,那只是一个缩略图,640x480的,我们可以对照一下我们打开的那个网站地址,发现真正有用的是这一句:

<a class="mark" href="/photo/GrandsCausses_ZH-CN8463022683?force=home_1"></a>
private String url = "https://bing.ioliu.cn/";//每日必应图片地址
    public void scanThread(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                Document document;
                try {
                    document = Jsoup.connect(url).get();//连接网站
//                    getLog(document.toString());//打印log
                    Elements input = document.getElementsByClass("mark");
                    Elements names = document.getElementsByClass("description");
                    for (int i = 0 ; i < input.size() ; i++){
                        String mark = input.select("a").get(i).attr("href");
                        Log.d(TAG, "run: 地址 "+mark);
                        String name = names.select("h3").get(i).text();
                        Log.d(TAG, "run: 名称 "+name);
                    }

                }catch (IOException exception){
                    exception.printStackTrace();
                }
            }
        }).start();
    }

正文来了,我们先获取classname对应的内容,然后因为有很多个一样的classname对应上了,所以遍历一下看看。

Elements input = document.getElementsByClass("mark");

这里打印加上了图片名称。

android 批量上传下载 进度 安卓批量下载图片_java_05

可以从log中看到巴拉巴拉的一堆地址和名称。

当然,下载图片的时候不要忘记在地址上加入前缀 https://bing.ioliu.cn 。

今天就到这了,之后我们再加上图片下载和翻页下载。