一、前言:
使用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实在是太长了,所以我们需要拆分打印。
这里很尴尬的发现必应每日的网站无法使用检查功能,要不然我们可以检查一下log是不是对的。
4.获取图片地址:
我们先打开一张图片看看地址。
然后查看log:
有些小伙伴可能很机智的发现了有两个可以点击的链接,但是很抱歉,那只是一个缩略图,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");
这里打印加上了图片名称。
可以从log中看到巴拉巴拉的一堆地址和名称。
当然,下载图片的时候不要忘记在地址上加入前缀 https://bing.ioliu.cn 。
今天就到这了,之后我们再加上图片下载和翻页下载。