申明:以下爬虫只是作为学习技术记录,其目的只是了解相关技术,并未将其作为工具进行使用
引言:这些爬虫只是单纯的通过图片链接进行爬取,因此这些图片都是经过处理过的,图片一般很小,像素点和清晰度都是我不能接受的,因此对于图片,在下一般是通过提供下载功能的图片网站进行收集,遇到喜欢的随手下一下。
因为以前写过一点点,因此这份小代码就直接搬运了以前的代码进行了修改,花费的时间不多。
这些代码还有很多地方可以完善,同时有很多东西是可以深入学习的,比如jsoup的selector,css选择器,java中Map,Map的升级,集合等等,以及模块化编程,代码优化,算法思考等等,都说略懂皮毛,一想到这些就知道连皮都还没懂
唯美女生网站
主要代码
public static void main(String[] args) throws IOException, InterruptedException { Document pagedocu = requestDoc(request("https://www.wmgirl.com/")); // Classification-->分类 Elements Classifications1 = pagedocu.select(".nav.navbar-nav.fright.nav-cate-pc.navbar-nav-box>li"); Elements Classifications2 = pagedocu.select(".row>.col-md-2"); LinkedHashMap<String,String> ClassificationMap = new LinkedHashMap<>(); // 获取小姐姐分类 添加至Map字典之中 for(Element Classification:Classifications1) { ClassificationMap.put(Classification.select("a").text(),Classification.select("a").attr("href")); } for(Element Classification:Classifications2) { ClassificationMap.put(Classification.select("a").text(),Classification.select("a").attr("href")); } // 从字典中去除无关选项 ClassificationMap.remove("首页"); ClassificationMap.remove("关于"); ClassificationMap.remove("浏览历史"); ClassificationMap.remove("周杰伦新歌"); // System.out.println(ClassificationMap); // 选择下载的类型 int i = 0; ArrayList<String> TypeData = new ArrayList<>(); for(String key:ClassificationMap.keySet()) { i++; System.out.println("类型"+i+": "+key); TypeData.add(ClassificationMap.get(key)); } System.out.print("请选择小姐姐类型(输入标号):"); Scanner in = new Scanner(System.in); int choice = in.nextInt(); // 访问类型对应的网址 String ClassificationUrl = "https://www.wmgirl.com"+TypeData.get(choice-1); //System.out.println(ClassificationUrl); pagedocu = requestDoc(request(ClassificationUrl)); // 提取网址中的每一组小姐姐对应的网址 Elements GroupUrls = pagedocu.select(".waterfall.waterfall .item"); ArrayList<String> GroupUrlsList = new ArrayList<>(); // 得到每组图片的标题图片的Url /*for(Element PictureUrl :PictureUrls) { Urls.add(PictureUrl.select(".item-content.tab-content a img").attr("src")); }*/ ArrayList<String> GroupUrlsList2 = new ArrayList<>(); for (Element GroupUrl:GroupUrls) { GroupUrlsList.add(GroupUrl.select(".item-content.tab-content a").attr("href")); } int j = 0; for(String data : GroupUrlsList) { String GroupUrl = "https://www.wmgirl.com"+data; System.out.println("请求目标主页Url:"+GroupUrl); pagedocu = requestDoc(request(GroupUrl)); // 获取最终图片下载地址 Elements FinalUrls = pagedocu.select(".picbox>div"); ArrayList<String> FinalUrlsList = new ArrayList<>(); System.out.println("第"+(j+1)+"组图片:"); int numflag = 1; for(Element FinalUrl : FinalUrls) { FinalUrlsList.add(FinalUrl.select("img").attr("src")); System.out.println("下载的第"+numflag+"张图片网址:"+FinalUrl.select("img").attr("src")); numflag++; } j++; //下载 System.out.println("--------------------------------------------------------------------------------"); System.out.println("开始下载....."); Download(FinalUrlsList,TypeData.get(choice-1),j); System.out.println("--------------------------------------------------------------------------------"); } }
演示画面
JDK环境:jdk-14
JDK1.8环境可能无法运行,可以下载上面的jdk-14然后修改环境变量
代码存在的问题(有时间的可以自己改一下)
- 1)未设置代理ip和代理池—>因此采用了延时爬取,每一次爬取过后会停止十秒左右
- 2)下载的图片是被处理过的
- 3)对于爬虫异常未作处理,健壮性弱
- 代码是怎么方便怎么来,菜鸡鸡中鸡水平,图一乐呵
测试爬取结果(注意图片大小)
百度云盘
已经打包成jar文件,可以下载jar文件查看完整代码,其中使用到的jar依赖包也可以看到
- 链接:https://pan.baidu.com/s/1-E8oyDKPttuX7bifh1VhhA 提取码:1234
- 运行:安装java环境后,打开cmd,输入命令即可
- java -jar .\wmGirls.jar
必应壁纸
这份代码和上面是一样的,准确来讲上面的代码是将下面的代码改了一下,下面的代码要更早一点面世
必应壁纸是提供了下载功能的,所以如果是学习的话采用上面的代码学习即可,感谢必应作者(攻城狮小哥一枚)为我们提供的必应壁纸,下面的代码仅仅学习使用,不用做爬取工具。
- 部分代码
String StrUrl = "https://bing.ioliu.cn";
for (int i = startNum; i < startNum + NumNum; i++) {
//请求主页时候挂起5s
System.out.println("正在请求主页中...." + "请等待5s");
sleep(5000);
HttpEntity PageHome = request("https://bing.ioliu.cn/?p=" + i);
System.out.println("请求成功,接下来开始下载这一页图片...");
//请求的html文档
String Pagehtml = EntityUtils.toString(PageHome, "utf-8");
Document pagedocu = Jsoup.parse(Pagehtml);
//拿取请求页面的图片相关数量信息
String Numdiv = pagedocu.select(".page span").first().text();//结果是1 / 133 字符串
String[] num = Numdiv.split(" ");//以空格分割成字符串数组
//拿取图片的相关其他信息存储在数组Names中
ArrayList<String> Names = new ArrayList<String>();
Elements Namedivs = pagedocu.getElementsByClass("description");
for (Element Namediv : Namedivs) {
String name = Namediv.select("h3").text();
String[] Name = name.split("\\(");
Names.add(Name[0]);
}
//设置动态数组存储url
ArrayList<String> Urls = new ArrayList<String>();
//获取url所在的所有列表
Elements containers = pagedocu.getElementsByClass("item");
for (Element container : containers) {
Elements item = container.select(".card.progressive");
Urls.add(item.select("a").attr("href"));
}
//写入文件中 //父路径
File file = new File("C:\\Users\\31327\\Desktop", "必应壁纸");
//判断文件夹是否存在
if (!file.exists()) {
file.mkdir();
}
int cnt = 1;
for (String str : Urls) {
//url中需要替换的目标字符串
String strobeNam = "home_" + i;
str = str.replace(strobeNam, "download");
System.out.println("图片网址是:" + StrUrl + str);
//文件子路径
String ChildFile = i + "-" + cnt + "(" + num[2] + ")-" + Names.get(cnt - 1) + ".jpg";
//时间间隔
int time = ran();
File Fileuser = new File(file, ChildFile);
//判断图片是否存在
if (!Fileuser.exists()) {
//第一种请求 Httpclient请求
HttpEntity httpEntity1 = request(StrUrl + str);
//写入文件夹
InputStream in = httpEntity1.getContent();
FileUtils.copyInputStreamToFile(in, Fileuser);
//打印下载信息
System.out.println("第" + num[0] +"页"+i+"-"+cnt+"下载成功,总计有" +num[2] + "页,下次时间间隔是" + time + "s");
sleep(time * 1000);
} else {
System.out.println("第" + num[0] + "页" + i + "-" + cnt + "张图片已存在"/*+",本次时间间隔是"+(time*1000)*/);
}
cnt++;
}
}
System.out.println("下载完成!");
- 测试结果
- 附:jar文件我就不公布了,代码差不多已经全部放出来了。
其他
- 另外推荐几个壁纸网站
别问,问就是没爬过,只是简单测试过,
知乎
- 知乎的话,要复杂一点,但是也更好玩一点
- 需要携带cookies,同时直接使用网址是无法拿到图片的,必须去js文件里面结合网页源代码然后进行处理才能拿到图片网址
- 好玩的点就在于知乎的每一篇回答的网址都只有一串数字不同,因此写完一个爬虫后,可以弄出来一个模板,当需要访问哪篇回答里的图片时只需要将那串数字输入即可
代码不发出来了,和上面整体思路是一样的。