腰酸推荐Java-Jsoup爬取妹子图

腰酸推荐Java-Jsoup爬取妹子图

日常求赞,感谢老板。

欢迎关注公众号:其实是白羊。干货持续更新中......

一、先放成果

腰酸推荐Java-Jsoup爬取妹子图_第1张图片

腰酸推荐Java-Jsoup爬取妹子图_第2张图片

我扶了下腰,不多不多。。。

二、前言背景

之前一直听爬虫爬虫的,咱也不知道是啥,但都是用Python,咱也不会啊,就会个Java。后来了解到,简单的爬虫其实就是解析页面嘛,提取自己需要的资源(嘿嘿)。再后来在工作中接到了个需求里需要解析html,度娘了一下了解到了Jsoup这个类库。需求做完了,就这么结束?怎么可能,当然是做一些有趣的事情啦。

  1. 先确定目标:练习为主选取比较容易搞的图片,于是我找到了这个妹子图
  2. 半小时过后,我开始了制定计划,爬取网站获取alt做名字,获取连接存到数据库里,以备不时之需。

三、实现过程

一)引入依赖


    org.jsoup
    jsoup
    1.12.1

二)了解类库

主要方法都在Jsoup类提供的静态方法:
  1. String html = "First parse"
Document doc = Jsoup.parse(html);//通过Document可以获取里面的任何值
//html必须是html哦不能是片段
```
  1. String html = "

    Lorem ipsum.

    "; Document doc = Jsoup.parseBodyFragment(html);//解析html片段,封装成完整的html Element body = doc.body();//获取其中的body片段
  2. 重头戏来了

    Connection connect = Jsoup.connect("http://example.com/");//获取Connection
    Document document = connect.get();//Connection可以设置常规网络请求都可以设置的一些项,如:
    //connect.header("Accept-Encoding", "gzip, deflate, sdch");//设置请求头(注意要在调用get或post方法之前设置)
    //connect.cookie("auth", "token");//设置cookie
    //connect.timeout(3000);//设置响应时间等
    //这是爬取资源重要的一步哦
    String title = document.title();

下面是对于Document解析想要的值的方法:

查找元素
  • getElementById(String id)
  • getElementsByTag(String tag)
  • getElementsByClass(String className)
  • getElementsByAttribute(String key) (and related methods)
  • Element siblings: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling()
  • Graph: parent(), children(), child(int index)
元素数据
  • attr(String key)获取属性attr(String key, String value)设置属性
  • attributes()获取所有属性
  • id(), className() and classNames()
  • text()获取文本内容text(String value) 设置文本内容
  • html()获取元素内HTMLhtml(String value)设置元素内的HTML内容
  • outerHtml()获取元素外HTML内容
  • data()获取数据内容(例如:script和style标签)
  • tag() and tagName()
操作HTML和文本
  • append(String html), prepend(String html)
  • appendText(String text), prependText(String text)
  • appendElement(String tagName), prependElement(String tagName)
  • html(String value)
以上内容参考自: 更多方法使用

三)给爷爬

了解了类库,我们就可以着手开始实践解析了:

  1. 先分析下网站上的资源都在哪?

    String url = "https://www.mzitu.com/page/1/";
    Connection connect = Jsoup.connect(url);
    Document document = connect.get();

    我们可以看到得到的document中我们想要的资源是这样存在的:

    气质少妇任莹樱人体艺术照 丰满木瓜奶完美呈现

    ok,那么我们要的是img标签下data-original属性的值和alt属性的值。

  2. 解析获取

    //在上面代码基础上
    Elements imgs = document.getElementsByTag("img");//获取全部img
    for (Element img : imgs) {
        String src = img.attr("data-original");
        String alt = img.attr("alt");
        log.info("第{}页:alt->{};src->{}", i, alt, src);
    }

    到这就ok啦,alt是图片的描述可以将它作为图片的名字,src就是图片的请求地址,你可以直接将它存在数据库里,或者直接保存到本地磁盘(具体做法后面会写)

  3. 接这样结束了?怎么可能这可是有243页哎(再深的咱们就不挖了)。看下不同页的url可以写成:

    for (int i = 1; i <= 243; i++) {
        String url = "https://www.mzitu.com/page/"+ i +"/";
        //获取+解析步骤省略参考上面步骤
    }
  4. 执行下来你会发现,保存下来的图片后面很多都是,这个:

    腰酸推荐Java-Jsoup爬取妹子图_第3张图片

    发现什么没,请求头里少了Referer,找到原因了那就试一哈。

  5. 多次正常浏览后,总结发现Referer的值是上一次浏览的url

    腰酸推荐Java-Jsoup爬取妹子图_第4张图片

  6. 综上在使用Jsoup时获取网页和根据url请求资源时加上一定的请求头:

    //简单写下意思(文末会赋源码)
    for (int i = 1; i <= 243; i++) {
        String url = "https://www.mzitu.com/page/" + i + "/";
        Connection connect = Jsoup.connect(url);
        connect.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        connect.header("Accept-Encoding", "gzip, deflate, sdch");
        connect.header("Accept-Language", "zh-CN,zh;q=0.8");
        connect.header("Sec-Fetch-Dest", "document");
        connect.header("Upgrade-Insecure-Requests", "1");
        connect.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");
        connect.header("Referer", refererPageInit);
        Document document = connect.get();
        //todo 解析出需要的资源
        refererPageInit = "https://www.mzitu.com/page/" + i + "/";
    }

    至此你就能获取这两百多页(六七千多张图片)啦。

四、最后

各位绅士先放下手中的针线活,源码在此,觉得写的还可以的给点个赞,也可以评论浏览讨论下。

更多资源: 其实是白羊

欢迎star

日常求赞

  • 如果你认为本文对你有帮助,还请「在看/转发/赞/star」,多谢
  • 如果你还发现了更好或不同的想法,还请在留言区不吝赐教,一起探讨交流修改,万分感谢

欢迎关注公众号:「其实是白羊」干货持续更新中......

你可能感兴趣的:(java,网页爬虫)