消失了许久,因为自身的一些事情,导致自己长时间未更新博客。我知道对于学习计算机的人来说大家都有研究过爬虫,有时候需要网上不停的找教程,找思路,我呢,也在最近发现了一个事情,大佬们在网上发的教程有很多都不没有更新,还不算太完善,于是乎,我就自己研究顺带写这么一篇博客

制作一个简单的网络爬虫,爬取网站中的图片

起因是因为我想找一些动漫图片,可是一个一个下载,太慢了所以脑子有个想法就是写一个简单的网络爬虫,这个是最简单最简单的爬虫,使用的是.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这种格式是我下一篇需要讲解的,这里面需要将这个链接拆分以后去获取,只需要大家将我的代码复制以后,修改里面我提到的东西,一般的网站都是可以爬取的。

如果这篇博客帮到您了,帮忙转发一下,让更多的人看到,不会的评论区告诉我,或者说您有更好的想法也可以告诉我