楔子

学习jsoup ,抓取图片作为练习
更多jsoup 参考https://jsoup.org/ 。英语不好的(说的就是我) http://www.open-open.com/jsoup/

注意

网页有防盗链
如果没有防盗链 FileUtils.copyURLToFile(url, new File("c://meizitu.jpg")); 就可以下载图片

防盗链

有些防盗链是采用Referer 实现的。针对此可以简单处理
String src = "http://img.mmjpg.com/2018/1305/1in1.jpg";
URL url = new URL(src);
URLConnection con = url.openConnection();
con.setConnectTimeout(5 * 1000);
String referer = url.getProtocol() + "://" + url.getHost();
con.setRequestProperty("Referer", referer);
System.out.println(referer);
FileUtils.copyInputStreamToFile(con.getInputStream(), new File("c://2.jpg"));

或者采用下面的
String referer = url.getProtocol() + "://" + url.getHost();
Connection ref = Jsoup.connect(url.toString()).ignoreContentType(true).referrer(referer);
Response execute = ref.execute();
BufferedInputStream bodyStream = execute.bodyStream();
FileUtils.copyInputStreamToFile(bodyStream, new File("c://1.jpg"));

这部分可以参考 https://stackoverflow.com/questions/13558448/jsoup-http-error-fetching-url
https://blog.csdn.net/lf_breeze/article/details/51862107
https://blog.csdn.net/u013123635/article/details/78447440

抓取图片

下面代码针对无需登录实现的
抓取图片,主要是2步骤:1是找到图片URL,2是下载图片
在 找图片URL过程繁琐一点。不过多数网页图片是固定的模版。

1:找URL


如图。图片在 id 为 pins 的ul 里面,依次找到 每个li,找到 每种图片的 url,然后在根据此url,继续找具体的 图片地址

根据上面的 地址,就可看到 图片的具体url.然后下载就行。

图片首页信息

package cn.zuzi.mzitu;public class PageBean {/*** 网站首页*/public static String  baseUrl="http://www.mzitu.com/";/*** 每页中 图片列表 div id*/public static String pageIdString ="pins";/*** 图片 发布时间*/public static String todayClassString="time";}

构造图片实体类 此处省略 get set方法

package cn.zuzi.mzitu;
public class PicBean {static String picImgPostion = "main-image";/*** 分页位置*/public static String picNumClass = "pagenavi";/*** 图片个数*/private Integer picNum;/*** 图片标题*/private String title;/*** 图片 base url*/private String picBaseUrl;private String picPubDate;}

下载需要的方法

package cn.zuzi.mzitu.utils;import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.net.URL;import org.apache.commons.io.FileUtils;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.Connection.Response;
import org.jsoup.select.Elements;public class PicUtils {public static final String encoding = "UTF-8";public static final String SAVE_FILE = "d:/picc";/*** 获取 图片 页码数* @param content* @return*/public static int getPicNum(String content) {Elements byTag = Jsoup.parse(content).getElementsByTag("a");String text = byTag.get(byTag.size() - 2).text();return Integer.parseInt(text);}public static void downPic(String urlStr, String fileName) {try {URL url = new URL(urlStr);String referer = url.getProtocol() + "://" + url.getHost();Connection ref = Jsoup.connect(url.toString()).ignoreContentType(true).referrer(referer);Response execute;execute = ref.execute();BufferedInputStream bodyStream = execute.bodyStream();FileUtils.copyInputStreamToFile(bodyStream, new File(SAVE_FILE,fileName));} catch (IOException e) {e.printStackTrace();}}/*** 获取文件后缀名* @param fileStr* @return*/public static String getFieExtName(String fileStr){return fileStr.substring(fileStr.lastIndexOf("."));}}

下载具体 图片

package cn.zuzi.mzitu.utils;public class PicDownThread extends Thread {private String title;private String picPubDate;private String picdetailUrl;private int serial;public PicDownThread(String title, String picPubDate, String picdetailUrl, int serial) {this.title = title;this.picPubDate = picPubDate;this.picdetailUrl = picdetailUrl;this.serial = serial;}@Overridepublic void run() {PicUtils.downPic(picdetailUrl, picPubDate + "/" + title + "/" + serial + PicUtils.getFieExtName(picdetailUrl));}}

通过首页进入各个页面 查找需要信息

package cn.zuzi.mzitu;
import java.io.File;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import cn.zuzi.mzitu.utils.PicDownThread;
import cn.zuzi.mzitu.utils.PicUtils;
public class DownPicThread extends Thread {public PicBean picbean;public DownPicThread(PicBean picBean2) {this.picbean = picBean2;}@Overridepublic void run() {String picBaseUrl = picbean.getPicBaseUrl();Document document;try {document = Jsoup.connect(picBaseUrl).get();String first_pic_src = getPicDetailUrl(document);String pageNumSti = document.getElementsByClass(picbean.picNumClass).get(0).toString();picbean.setPicNum(PicUtils.getPicNum(pageNumSti));// 下载第一张图片File file = new File(PicUtils.SAVE_FILE, picbean.getPicPubDate() + "/" + picbean.getTitle() + "/");if (!file.exists()) {file.mkdirs();}new PicDownThread(picbean.getTitle(), picbean.getPicPubDate(), first_pic_src, 1).start();// 下载其余图片for (int i = 1; i <= picbean.getPicNum(); i++) {Document docume = Jsoup.connect(picBaseUrl + "/" + i).get();String picDetailUrl = getPicDetailUrl(docume);new PicDownThread(picbean.getTitle(), picbean.getPicPubDate(), picDetailUrl, i + 1).start();}} catch (IOException e) {e.printStackTrace();}}/*** 获取 具体URL* * @param document* @return*/private String getPicDetailUrl(Document document) {return document.getElementsByClass(picbean.picImgPostion).get(0).getElementsByTag("img").get(0).attr("src");}
}

下载采集开始入口

package cn.zuzi.mzitu;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import org.joda.time.DateTime;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;public class CollctPic {public static void main(String[] args) {DateTime dateTime = new DateTime();dateTime.toString("yyyy-MM-dd");List<PicBean> picBeanList = getPicList("2018-03-31");downPic(picBeanList);}/*** 下载图片* * @param picBeanList*/private static void downPic(List<PicBean> picBeanList) {for (PicBean picBean : picBeanList) {new DownPicThread(picBean).start();}}/*** 获取采集的地址* * @return*/private static List<PicBean> getPicList(String dateStr) {List<PicBean> list = new ArrayList<PicBean>();try {Document document = Jsoup.connect(PageBean.baseUrl).get();Element picUl = document.getElementById(PageBean.pageIdString);Elements picAndTime = picUl.getElementsByTag("li");for (Element element : picAndTime) {PicBean picBean = new PicBean();Elements spanELl = element.getElementsByTag("span");String attr = spanELl.get(0).getElementsByTag("a").get(0).attr("href");String title = spanELl.get(0).text();String date = spanELl.get(1).text();if (!dateStr.equals(date)) {//获取首页的图片// break;}picBean.setPicPubDate(date);picBean.setTitle(title);picBean.setPicBaseUrl(attr);list.add(picBean);}} catch (IOException e) {e.printStackTrace();}return list;}}

Jsoup——抓取图片相关推荐

  1. Python通过代理多线程抓取图片

    前言 Python作为一门功能强大的脚本语言,经常被用来写爬虫程序,下面是Python通过代理多线程抓取图片代码 Python爬虫多线程抓取代理服务器参考: http://www.linuxeye.c ...

  2. Jsoup抓取网页数据完成一个简易的Android新闻APP

    前言:作为一个篮球迷,每天必刷NBA新闻.用了那么多新闻APP,就想自己能不能也做个简易的新闻APP.于是便使用Jsoup抓取了虎扑NBA新闻的数据,完成了一个简易的新闻APP.虽然没什么技术含量,但 ...

  3. 获取http地址如何从上面抓取图片_用 Python 自动抓取妹子图

    目录 前言 Media Pipeline 启用Media Pipeline 使用 ImgPipeline 抓取妹子图 瞎比比与送书后话 前言 我们在抓取数据的过程中,除了要抓取文本数据之外,当然也会有 ...

  4. android 获取手机a标签页,Android关于对Jsoup抓取a标签和br标签之间的解决办法...

    Jsoup官方给出的文档,链接:http://www.open-open.com/jsoup/ 描述问题: 学校教务处系统中,我想获取所有科目以及对应的成绩,因此我采用了Jsoup抓取 采集成绩:fe ...

  5. RegExp抓取图片

    RegExp抓取图片 几种显示图片的方式: html语法不严格 <ul><li><img src='img.png' /></li><li> ...

  6. Python抓取图片

    Python 抓取图片(记录) 记录过程,怕忘了.复制就能用. # coding=utf-8 import os import platform from multiprocessing.pool i ...

  7. OPENCV手势识别抓取图片

    PENCV手势识别抓取图片 一位油管的小哥做的项目非常棒,照着写了一个. 代码: 注意:看好cvzone的版本,太新的版本中有个函数没有,如果找不到这个函数的时候请更换一下库的版本. import c ...

  8. c#大华摄像头调用,抓取图片

    目前需引用的文件还在审核中,这边提供有道云的链接提供下载: 文档:c#大华摄像头调用,抓取图片.note 链接:http://note.youdao.com/noteshare?id=1b539df4 ...

  9. iOS怎么制作PDF图片和网络抓取图片

    注意点:注意绘制的逻辑和顺序,切记,千万要注意创建的CF资源必须手动释放,否则,系统可能会认为你有可能将会继续使用该资源,而不会将它绘制到指定文件,特别是PDF上下文,之前我一直没有出来效果,就是因为 ...

  10. 透过 ESP32-CAM 抓取图片 - uPython

    透过 ESP32-CAM 抓取图片 - uPython 下图使用 ESP32-CAM 的摄像头拍照后,将照片透过 HTTP 网页协议,回传给使用者,让使用者可以看到摄像头所拍摄的图片. 图 16. 使 ...

最新文章

  1. 垃圾清理代码_最近弄了个清理电脑C盘的经验
  2. 一款零注解侵入的 API 文档生成工具,你用过吗?
  3. 【已解决】R语言添加行、列,转置操作
  4. 1. 赋值运算符函数
  5. linux语言换成英语,把Linux的默认语言改为英语
  6. mips j指令_MIPS的基本实现
  7. php语法中可以输出调试信息,怎么优雅的输出PHP调试信息
  8. Convert.ToInt32()与int.Parse()的区别
  9. pytorch模型转onnx遇到的问题记录
  10. 数学_最小二乘问题的求解
  11. Python 爬虫-requests 和 selenium 伪装 headers 和代理应对反爬机制
  12. 【c语言课程设计】C语言校园卡管理系统
  13. 背景图片虚化的效果的css样式的实现
  14. 程序员网站有哪些?(欢迎补充)
  15. Qt 之 自定义窗口标题栏
  16. 2022中国汽车测试及质量监控博览会邀请函
  17. andoird 设置锁屏上不显示通知
  18. benchmark在postgresql上的安装及使用
  19. 西瓜视频中视频计划还有机会吗?
  20. 微信小程序,动态改变背景图片

热门文章

  1. 敏感词过滤和谐社会1.0版
  2. 在Ubuntu20.04上安装Nsight Systems
  3. 一个LaTeX论文模板
  4. latex论文模板双栏
  5. chinapub matlab,MATLAB 2020从入门到精通
  6. VS 番茄助手添加头注释 以及使用方式
  7. 高速公路坐标高程计算软件3.1版发布
  8. Unix / Linux 文件系统
  9. Unix操作系统基础:Unix文件系统之文件权限
  10. 西北工业大学生态环境学院张文宇课题组博士后招聘启事