Jsoup解析获取品花社图片
Jsoup解析获取品花社图片
emmmm,闲着没事,想起了之前一个学长做的品花社的APP,刚好之前有了解Jsoup这个Java解析HTML的库,便花了三四个小时写了这个东西,把网站上大大小小的MM的图片都一股脑的爬到本地并做了简单的分装。
项目只是学习一下Jsoup的使用和网页解析相关知识,没其他意思。
全部的图片体积大概会是4个多G,修改代码里的MAX_PAGES_NUM变量值即可。
项目地址:https://github.com/Ganart/SpiderMM36D
关于品花社是什么,自己点进去看吧:http://www.mm36d.com/
结果看图吧:
代码在这儿:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class SpiderMM36D {
static class SmallImg {
String id;
String url;
}
//截止到2018年6月21,这个值最大为102,
static int MAX_APGES_NUM = 1;
static String url = "http://www.mm36d.com/home/0/";
//eg:http://www.mm36d.com/belle/0/0/id/2
static String detailUrl = "http://www.mm36d.com/belle/0/0/";
static List<String> oneMMDetailUrls = new ArrayList<>();
static List<SmallImg> allImgObjects = new ArrayList<>();
public static void main(String[] args) throws IOException {
for (int i =1; i<=MAX_APGES_NUM;i++){
gainOnePageElement(i);
}
System.out.println("完成图片链接解析,开始下载图片");
for (int i=0;i<allImgObjects.size();i++){
downloadSmallImg(allImgObjects.get(i));
System.out.println("任务进度:"+((float)(i+1)/allImgObjects.size()));
}
}
//获取小图
public static void gainOnePageElement(int index){
Document document = null;
Elements elements = null;
try {
document = Jsoup.connect(url+index).get();
if (document != null) {
elements = document.getElementsByClass("re-size1-img");
for (Element element:elements){
allImgObjects.add
(subMMImgUrl(element.getElementsByTag("img").toString()));
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
document = null;
elements = null;
}
}
//剪辑出图片的URL和id
public static SmallImg subMMImgUrl(String tag){
String head = "<img class=\"lazy\" data-original=\"";
String withoutHead = tag.substring(head.length());
String cleanUrl = withoutHead.substring(0,withoutHead.indexOf("\""));
SmallImg smallImg = new SmallImg();
smallImg.url = cleanUrl;
String id = tag.substring(tag.indexOf("(")+1,tag.indexOf(")"));
smallImg.id = id;
return smallImg;
}
//剪辑出图片的url
public static String subDetailImgUlr(String tag){
String head = "<img class=\"lazy\" data-original=\"";
String withoutHead = tag.substring(head.length());
String cleanUrl = withoutHead.substring(0,withoutHead.indexOf("\""));
return cleanUrl;
}
//下载小图
public static void downloadSmallImg(SmallImg smallImg){
if (smallImg.url.equals("")){
return;
}
try {
URL imgUrl = new URL(smallImg.url);
String url = smallImg.url;
BufferedInputStream bis = new BufferedInputStream
(imgUrl.openConnection().getInputStream());
byte[] imgArray = new byte[2048*2048];
int len = 0;
File file = new File("E:\\SpiderMM36D\\mmImgs\\"+smallImg.id);
file.mkdir();
BufferedOutputStream bos =
new BufferedOutputStream
(new FileOutputStream(file.getAbsolutePath()+"\\"
+smallImg.id+url.substring(url.lastIndexOf("."))));
while ((len=bis.read(imgArray))!=-1){
bos.write(imgArray,0,len);
}
bos.flush();
bos.close();
bis.close();
gainDetailPageElement(smallImg.id);
oneMMDetailUrls.clear();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//下载大图
public static void downloadBigImg(String id,String picUrl,int i){
if (picUrl.equals("")){
return;
}
try {
URL imgUrl = new URL(picUrl);
BufferedInputStream bis = new BufferedInputStream
(imgUrl.openConnection().getInputStream());
byte[] imgArray = new byte[4096*4096];
int len = 0;
File file = new File("E:\\SpiderMM36D\\mmImgs\\"+id);
file.mkdir();
BufferedOutputStream bos =
new BufferedOutputStream
(new FileOutputStream
(file.getAbsolutePath()+"\\"+id+"_"+i+
picUrl.substring(picUrl.lastIndexOf("."))));
while ((len=bis.read(imgArray))!=-1){
bos.write(imgArray,0,len);
}
bos.flush();
bos.close();
bis.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//每个MM对应的详情页
public static void gainDetailPageElement(String id){
Document document = null;
Elements elements = null;
try {
document = Jsoup.connect(detailUrl+id+"/2").get();
if (document != null) {
elements = document.getElementsByClass("re-sizemm");
for (Element element:elements){
oneMMDetailUrls.add
(subDetailImgUlr
(element.getElementsByTag
("img").toString()));
}
for (int j = 0;j<oneMMDetailUrls.size();j++){
downloadBigImg(id,oneMMDetailUrls.get(j),j);
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
document = null;
elements = null;
}
}
}
Jsoup解析获取品花社图片的更多相关文章
- Java解析word,获取文档中图片位置
前言(背景介绍): Apache POI是Apache基金会下一个开源的项目,用来处理office系列的文档,能够创建和解析word.excel.ppt格式的文档. 其中对word文档的处理有两个技术 ...
- (java)Jsoup爬虫学习--获取网页所有的图片,链接和其他信息,并检查url和文本信息
Jsoup爬虫学习--获取网页所有的图片,链接和其他信息,并检查url和文本信息 此例将页面图片和url全部输出,重点不太明确,可根据自己的需要输出和截取: import org.jsoup.Jsou ...
- [java] jsoup 解析网页获取省市区域信息
到国家统计局抓取数据, 到该class下解析数据 /** * jsoup解析网页 * @author xwolf * @date 2016-12-13 18:11 * @since V1.0.0 */ ...
- Jsoup问题---获取http协议请求失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml.
Jsoup问题---获取http协议请求失败 1.问题:用Jsoup在获取一些网站的数据时,起初获取很顺利,但是在访问某浪的数据是Jsoup报错,应该是请求头里面的请求类型(ContextType)不 ...
- Android利用Jsoup解析html 开发网站客户端小记。
这些天业余时间比较多,闲来无事,想起了以前看过开发任意网站客户端的一篇文章,就是利用jsoup解析网站网页,通过标签获取想要的内容.好了废话不多说,用到的工具为 jsoup-1.7.2.jar包,具体 ...
- jsoup解析HTML及简单实例
jsoup 中文参考文献 http://www.open-open.com/jsoup/ 本文将利用jsoup,简单实现网络抓取的功能,并给出一个小实例,该实例效果为:获取作者本人在博客园写的所 ...
- jsoup解析HTML
Connection conn = Jsoup.connect(String url); conn.data("txtBill", key);// 设置关键字查询字段 Docume ...
- 一步步教你为网站开发Android客户端---HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新ListView
本文面向Android初级开发者,有一定的Java和Android知识即可. 文章覆盖知识点:HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新List ...
- Jsoup 解析 HTML
Jsoup 文档 方法 要取得一个属性的值,可以使用Node.attr(String key) 方法 对于一个元素中的文本,可以使用Element.text()方法 对于要取得元素或属性中的HTML内 ...
随机推荐
- C/C++中数据的存储
学java时了解到不同的数据在系统中存储的位置不一样,有的存在栈里,有的存在堆里.学C/C++时没注意过这个,最近学数据结构时遇到了问题:在定义一个结构体的指针时,系统如何给它分配的空间?从而让我想去 ...
- 【js】高阶函数是个什么?
所谓高阶函数,就是函数中可以传入另一个函数作为参数的函数. 简单一张图,方便理解全文. function 高阶函数(函数){} 这是一个高阶函数,f是传入的函数作为参数. 其实高阶函数用的很多.其实平 ...
- 拒绝QQ空间-手把手教你美化博客
为什么要美化? 博客园的主题看起来是有一些年代感了,应该是不符合当代大学生的审美了,起码我就觉得不行,所以我们要进行一些美化,但是搞技术的人的博客不应该搞得花里胡哨,最好是简洁一些(个人想法),网上有 ...
- Overture小课堂之如何演绎钢琴滑音
在我们学习钢琴和学习使用Overture时,要学习如何弹奏和使用滑音.那么我们先来看看什么是滑音,如何使用钢琴演绎,在Overture里滑音又在哪里呢? 滑音,在音乐术语中通常指一种装饰音和演奏指法. ...
- Java基础实训2
1. 一维数组的创建和遍历. 声明并创建存放4个人考试成绩的一维数组,并使用for循环遍历数组并打印分数.要求: (1) 首先按“顺序”遍历,即打印顺序为:从第一个人到第四个人: (2) ...
- list set map区别及适用场景
list与Set.Map区别及适用场景 1.List,Set都是继承自Collection接口,Map则不是 2.List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重 ...
- 强杀apt-get install进程导致错误的修复办法
关闭了一个安装缓慢的apt-get install终端窗口,安装另一个软件,提示打不开var下的一个锁(没加sudo也是这个错误但会提示是非root用户权限不够导致,但这里不是这个问题),说是另一个进 ...
- The frequent used operation in Linux system
The frequently used operation in Linux system 2017-04-08 12:48:09 1. mount the hard disk: #: fd ...
- [math]本博客已经支持书写数学公式
本博客已经支持mathjax格式公式 使用方法 使用方法单美元符号加单行公式. 使用方法双美元符号加多行公式. 展示 单行公式:\(x^2+2x+1=0\) 多行公式:\[x=\frac{{-b}\p ...
- C++第二章复习与总结(思维导图分享)
在完成了第二章的学习后,为了便于日后的复习整理,我制作了一张思维导图,有需要的可以自取. 基本数据类型 基础类型在cppreference网站上有非常完备的介绍,我一句话两句话也说不清,具体网址我会给 ...