最新手写图片爬虫(针对千库网和一个福利网站)

news/2024/5/13 5:30:32/文章来源:https://blog.csdn.net/u011956212/article/details/82781543

前言:由于前一段时期需要从网站上扒一些图片下来,因为css,js都好扒,就是图片数量众多,需要代码实现,在网上找了一堆以实现的代码,要么没有用,要么功能不是自己想要的,干脆自己写一个,写的时候发现还挺简单的,而且不单单可以下载图片,只要是网站资源都可以,只不过需要针对单个网站去写代码,因为每个网站的html布局都不一样。

1.图片下载工具类:文件路径自己设置

package com.example.demo.util.netbug.downloadImage;/*** Descripition:image download util* Created by jin.tang on 2018/9/7......*/import lombok.extern.java.Log;import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;@Log
public class DownloadPicFromURL {private static String[] imgType = {".jpg", ".jpeg", ".bmp", ".png", ".tif", ".gif", ".fpx", ".svg", ".psd", ".pcx", ".tga", ".exif", "psd", "cdr", "ufo", "raw"};//bmp,jpg,png,tif,gif,pcx,tga,exif,fpx,svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,WMF,webppublic static void main(String[] args) {String url = "http://36.33.40.131:8200/uploadFile//userImg/1531368430530title.png";String path = "d:/html/img/";downloadPicture(url, path);}public static Boolean coverString(String url, String[] imgType) {Boolean flag = false;// 查找是否存在图片格式for (String type : imgType) {if (url.indexOf(type) != -1 || url.toUpperCase().indexOf(type.toUpperCase()) != -1) {flag = true;break;}}return flag;}//链接url下载图片public static void downloadPicture(String urlList, String path) {path = path + new SimpleDateFormat("yyyyMMdd").format(new Date()) + "_" + urlList.substring(urlList.lastIndexOf("/") + 1);if(!coverString(urlList, imgType)){path=path+".jpg";}URL url = null;try {url = new URL(urlList);DataInputStream dataInputStream = new DataInputStream(url.openStream());FileOutputStream fileOutputStream = new FileOutputStream(new File(path));ByteArrayOutputStream output = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int length;while ((length = dataInputStream.read(buffer)) > 0) {output.write(buffer, 0, length);}fileOutputStream.write(output.toByteArray());dataInputStream.close();fileOutputStream.close();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}log.info("img: " + urlList.substring(urlList.lastIndexOf("/") + 1) + " download " + path + " done.....");}
}

 

 

 

2、爬虫实现类

package com.example.demo.util.netbug.downloadImage;import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.*;
import lombok.extern.java.Log;import java.util.List;/*** Descripition:spider for image,batch get image url,then you can download ---just for 千库网* Created by jin.tang on 2018/9/7......*/
@Log
public class SpiderForInternetImage {public static void doSearchResourceToQianku(HtmlPage htmlpage) {try {// 根据名字得到一个表单,查看上面这个网页的源代码可以发现表单的名字叫“f”//final HtmlForm form = htmlpage.getFormByName("f");// 同样道理,获取”百度一下“这个按钮//final HtmlSubmitInput button = form.getInputByValue("百度一下");// 得到搜索框//final HtmlTextInput textField = form.getInputByName("q1");// 最近周星驰比较火呀,我这里设置一下在搜索框内填入”周星驰“//textField.setValueAttribute("周星驰");// 输入好了,我们点一下这个按钮//final HtmlPage nextPage = button.click();// 我把结果转成String//String result = nextPage.asXml();//当前页的图片下载List<HtmlElement> a = htmlpage.getByXPath("//a[@class='db']");a.stream().forEach(href -> {//单个a标签内所有img的下载DomNodeList<HtmlElement> imgs = href.getElementsByTagName("img");doDownload(imgs);});//跳转下一页的页面图片下载List<HtmlAnchor> next = htmlpage.getByXPath("//a[@class='downPage']");HtmlPage nextPage_ = next.get(0).click();doSearchResourceToQianku(nextPage_);//            for(HtmlAnchor ach:achList){
//                System.out.println(ach.getHrefAttribute());
//                ach.click();
//            }//DomNodeList<HtmlElement> p = a.getElementsByTagName("p");//List<HtmlElement> byXPath = p.get(0).getByXPath("span");//DomNodeList<HtmlElement> imgs = byXPath.get(0).getElementsByTagName("img");} catch (Exception e) {log.info("error happen ->" + e.getMessage());e.printStackTrace();}}public static void doSearchResourceToMmonly(WebClient webclient, HtmlPage htmlpage) {try {//当前页的图片下载List<HtmlElement> divs = htmlpage.getByXPath("//div[@class='ABox']");divs.stream().forEach(div -> {//单个div标签内所有img的下载DomNodeList<HtmlElement> a = div.getElementsByTagName("a");//取第一个a标签,里面包含图片链接页面String currentPageUrl = a.get(0).getAttribute("href");//点击进入该页面try {HtmlPage currentHtmlpage = webclient.getPage(currentPageUrl);doDownloadCHildPage(currentHtmlpage, 1);} catch (Exception e) {e.printStackTrace();}});//跳转下一页的页面图片下载List<HtmlElement> div_jump = htmlpage.getByXPath("//div[@id='pageNum']");DomNodeList<HtmlElement> as=div_jump.get(0).getElementsByTagName("a");log.info(""+as.get(as.size()-2));HtmlElement nexta = as.get(as.size()-2);HtmlPage np=nexta.click();doSearchResourceToMmonly(webclient,np );} catch (Exception e) {log.info("error happen ->" + e.getMessage());e.printStackTrace();}}public static void doDownloadCHildPage(HtmlPage currentHtmlpage, int times) throws Exception {List<HtmlElement> div_2 = currentHtmlpage.getByXPath("//div[@class='big-pic']");HtmlElement bigDiv = div_2.get(0);//大图//每页只下一张大图DomNodeList<HtmlElement> imgs = bigDiv.getElementsByTagName("img");doDownloadToMmonly(imgs);//调到下一页的大图页面List<HtmlElement> li = currentHtmlpage.getByXPath("//li[@id='nl']");// DomNodeList<DomElement> li = currentHtmlpage.getElementsById("nl");DomNodeList<HtmlElement> a_ = li.get(0).getElementsByTagName("a");HtmlElement next_ = a_.get(0);//只下前8张图片,因为每套图数量不一样,不好统一if (times <=8) {HtmlPage nextPage_ = next_.click();doDownloadCHildPage(nextPage_, times + 1);}}//单个标签内子img标签的循环下载public static void doDownload(DomNodeList<HtmlElement> imgs) {//  http://bpic.588ku.com/back_pic/03/72/92/6657b9a240d3d1f.jpg!/fh/300/quality/90/unsharp/true/compress/trueSystem.out.println("总共" + imgs.size() + " 张图片 , 开始下载到本地 路径为 : ");// 遍历 下载图片到本地for (HtmlElement img : imgs) {if ("".equals(img.getAttribute("data-original")) || !img.getAttribute("data-original").contains("http")) {log.info("current image src ==> " + img.getAttribute("data-original") + " :is not right!");} else {log.info("current image src ==> " + img.getAttribute("data-original") + " :is  right!");String imgUrl = img.getAttribute("data-original").substring(0, img.getAttribute("data-original").contains("!") ? img.getAttribute("data-original").lastIndexOf("!") : img.getAttribute("data-original").length());DownloadPicFromURL.downloadPicture(imgUrl, "d:/html/img/");}}}//单个标签内子img标签的循环下载public static void doDownloadToMmonly(DomNodeList<HtmlElement> imgs) {//  http://bpic.588ku.com/back_pic/03/72/92/6657b9a240d3d1f.jpg!/fh/300/quality/90/unsharp/true/compress/trueSystem.out.println("总共" + imgs.size() + " 张图片 , 开始下载到本地 路径为 : ");// 遍历 下载图片到本地for (HtmlElement img : imgs) {if ("".equals(img.getAttribute("src")) || !img.getAttribute("src").contains("http")) {log.info("current image src ==> " + img.getAttribute("src") + " :is not right!");} else {log.info("current image src ==> " + img.getAttribute("src") + " :is  right!");String imgUrl = img.getAttribute("src").substring(0, img.getAttribute("src").contains("!") ? img.getAttribute("src").lastIndexOf("!") : img.getAttribute("src").length());DownloadPicFromURL.downloadPicture(imgUrl, "d:/html/img/");}}}public static void main(String[] args) {try {// 得到浏览器对象,直接New一个就能得到,现在就好比说你得到了一个浏览器了WebClient webclient = new WebClient();// 这里是配置一下不加载css和javaScript,配置起来很简单,是不是webclient.getOptions().setCssEnabled(false);webclient.getOptions().setJavaScriptEnabled(false);//做的第一件事,去拿到这个网页,只需要调用getPage这个方法即可HtmlPage htmlpage = webclient.getPage("http://588ku.com/beijing/0-0-pxnum-0-8-0-0-0-1/?hd=205");doSearchResourceToQianku(htmlpage);//            HtmlPage htmlpage = webclient.getPage("http://www.mmonly.cc/mmtp/");
//            doSearchResourceToMmonly(webclient, htmlpage);} catch (Exception e) {log.info("error happen ->" + e.getMessage());e.printStackTrace();}}
}

 

3、

<!-- https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit -->
<dependency><groupId>net.sourceforge.htmlunit</groupId><artifactId>htmlunit</artifactId><version>2.32</version>
</dependency>

 

4、福利网站的下载结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_885350.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.Net修改网站项目调试时的虚拟目录

有些项目需要在IIS发布的时候&#xff0c;将网站发布到虚拟目录&#xff0c;为了保持调试和发布的路径同一&#xff0c;一般会修改VS调试的虚拟目录 一、Web应用程序 Web应用程序的修改方式非常简单&#xff0c;在解决方案资源管理器->项目>右键>属性>Web>服务…

在云服务器上建立网站

1.修改ECS实例的安全组规则&#xff0c;开放Web服务端口 新购买的ECS实例默认已开启远程管理端口&#xff08;22、3389&#xff09;&#xff0c;若希望在云服务器上建立网站&#xff0c;还需要开启80端口。 点击右侧“更多—更改安全组” 点击“新建安全组” 默认状态是没有…

阿里云服务器或者其他网站绑定域名方法

阿里云服务器或者其他网站绑定域名方法 |浏览&#xff1a;6896|更新&#xff1a;2014-04-18 17:25|标签&#xff1a;域名 1 2 3 4 分步阅读 阿里云服务器或者其他服务器绑定域名方法。添加高级网站标志&#xff0c;使域名解析。 工具/原料 服务区 已解析域名或者站点 方法/步骤…

阿里云服务器或者其他网站绑定域名方法

阿里云服务器或者其他网站绑定域名方法 |浏览&#xff1a;6896|更新&#xff1a;2014-04-18 17:25|标签&#xff1a;域名 1 2 3 4 分步阅读 阿里云服务器或者其他服务器绑定域名方法。添加高级网站标志&#xff0c;使域名解析。 工具/原料 服务区 已解析域名或者站点 方法/步骤…

高性能网站使用的14条技术

Translated by mask 从2004年开始&#xff0c;我开始进入雅虎的异常表现小组。我们是一个很小的队伍&#xff0c;专门针对雅虎的产品进行质量检测和改进&#xff0c;我作为一个后端工程师&#xff0c;现在却开始捣鼓前端代码优化方面的工程&#xff0c;所以我认为这是一个极好…

成就大型高性能网站的十项规则

在我们公司ChinaNetCloud&#xff0c;见过多种不同类型的网站和系统&#xff0c;有好也有差。其中有些系统拥有良好的服务器/网络架构&#xff0c;并且进行了合理的调整和监控;然而一般的系统都会有安全和性能上的问题&#xff0c;不能良好运行&#xff0c;也无法变得更流行。 …

怎么让网站快速生成手机App?

初雪云 如果你一个手机站&#xff0c;想给网站加个壳&#xff0c;封装成一个APP。打开显示的还是网站&#xff0c;就是多了启动页面&#xff0c;可以的话能在加上加载页面&#xff0c;标签导航栏&#xff0c;可以实现吗&#xff1f;我的回答是肯定的&#xff0c;现在APP的开发成…

电商分析:网站运营不得不做的用户分析

当电子商务网站成功地把一个访客转化成一个客户之后&#xff0c;如何提高这个客户对于网站的忠诚度&#xff0c;继而增加客户对于网站的整体贡献值就变得非常重要了&#xff0c; 因为带来一个新客户的成本是维护好一个老客户的3 &#xff5e;5 倍 。只有有效地提高每个客户的消…

anaconda git/镜像网站下载压缩包后本地安装

**情景&#xff1a;有时候会从git或者非官方下载第三方库&#xff0c;无法从pip里查找 ** 1、从镜像网站&#xff08;https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/win-64/&#xff09;或者其他情况下载下压缩包&#xff0c;不要解压&#xff08;格式为zip/.tar.g…

爬山虎采集实战-站长之家网站排行榜

目标采集网址&#xff1a;中文网站总排名_网站排行榜 类型&#xff1a;标准列表页详情页翻页 数据量&#xff1a;1895页 x 30/页 56850条数据 采集工具&#xff1a;爬山虎采集器 爬山虎采集器 - 简单易用的网页数据采集工具_免费网页爬虫软件 首先我们建立一个任务&#xff0…

利用阿里云对象存储(OSS)提升小网站的访问速度

相信有不少同行都喜欢做一个自己的小网站。毕竟CSDN的广告确实很恶心。&#xff08;是不是要封我的号了&#xff0c;哈哈~~~&#xff09; 对于一些穷学生&#xff0c;没错就是本人。一般买的服务器的都不太贵&#xff0c;所以性能确实不太强。例如我的1核2G1M带宽的 腾讯云服务…

博客网站的安全运维尝试

树莓派 最近博客经常时不时的被人攻击&#xff0c;有时候对网站影响不大&#xff0c;有的时候对网站影响很大&#xff0c;会导致网站持续性的CPU过高。 如果网站或者服务器因为漏洞被攻击、被黑导致了异常的话&#xff0c;一般服务器肯定会存在一些日志或者读写文件的操作。我…

惊!一个千万级 PV 规模高性能高并发网站架构

作者&#xff1a;一盏烛光&#xff0c;贤牛特邀工程师。 成为【贤牛】工程师&#xff0c;按需运维&#xff0c;灵活用工&#xff0c;让运维工程师多赚一些零花钱&#xff0c;多一些企业级运维经验。 客户端&#xff1a;缓存&#xff08;expires&#xff09;、deflate 压缩 缓存…

wap网站首页宽度和长度统计分析

1、手机wap网页显示基本数据 2、手机以下特征影响页面宽度&#xff1a; Wap页面在手机的显示宽度由手机决定&#xff1a; 大屏手机是240和320两种宽度&#xff0c;目前各网站在宽度显示问题的处理上&#xff0c;有固定页面宽度&#xff08;如空中网、搜狐网等&#xff09;和自…

手机网站重构经验分享(S60V3篇)

前言 做WEB重构的同学都应该知道,我们一般需要在一个操作系统 (Windows XP)和4种以上的浏览器(IE678,Firefox,Chrome,Opera等)上测试页面的兼容性。 相对而言,手机上的页面兼容性测试,相当痛苦!手机光操作系统都有S60V3,S60V5,MTK,Android,Windows Mobile等等,每个操作系统上除…

教程:利用Cloudflare网关搭建访问IPFS网站

最近&#xff0c;笔者的微信朋友圈被“Cloudflare网关”刷屏了&#xff0c;到底是怎么回事呢&#xff1f; 原来在9月17日这天&#xff0c;IPFS项目团队Protocol Labs发布了一条推特&#xff0c;为美国互联网安全提供商Cloudflare的一款新产品打call。据悉&#xff0c;该产品可…

Axure实战06:创建一个AppleSymbol图标库网站

在本章中&#xff0c;你将学会如何使用Axure中继器和内联框架创建一个AppleSymbol图标库网站。 项目背景 在我们开发iOS应用程序过程&#xff0c;常常会用到图标按钮&#xff0c;Apple提供了一整套官网的图标&#xff0c;开发人员可以直接使用Apple设计的官网图标快速开发App…

网站搭建——环境搭建

前言&#xff1a; 之前做的一个网站是在windows环境下进行开发和部署的&#xff0c;现在想导入到Linux环境下。由于使用的实验室电脑&#xff0c;不方便直接安装Linux系统&#xff0c;所以选择了使用Vmware&#xff0c;然后在安装Linux的做法&#xff0c;安装后Linux后需要安装…

【网页实战】html+css+js超简易书籍购买网站实现(FindMyBook)

代码链接&#xff1a;https://github.com/LimxRabbit/FindMyBook.git 页面截图&#xff08;功能描述&#xff09;&#xff1a;