消失了许久,因为自身的一些事情,导致自己长时间未更新博客。我知道对于学习计算机的人来说大家都有研究过爬虫,有时候需要网上不停的找教程,找思路,我呢,也在最近发现了一个事情,大佬们在网上发的教程有很多都不没有更新,还不算太完善,于是乎,我就自己研究顺带写这么一篇博客
制作一个简单的网络爬虫,爬取网站中的图片
起因是因为我想找一些动漫图片,可是一个一个下载,太慢了所以脑子有个想法就是写一个简单的网络爬虫,这个是最简单最简单的爬虫,使用的是.net去获取,咱们先从最简单的开始,后续会慢慢跟进,下面先奉上代码,之后一一讲解 可以直接去我的GitHub仓库 直接下载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| import java.io.*; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern;
public class MyJavaDeom {
//网站地址 private static final String URL = "https://www.jder.net/mantu?post_order=comments"; //匹配图片的正则表达式 private static final String IMGURL_REG = "data-src=(.*?)[^\"]* "; // 获取src路径的正则 private static final String IMGSRC_REG = "[a-zA-z]+://[^\\s]*";
public static void main(String[] args){ try { MyController cm = new MyController(); //获取HTML内容 String HTML = cm.getHtml(URL); // System.out.println(HTML); //获取图片标签 List<String> imgUrl = cm.getImageUrl(HTML); //获取图片src地址 List<String> imgSrc = cm.getImageSrc(imgUrl); //下载图片 cm.Download(imgSrc); } catch (Exception e) { e.printStackTrace(); } }
//获取HTML内容 private String getHtml(String url)throws Exception{ URL url1 = new URL(url); URLConnection connection = url1.openConnection(); InputStream in = connection.getInputStream(); InputStreamReader isr = new InputStreamReader(in); BufferedReader br = new BufferedReader(isr);
String line; StringBuffer sb = new StringBuffer(); while((line = br.readLine())!=null){ sb.append(line,0,line.length()); sb.append('\n'); } br.close(); isr.close(); in.close(); return sb.toString(); }
//获取ImageUrl地址 private List<String> getImageUrl(String html){ Matcher matcher= Pattern.compile(IMGURL_REG).matcher(html); List<String> listimgurl = new ArrayList<String>(); while (matcher.find()){ listimgurl.add(matcher.group()); } return listimgurl; }
//获取ImageSrc地址 private List<String> getImageSrc(List<String> listimageurl){ List<String> listImageSrc=new ArrayList<String>(); for (String image:listimageurl){ Matcher matcher=Pattern.compile(IMGSRC_REG).matcher(image); while (matcher.find()){ listImageSrc.add(matcher.group().substring(0, matcher.group().length()-1)); } } return listImageSrc; }
//下载图片 private void Download(List<String> listImgSrc) { try { for (String url : listImgSrc) { String imageName = url.substring(url.lastIndexOf("/") + 1, url.length());
URL uri = new URL(url); InputStream in = uri.openStream();
FileOutputStream fo = new FileOutputStream(new File("image/"+imageName)); byte[] buf = new byte[1024]; int length = 0; while ((length = in.read(buf, 0, buf.length)) != -1) { fo.write(buf, 0, length); } in.close(); fo.close(); System.out.println(uri + "下载完成"); } } catch (Exception e) { System.out.println("下载失败"); } } }
|
修改源码
需要更改的地方我用图片贴粗来

网站地址就是你正在浏览的这个网页复制到网站地址中
匹配图片的正则表达式这一行中需要修改的是引号中的字符串,关于正则表达式可以查看正则表达式的入门
获取src路径一般是不需要更改的

修改你要保存的文件夹地址,因为我这个只是简单的爬虫,所以没有创建文件夹这选项,需要手动创建,我将图片直接下载至src目录下的image的文件夹中,您想下载其余文件夹就需要修改成这种形式 “D:\deom\“,其余都不要去修改,原理就是阐述一遍,第一步,这个程序运行以后会去html页面解析,去页面中寻找您写在前面的正则表达式,正则表达式一般后面就是src地址,运行下载,将文件下载你附属的文件夹
关于html页面的获取
上述所说的所有都只是这个程序运行的结果和修改位置,接下来所说的都是比较重要的,因为你能不能将图片爬取这一步就不能错,否则不管怎么样都是无法爬取的
获取正则的步骤
将你的网页打开,按F12一般只要按F12都能打开,如若打不开,谷歌内核的可以看下面这个图片
打开以后,接下来就很简单,找到小鼠标,点击小鼠标让它变成蓝色。
用蓝色样式点击图片会直接跳转到图片链接。
这样操作完以后继续下一步
跳转到链接以后会出现一个到这一步基本上就要结束了将class后面的data-src复制粘贴到正则表达式里面,或许还有人会问,这后面没有data-src怎么办,就像下面这种
这种就只需要将src放入
或者大家打开以后会遇到如下格式的样式/uploads/allimg/200604/001849-15912011295e8a.jpg这种格式是我下一篇需要讲解的,这里面需要将这个链接拆分以后去获取,只需要大家将我的代码复制以后,修改里面我提到的东西,一般的网站都是可以爬取的。
如果这篇博客帮到您了,帮忙转发一下,让更多的人看到,不会的评论区告诉我,或者说您有更好的想法也可以告诉我