说到爬虫,大家都知道Python,但是惭愧博主对Python不是很精通,就不能爬虫了?答案肯定是错误的,作为强大的编译性语言。java无所不能。下面简单介绍一下通过java简单实现爬虫。
就以爬取壁纸站的壁纸为例子
所需要的的依赖
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
实现过程
首先需要分析网页的url结构:
他的页码结构是:https://www.socwall.com/wallpapers/page:2/
那为了方便爬虫,我们可以把第一页(首页)写成:https://www.socwall.com/wallpapers/page:1/
站点的源码结构:
页面图片列表的每个图片的主体部分如下结构:
<ul class="wallpaperList">
<li class="wallpaper wallpaper87010">
<div>
<a class="image" href="/desktop-wallpaper/87010/wallpaper-by-unknown-artist/" target="_blank"><img style="width: 290px; height: 260px;" src="/images/wallpapers/87010-290x260.jpg" />
<div class="meta" style="top: 260px;">
<h2 class="title">Wallpaper</h2>
<p class="author">Unknown Artist</p>
</div></a>
<ul class="controls left">
<li class="processing"></li>
<li class="flagWallpaper"><a onclick="Socwall.showFlagWallpaperTip($(this), 87010);" title="Flag"></a></li>
</ul>
<ul class="controls right">
<li class="vote voteDown"><a onclick="Socwall.rate(87010, 'down', $(this));" title="Vote Down"></a></li>
<li class="vote voteUp"><a onclick="Socwall.rate(87010, 'up', $(this));" title="Vote Up"></a></li>
<li class="favorite"><a onclick="Socwall.toggleFavorite(87010, $(this));" title="Save to Favorites"></a></li>
<li class="rating">+5</li>
</ul>
</div></li>
<li class="wallpaper wallpaper87009">
<div>
<a class="image" href="/desktop-wallpaper/87009/wallpaper-by-unknown-artist/" target="_blank"><img style="width: 290px; height: 260px;" src="/images/wallpapers/87009-290x260.jpg" />
<div class="meta" style="top: 260px;">
<h2 class="title">Wallpaper</h2>
<p class="author">Unknown Artist</p>
</div></a>
<ul class="controls left">
<li class="processing"></li>
<li class="flagWallpaper"><a onclick="Socwall.showFlagWallpaperTip($(this), 87009);" title="Flag"></a></li>
</ul>
<ul class="controls right">
<li class="vote voteDown"><a onclick="Socwall.rate(87009, 'down', $(this));" title="Vote Down"></a></li>
<li class="vote voteUp"><a onclick="Socwall.rate(87009, 'up', $(this));" title="Vote Up"></a></li>
<li class="favorite"><a onclick="Socwall.toggleFavorite(87009, $(this));" title="Save to Favorites"></a></li>
<li class="rating">+5</li>
</ul>
</div></li>
</ul>
图片详情页面主要代码:
<a class="wallpaperImageLink wallpaperLink" href="/images/wallpapers/87010-1920x1080.jpg" target="_blank">
<img src="/images/wallpapers/87010-1920x1080.jpg" alt="Wallpaper" style="max-width: 1705px; max-height: 908px;">
</a>
通过以上代码我可以得出。每个图片的class="image"
的a
标签href
属性就是这张图片原图的地址。
那我们的思路就很明确了:遍历每页的各个图片。分别得到他们的href
,进入原图页面后再提取原图img
标签的src
链接即可。
实现
我们首先需要分析怎么获取到每张图片的href
:
public static void getImgUrl(String url){
try {
URL u = new URL(url);
Document doc = Jsoup.parse(u, 5000);
Elements img = doc.getElementsByClass("wallpaperList").select("a.image");
for (Element element : img) {
System.out.println(element.attr("href"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
关键代码说明:其实Document对象的用法和js差不太多,但是还是有区别的:
Elements img = doc.getElementsByClass("wallpaperList").select("a.image");
我上面这句代码的意思是说:获取class为wallpaperList下所有class为image的a标签。
拿到所有我们想要的a标签之后,挨个遍历获取它的href属性即可:element.attr("href")
OK,我们那第一页的链接就成功了。
然后访问我们获取的原图地址,获取原图的链接:
这里我先随便哪一个上边获取的地址做个测试
URL u = null;
try {
u = new URL("https://www.socwall.com/desktop-wallpaper/87010/wallpaper-by-unknown-artist/");
Document doc = Jsoup.parse(u, 5000);
Elements imglink = doc.getElementsByClass("wallpaperImageLink").select("img");
for (Element element : imglink) {
System.out.println("高清壁纸获取成功:https://www.socwall.com"+element.attr("src"));
}
} catch (Exception e) {
e.printStackTrace();
}
完成!
所有的爬虫核心逻辑完成了。
测试
下边我稍微整合了一下代码。集中测试一下吧。
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
/**
* @author Hellohao
* @version 1.0
* @date 2020-04-18 15:29
*/
public class Demo {
public static void main(String[] args) {
//此循环为页码。标识爬取前10页的所有图
for (int i = 1; i <=10 ; i++) {
System.out.println("正在爬取第 "+i+" 页:");
String url = "https://www.socwall.com/wallpapers/page:"+i;
List<String> list = getImgUrl(url);
for (String s : list) {
URL u = null;
try {
u = new URL("https://www.socwall.com"+s);
Document doc = Jsoup.parse(u, 5000);
Elements imglink = doc.getElementsByClass("wallpaperImageLink").select("img");
for (Element element : imglink) {
System.out.println("高清壁纸获取成功:https://www.socwall.com"+element.attr("src"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
//获取每页所有图片的原图url
public static List<String> getImgUrl(String url){
List<String> list = new ArrayList<>();
try {
URL u = new URL(url);
Document doc = Jsoup.parse(u, 5000);
Elements img = doc.getElementsByClass("wallpaperList").select("a.image");
for (Element element : img) {
//System.out.println(element.attr("href"));
list.add(element.attr("href"));
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
--- END ----