java爬虫

想找一些图片做桌面背景,但是又不想一张张去下载,后来就想到了爬虫。。。

对于爬虫我也没具体用过,在网上一顿搜索后写了个小demo。

爬虫的具体思路就是:

1.调用url爬取网页信息

2.解析网页信息

3.保存数据

刚开始还用正则去匹配,获取img标签中的src地址,但是发现有很多不便(主要我正则不太会),后来发现了jsoup这个神器。 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

以下就用爬取图片为例:

1import com.crawler.domain.PictureInfo; 2import org.bson.types.ObjectId; 3import org.springframework.data.mongodb.core.MongoTemplate; 4import org.springframework.data.mongodb.gridfs.GridFsTemplate; 5import org.springframework.stereotype.Service; 6 7import org.apache.commons.io.FileUtils; 8import org.apache.http.HttpEntity; 9import org.apache.http.client.ClientProtocolException; 10import org.apache.http.client.methods.CloseableHttpResponse; 11import org.apache.http.client.methods.HttpGet; 12import org.apache.http.impl.client.CloseableHttpClient; 13import org.apache.http.impl.client.HttpClients; 14import org.apache.http.util.EntityUtils; 15import org.jsoup.Jsoup; 16import org.jsoup.nodes.Document; 17import org.jsoup.nodes.Element; 18import org.jsoup.select.Elements; 19import org.springframework.util.DigestUtils; 20import org.springframework.util.StringUtils; 21 22import javax.annotation.Resource; 23import java.io.*; 24import java.net.HttpURLConnection; 25import java.net.MalformedURLException; 26import java.net.URL; 27import java.net.URLConnection; 28import java.util.ArrayList; 29import java.util.List; 30import java.util.regex.Matcher; 31import java.util.regex.Pattern; 32 33/** 34 * 爬虫实现 35 *@program: crawler 36 * @description 37 * @author: wl 38 * @create: 2021-01-12 17:56 39 **/ 40@Service 41public class CrawlerService { 42 43 /** 44 * @param url 要抓取的网页地址 45 * @param encoding 要抓取网页编码 46 * @return 47 */ 48 public String getHtmlResourceByUrl(String url, String encoding) { 49 URL urlObj = null; 50 HttpURLConnection uc = null; 51 InputStreamReader isr = null; 52 BufferedReader reader = null; 53 StringBuffer buffer = new StringBuffer(); 54 // 建立网络连接 55 try { 56 urlObj = new URL(url); 57 // 打开网络连接 58 uc =(HttpURLConnection) urlObj.openConnection(); 59       // 模拟浏览器请求 60 uc.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); 61 // 建立文件输入流 62 isr = new InputStreamReader(uc.getInputStream(), encoding); 63 // 建立缓存导入 将网页源代码下载下来 64 reader = new BufferedReader(isr); 65 // 临时 66 String temp = null; 67 while ((temp = reader.readLine()) != null) {// System.out.println(temp+"\n"); 68 buffer.append(temp + "\n"); 69 } 70 System.out.println("爬取结束:"+buffer.toString()); 71 } catch (Exception e) { 72 e.printStackTrace(); 73 } finally { 74 // 关流 75 if (isr != null) { 76 try { 77 isr.close(); 78 } catch (IOException e) { 79 e.printStackTrace(); 80 } 81 } 82 } 83 return buffer.toString(); 84 } 85 86 /** 87 * 下载图片 88 * 89 * @param listImgSrc 90 */ 91 public void Download(List<PictureInfo> listImgSrc) { 92 int count = 0; 93 try { 94 for (int i = 0; i < listImgSrc.size(); i++) { 95 try { 96 PictureInfo pictureInfo = listImgSrc.get(i); 97 String url=pictureInfo.getSrc(); 98 String imageName = url.substring(url.lastIndexOf("/") + 1, url.length()); 99 URL uri = new URL(url); 100 // 打开连接 101 URLConnection con = uri.openConnection(); 102 //设置请求超时为 103 con.setConnectTimeout(5 * 1000); 104 con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); 105 // 输入流 106 InputStream is = con.getInputStream(); 107 // 1K的数据缓冲 108 byte[] bs = new byte[1024]; 109 // 读取到的数据长度 110 int len; 111 // 输出的文件流 112 String src = url.substring(URL.length()); 113 int index = src.lastIndexOf('/'); 114 String fileName = src.substring(0, index + 1); 115 File sf = new File(SAVE_PATH + fileName); 116 if (!sf.exists()) { 117 sf.mkdirs(); 118 } 119 OutputStream os = new FileOutputStream(sf.getPath() + "\\" + imageName); 120 System.out.println(++count + ".开始下载:" + url); 121 // 开始读取 122 while ((len = is.read(bs)) != -1) { 123 os.write(bs, 0, len); 124 } 125 // 完毕,关闭所有链接 126 os.close(); 127 is.close(); 128 System.out.println(imageName + ":--下载完成"); 129 130 } catch (IOException e) { 131 System.out.println("下载错误"+e); 132 } 133 } 134 } catch (Exception e) { 135 e.printStackTrace(); 136 System.out.println("下载失败"+e); 137 } 138 } 139 140 /** 141 * 得到网页中图片的地址-推荐 142 * 使用jsoup 143 * @param htmlStr html字符串 144 * @return List<String> 145 */ 146 public List<PictureInfo> getImgStrJsoup(String htmlStr) { 147 List<PictureInfo> pics = new ArrayList<PictureInfo>(); 148 //获取网页的document树 149 Document imgDoc = Jsoup.parse(htmlStr); 150 //获取所有的img 151 Elements alts = imgDoc.select("img[src]"); 152 for (Element alt : alts) { 153 PictureInfo p=new PictureInfo(); 154 p.setSrc(alt.attr("src")); 155 p.setAlt(alt.attr("alt")); 156 p.setTitle(alt.attr("title")); 157 pics.add(p); 158 } 159 return pics; 160 } 161 162 163 164}

主要方法就这些,只要爬取下来的网页信息包含img标签,就能扒下其对应的图片。 image 最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:909038429 /./*欢迎加入java交流Q君样:909038429一起吹水聊天

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )