Jsoup——抓取图片
楔子
学习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——抓取图片相关推荐
- Python通过代理多线程抓取图片
前言 Python作为一门功能强大的脚本语言,经常被用来写爬虫程序,下面是Python通过代理多线程抓取图片代码 Python爬虫多线程抓取代理服务器参考: http://www.linuxeye.c ...
- Jsoup抓取网页数据完成一个简易的Android新闻APP
前言:作为一个篮球迷,每天必刷NBA新闻.用了那么多新闻APP,就想自己能不能也做个简易的新闻APP.于是便使用Jsoup抓取了虎扑NBA新闻的数据,完成了一个简易的新闻APP.虽然没什么技术含量,但 ...
- 获取http地址如何从上面抓取图片_用 Python 自动抓取妹子图
目录 前言 Media Pipeline 启用Media Pipeline 使用 ImgPipeline 抓取妹子图 瞎比比与送书后话 前言 我们在抓取数据的过程中,除了要抓取文本数据之外,当然也会有 ...
- android 获取手机a标签页,Android关于对Jsoup抓取a标签和br标签之间的解决办法...
Jsoup官方给出的文档,链接:http://www.open-open.com/jsoup/ 描述问题: 学校教务处系统中,我想获取所有科目以及对应的成绩,因此我采用了Jsoup抓取 采集成绩:fe ...
- RegExp抓取图片
RegExp抓取图片 几种显示图片的方式: html语法不严格 <ul><li><img src='img.png' /></li><li> ...
- Python抓取图片
Python 抓取图片(记录) 记录过程,怕忘了.复制就能用. # coding=utf-8 import os import platform from multiprocessing.pool i ...
- OPENCV手势识别抓取图片
PENCV手势识别抓取图片 一位油管的小哥做的项目非常棒,照着写了一个. 代码: 注意:看好cvzone的版本,太新的版本中有个函数没有,如果找不到这个函数的时候请更换一下库的版本. import c ...
- c#大华摄像头调用,抓取图片
目前需引用的文件还在审核中,这边提供有道云的链接提供下载: 文档:c#大华摄像头调用,抓取图片.note 链接:http://note.youdao.com/noteshare?id=1b539df4 ...
- iOS怎么制作PDF图片和网络抓取图片
注意点:注意绘制的逻辑和顺序,切记,千万要注意创建的CF资源必须手动释放,否则,系统可能会认为你有可能将会继续使用该资源,而不会将它绘制到指定文件,特别是PDF上下文,之前我一直没有出来效果,就是因为 ...
- 透过 ESP32-CAM 抓取图片 - uPython
透过 ESP32-CAM 抓取图片 - uPython 下图使用 ESP32-CAM 的摄像头拍照后,将照片透过 HTTP 网页协议,回传给使用者,让使用者可以看到摄像头所拍摄的图片. 图 16. 使 ...
最新文章
- 垃圾清理代码_最近弄了个清理电脑C盘的经验
- 一款零注解侵入的 API 文档生成工具,你用过吗?
- 【已解决】R语言添加行、列,转置操作
- 1. 赋值运算符函数
- linux语言换成英语,把Linux的默认语言改为英语
- mips j指令_MIPS的基本实现
- php语法中可以输出调试信息,怎么优雅的输出PHP调试信息
- Convert.ToInt32()与int.Parse()的区别
- pytorch模型转onnx遇到的问题记录
- 数学_最小二乘问题的求解
- Python 爬虫-requests 和 selenium 伪装 headers 和代理应对反爬机制
- 【c语言课程设计】C语言校园卡管理系统
- 背景图片虚化的效果的css样式的实现
- 程序员网站有哪些?(欢迎补充)
- Qt 之 自定义窗口标题栏
- 2022中国汽车测试及质量监控博览会邀请函
- andoird 设置锁屏上不显示通知
- benchmark在postgresql上的安装及使用
- 西瓜视频中视频计划还有机会吗?
- 微信小程序,动态改变背景图片