继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

qq_林深时见鹿_3
关注TA
已关注
手记 10
粉丝 0
获赞 11

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

日常求赞,感谢老板。

一、先放成果

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

二、前言背景

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

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

三、实现过程

一)引入依赖

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.12.1</version>
</dependency>

二)了解类库

主要方法都在Jsoup类提供的静态方法:

  1.  String html = "<html><head><title>First parse</title></head>"
     + "<body><p>Parsed HTML into a doc.</p></body></html>";
     Document doc = Jsoup.parse(html);//通过Document可以获取里面的任何值
     //html必须是html哦不能是片段
    
  2. String html = "<div><p>Lorem ipsum.</p>";
    Document doc = Jsoup.parseBodyFragment(html);//解析html片段,封装成完整的html
    Element body = doc.body();//获取其中的body片段
    
  3. 重头戏来了

    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中我们想要的资源是这样存在的:

    <img class="lazy" src="https://www.mzitu.com/static/pc/img/lazy.png" data-original="https://i.mmzztt.com/thumb/2020/04/226719_236.jpg" alt="气质少妇任莹樱人体艺术照 丰满木瓜奶完美呈现" width="236" height="354">
    

    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. 执行下来你会发现,保存下来的图片后面很多都是,这个:

    不同的url请求下来的却是同一张图片,单独把url拿出来请求下,果然是请求了只有重定向到了这个图片。嗯虽然我不知道他具体是怎么做的,但我猜应该是从什么地方判断出我不是正常请求,或者是判断同一个ip请求的频率,之后就把我的每次请求都重定向到了这个图片导致我有url却看不到我想要的东西,可恶。

    既然他能判断出我不是正常请求,那我们就看看正常请求和直接访问请求有什么区别吧:

    正常浏览:

    正常请求

    url直接请求:

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

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

  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」,多谢
  • 如果你还发现了更好或不同的想法,还请在留言区不吝赐教,一起探讨交流修改,万分感谢

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP

热门评论

网站已经升级了,爬取不到了

查看全部评论