专注于技术分享
   工具共享。

java爬虫基础分析-教你爬取网站的高清壁纸

Hellohao/26bd40418045150.png

说到爬虫,大家都知道Python,但是惭愧博主对Python不是很精通,就不能爬虫了?答案肯定是错误的,作为强大的编译性语言。java无所不能。下面简单介绍一下通过java简单实现爬虫。

就以爬取壁纸站的壁纸为例子

演示站:https://www.socwall.com

所需要的的依赖

<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,我们那第一页的链接做一下测试,如下图:

Hellohao/8c3890418042522.png

然后访问我们获取的原图地址,获取原图的链接:

这里我先随便哪一个上边获取的地址做个测试

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();
}

结果如下图:

Hellohao/ef5bd0418043618.png

所有的爬虫核心逻辑完成了。

测试

下边我稍微整合了一下代码。集中测试一下吧。

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;
    }

}

结果

Hellohao/96cf40418044114.png

— END —-

赞(1) 打赏
转载请注明文章地址:Hellohao » java爬虫基础分析-教你爬取网站的高清壁纸
分享到: 更多 (0)

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏