Maven引入
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
写在application.properties配置文件中
upload.path=G:/imgs
getUrl=https://mp.weixin.qq.com/s/fdllA87IDpUZ34OFBVZdWw
wexinUrl=https://mp.weixin.qq.com
定义Controller
@RestController
@RequestMapping("/crawler")
publicclassCrawlerController{
//存储图片的路径,写在配置文件里面
@Value("${upload.path}")
privateStringpath;
//公众号文章地址,写在配置文件里面
@Value("${getUrl}")
privateStringurl;
//公众号总地址
@Value("${wexinUrl}")
privateStringwexinUrl;
@RequestMapping("/getContent")
publicStringgetContent(){
Stringcontent=null;
StringimgDir=path;
// 输入网址,创建发起Get请求的对象
HttpGethttpGet=newHttpGet(url);
// 创建httpClient对象,类似于打开浏览器
CloseableHttpClienthttpClient=HttpClients.createDefault();
// 类似于浏览器输入网址后,按回车
CloseableHttpResponseexecute=null;
try{
execute=httpClient.execute(httpGet);
// 解析获取数据,判断状态码是不是200
if(execute.getStatusLine().getStatusCode()==200){
HttpEntityentity=execute.getEntity();
content=EntityUtils.toString(entity,"utf8");
Documentdoc=Jsoup.parse(content);
//找到图片标签
Elementsimg=doc.select("img");
for(inti=0;i<img.size();i++){
// 图片地址
StringimgUrl=img.get(i).attr("data-src");
Filesf=newFile(imgDir);
if(!sf.exists()){
sf.mkdirs();
}
// 这里是一个公众号的二维码的图片,先不处理了
// String id = img.get(i).attr("id");
// if ("js_pc_qr_code_img".equalsIgnoreCase(id)) {
// imgUrl = wexinUrl + img.get(i).attr("src");
// }
if(imgUrl!=null&&!imgUrl.equals("")){
StringfileName=DateTimeUitls.getString("yyyyMMddHHmmssSS")+".png";
StringimgPath=imgDir+File.separator+fileName;
FileimgFile=newFile(imgPath);
if(!imgFile.exists()){
// 下载图片
// 构造URL
URLurl=newURL(imgUrl);
// 打开连接
URLConnectioncon=url.openConnection();
//设置请求超时为5s
con.setConnectTimeout(5*1000);
// 输入流
InputStreamin=con.getInputStream();
// 1K的数据缓冲
byte[]bs=newbyte[1024];
// 读取到的数据长度
intlen;
// 输出的文件流
OutputStreamos=newFileOutputStream(imgPath);
// 开始读取
while((len=in.read(bs))!=-1){
os.write(bs,0,len);
}
os.close();
in.close();
}
//重新赋值为本地路径,
// img.get(i).attr("data-src", imgPath);
// img.get(i).attr("src", imgPath);
//上面访问图片可能访问不到,建议定义访问图片的请求方法,所以修改成下面的的路径访问方式
img.get(i).attr("data-src","/crawler/readImg/"+fileName);
img.get(i).attr("src","/crawler/readImg/"+fileName);
//导出 html
content=doc.outerHtml();
}
}
}
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
execute.close();
}catch(IOExceptione){
e.printStackTrace();
}
try{
httpClient.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
returncontent;
}
//建议定义访问图片的请求方法
@RequestMapping("/readImg/{fileName}")
publicvoidreadImg(@PathVariable("fileName")StringfileName,HttpServletResponseresponse){
try{
// fileImage 为服务器存储的实际路径 如 c:\aa\bb.jpg
StringfileImage=path+File.separator+fileName;
FileInputStreamhFile=newFileInputStream(fileImage);// 以byte流的方式打开文件
inti=hFile.available();// 得到文件大小
bytedata[]=newbyte[i];
hFile.read(data);// 读数据
hFile.close();
response.setContentType("image/*");// 设置返回的文件类型
OutputStreamtoClient=response.getOutputStream();// 得到向客户端输出二进制数据的对象
toClient.write(data);// 输出数据
toClient.close();
}catch(IOExceptione){
// 错误处理
PrintWritertoClient;
try{
// 得到向客户端输出文本的对象
toClient=response.getWriter();
response.setContentType("text/html;charset=utf8");
toClient.write("无法打开图片!");
toClient.close();
}catch(IOExceptione1){
e1.printStackTrace();
}
}
}
}
时间格式工具类
public class DateTimeUitls {
public static String getString(String pattern){
SimpleDateFormat df = new SimpleDateFormat(pattern);
return df.format(new Date());
}
}