跟朋友聊天总会用到大量表情包,有些人甚至专门收集各种各样的表情包,看看谁能打败谁。今天我就用java爬取了一个斗图网站上的所有表情包,用来充实自己的表情包库。代码逻辑有可能并不完美,哈哈,也花了我几个小时才完成呢。
下载完所有图片,总共有225M.思路:主要通过解析页面的源代码来获取图片的URL地址,然后通过图片地址下载图片到本地,所以要学会使用浏览器进行分析。
- 所用jar包:
jsoup-1.8.1.jar
- 网站首页:
https://doutushe.com/portal/index/index/p/1
- 浏览器:
Chrome
1,获取网页源代码
/*** 获取网页源代码* @author Augustu* @param url 网页地址* @param encoding 网页编码* @return 网页源代码*/public static String getUrlResource(String url,String encoding) {//网页源代码,用String这个容器记录String htmlResource = "";//记录读取网页的每一行数据String temp = null;try {//1,找到网站地址URL theUrl = new URL(url);//2,建立起与网站的连接URLConnection urlConnection = theUrl.openConnection();//3,创建输入流,此处读取的是网页的源代码InputStreamReader isr = new InputStreamReader(urlConnection.getInputStream(),encoding);//4,对输入流进行缓冲,加快读取速度BufferedReader reader = new BufferedReader(isr);//5,一行一行读取源代码,存到htmlResource中while((temp = reader.readLine()) != null) {htmlResource += temp;}} catch (IOException e) {e.printStackTrace();}return htmlResource;}
2,获取页面所有组图片的UrL地址
/*** 获取页面所有组图片的UrL地址* @author Augustu* @param context 每个页面的urL* @return 获取页面所有组图片的UrL地址*/public static String findPictureUrl(String context) {String temp = "";//暂时存储得到的每个urlString pictureUrl = "";//得到所有URL//1,Jsoup将读取的网页源代码解析为Html文档,便可以使用Jsoup的方法操作html元素了,就像javascript一样Document document = Jsoup.parse(context);//2,观察网页源代码,发现每组图片都连接到了另一个URL地址,这个a标签的class为“link-2”Elements groupUrl = document.getElementsByClass("link-2");//3,遍历每个a标签,得到hreffor(Element ele: groupUrl) {//此处我发现每次Url都输出两次,也没找到原因,就用此方法先解决他if(ele.attr("href") == temp) {continue;}temp = ele.attr("href");//4,将所有URL存入String中,并使用空格分开,便于后面分割//本来我使用“|”分隔开来,分割的结果竟然是每个字符都分开了pictureUrl += "https://doutushe.com"+ele.attr("href")+" ";}return pictureUrl;}
3,下载单张图片
/*** 下载单张图片* @param picturl 图片地址* @param filePath 下载路径* @param fileName 下载名*/public static void downPicture(String picturl,String filePath,String fileName) {FileOutputStream fos = null;//输出文件流BufferedOutputStream bos = null;//缓冲输出File file = null;//创建文件对象File dir = new File(filePath);//创建文件保存目录Connection.Response response;try {//1,Jsoup连接地址,得到响应流,ignoreContentType表示忽略网页类型,如果不加会报错(默认只支持文本),因为我们页面是图片response = Jsoup.connect(picturl).ignoreContentType(true).execute();//2,将页面内容按字节输出byte[] img = response.bodyAsBytes();//3,写入本地文件中//判断文件目录是否存在,if(!dir.exists() ){dir.mkdir();//创建文件夹}file = new File(filePath+"\\"+fileName);//创建文件fos = new FileOutputStream(file);bos = new BufferedOutputStream(fos);bos.write(img);//写入本地} catch (IOException e) {e.printStackTrace();}finally{//4,释放资源if(bos!=null){try {bos.close();} catch (IOException e) {e.printStackTrace();}}if(fos!=null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
4,下载所有图片
/*** 下载所有图片* @author Augustu* @param pictureUrl 每组图片url*/public static void downallPicture(String pictureUrl,String downLoadPath) {String picturl = "";String pictureName ="";//String[] pictureUrlArry = pictureUrl.split(" ");//图片组的urlfor(int i=0;i<pictureUrlArry.length;i++) {//遍历得到每组图片的urlString pictureHtml = getUrlResource(pictureUrlArry[i],"utf-8");Document document = Jsoup.parse(pictureHtml);//得到该组图片的分类名称String dir = document.getElementsByTag("blockquote").first().child(0).text();//该标签包含所有图片urlElements elements = document.getElementsByClass("lazy");for(Element ele: elements) {//得到每张图片urlpicturl = ele.attr("data-original");//观察源代码,发现获取的图片地址多了/themes/doutushe/Public/assets/images/doutushe-erweima.jpg,将其删除if(picturl.equals("/themes/doutushe/Public/assets/images/doutushe-erweima.jpg")) {continue;}//得到每张图片的名字,别忘了加后缀pictureName = ele.attr("title")+".gif";//下载该图片downPicture(picturl,downLoadPath+"\\"+dir,pictureName);}}}
5,主函数运行代码
public static void main(String[] args) {String context = "";//观察源代码,发现共有28个页面for(int i=1;i<=28;i++) {//获取每个页面context = getUrlResource("https://doutushe.com/portal/index/index/p/"+i+"","utf-8");//获取该页面所有组图片的urlString pictureUrl = findPictureUrl(context);downallPicture(pictureUrl,"E:\\image\\表情包");}}