专栏首页算法与编程之美Java|分页爬取表情包图片

Java|分页爬取表情包图片

1 前提简介

前面讲过了如何对文章小说的分目录,分章节爬取保存,下面将讲述对当前热门的表情包进行分页,分类爬取。

2 简单查看

下面是一个表情包网站的首页,并且分了很多类别。

图2.1 表情包首页

而且有很多页数。

图2.2 不同页

经过观察,每一页的url只有最后代表页数的数字变了,那就可以从这里下手,多页爬取。

图2.3 区别

3 代码及注释

下面就来看看详细的代码和注释吧,还是温馨提醒注意xpth以及url书写正确哦。

//引入的包,略public class GetPicture1 implements PageProcessor { //定义一个变量用来表示需要下载的总页数 private static int size = 3; //定义一个变量用来表示起始页 private static int number = 1; //声明一个用来存储需要下载的url路径的集合 private static List<String> listUrl = new ArrayList<String>(); //对所要爬取的页面进行相关设置 private Site site = Site.me() .setCharset("utf-8") .setSleepTime(1000)//休眠时间 .setTimeOut(1000);//超时时间 @Override public Site getSite() { return site; } //爬取数据的逻辑 @Override public void process(Page page) { //获取url Selectable url = page.getUrl(); //url匹配 if(url.regex("https://www.doutula.com/article/list/\\?page=\\d*").match()){//列表页 //获取页面 Html html = page.getHtml(); //解析页面获取相关信息(获取所有的标题url) List<String> urls = html.xpath("[@class='container_']/div[1]/div[1]/div[2]/a").links().all(); if(number > size + 1){ return; } urls.add(listUrl.get(number - 1)); //下一页 number++; //将连接放入待爬取序列 page.addTargetRequests(urls); }else{ //爬取图片 获取页面 Html html = page.getHtml(); //获取表情包组的名称 String title = html.xpath("[@class='container_']/div[1]/div[1]/div[2]/li/div[1]/h1/a/text()").toString(); //获取表情包图片的链接// List<String> pictureUrl = html.xpath("[@class='container_']/div[1]/div[1]/div[2]/li/div[2]/div/table/tbody/tr/td[1]/a/img/@src").all(); //下载到本地 downPicture(pictureUrl,title); } } //将图片下载到本地 private void downPicture(List<String> pictureUrl, String title) { for(int i=0;i<pictureUrl.size();i++){ //获取每一张图片连接 String link = pictureUrl.get(i); //做一个非空判断 if(link == null || link == ""){ return;//结束 } try { //将连接字符串封装成一个URL对象 URL url = new URL(link); //获取网络连接 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //获取一个输入流 InputStream in = conn.getInputStream(); //指定图片目录存储的位置 File file = new File("D:\\doutula\\" + title); //判断目录是否存在 if(! file.exists()){ //创建多级目录 file.mkdirs(); } //自定图片的位置 File file2 = new File("D:\\doutula\\" + title + "\\" + i + ".jpg"); //输出流 FileOutputStream fos = new FileOutputStream(file2); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); //定义一个缓冲区 byte[] buf = new byte[1024]; //定义一个标记用于判断有没有读完 int len = 0; //循环读取 while((len = in.read(buf)) != -1){ outStream.write(buf,0,len); } System.out.println("下载完毕"); //写出到本地 fos.write(outStream.toByteArray()); //关闭资源 in.close(); outStream.close(); fos.close(); } catch (Exception e) { e.printStackTrace(); } } } //生成所有下载页的url列表,通过size控制的页数 public static List<String> listUrl(int num){ List<String> list = new ArrayList<String>(); //循环往列表中添加url for(int i=1;i<=num;i++){ list.add("https://www.doutula.com/article/list/?page=" + (i+1)); } return list; } //主程序的入口、线程 public static void main(String[] args) { //获取所有需要下载页的url listUrl = listUrl(size); Spider.create(new GetPicture1()).thread(1).addUrl("https://www.doutula.com/article/list/?page=1").run(); }}

这样,就能拿到大量的热门表情包了,只要敢去“new”,“Java”都能感想敢做。

本文分享自微信公众号 - 算法与编程之美(algo_coding),作者:黄晓锋

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python|送给朋友的生日祝福

    在上一周的文章中,小编给大家带来了一个表白神奇,不知道大家有没有过一个愉快的520。生活中除了给男神女神表白,还会遇到朋友过生日,所以小编今天就给大家带来了一个...

    算法与编程之美
  • Java|“ Java”来爬取小说章节

    在上一篇Java|使用WebMagic进行电话爬取“的文章里就已经介绍了如何主要使用Pageprocessor去爬取电话号码,接下来将要学习到的是去爬取起点中文...

    算法与编程之美
  • 网页|css中的匹配问题

    众所周知在写css的时候,会根据html中类的定义或者id的定义来写相应的css代码。给不同的类定义不同的样式,当然为了能够少写一些代码,大家就会在css中引用...

    算法与编程之美
  • 函数响应式编程及ReactiveObjC学习笔记 (-)

    最近无意间看到一个视频讲的ReactiveObjC, 觉得挺好用的 但听完后只是了解个大概.

    周希
  • C++核心准则​​ES.61:使用delete[]销毁数组,使用delete销毁对象

    That's what the language requires and mistakes can lead to resource release erro...

    面向对象思考
  • 【工具】技术分析有系统的数学理论基础

    传统欧氏几何习惯对复杂的研究对象进行简化和抽象,虽然这种方法对科学发展起了重要的作用,但事实上很多人都发现身边大部分现象都是非线性不可逆的,随机性非常强,比如天...

    小莹莹
  • 股价技术分析有了系统的数学理论基础

    大数据文摘
  • 【云+社区年度正文】手把手用JavaScript 带你打造一款随机选双色球彩票号码网页

    双色球是指一种福利彩票的名称。它由“中bai国福利彩票发行管理中心”统一组织、统一管理、统一发行、统一销售(在全国各省、市和地区联合销售)。其特征是“大奖大,小...

    前端皮皮
  • 当SQL Server爱上Linux:AVAILABILITY_MODE 和 DataGuard 的实践差距

    作者 | 张乐奕:Oracle ACE 总监,ACOUG (中国 Oracle 用户组)联合发起人。Oracle 数据库高可用解决方案与 Exadata 一体...

    数据和云
  • 微软发布同时支持 Windows 和 Linux 平台的新 SQL Server 预览版

      今年 3 月,微软 宣布将把自己的旗舰级数据库软件 SQL Server 带到 Linux 平台,这个 消息在当时堪称大大的惊喜。直到最近,预览版软件仍然是...

    逸鹏

扫码关注云+社区

领取腾讯云代金券