知乎脚丫第一弹

这是在弄啥子嘞

想弄这个爬虫,抓一抓网页的信息这个念头,是前段时间面试阿里实习岗位的时候,一位资深面试官向我建议的。他觉得我理论层次达到,但是缺少实践的理解。所以最后也就不出所料的挂了。总结教训,吸取经验,决定要让自己对所学、所识的玩意可视化(这是什么鬼,怎么想到这个词语,暗自窃喜,(@__@) 嘻嘻)。
那到底弄什么呢?这个问题其实也没什么好想的,抓网页信息嘛!妈蛋?什么怎么抓,不会!从哪里入手,不知道!这就是我一开始的状态,后来得益于汪海的blog中python爬虫的启发,决定也用java玩一玩知乎,抓抓里面的2016年欧洲杯的热门话题、编辑推荐、今日最热。

那到底该怎么弄嘞

  • 模拟上网过程(URL)
  • 抓去需要的信息保存本地(正则表达式、I/O操作)
  • 网页浏览中动态加载问题(ps:暂时不懂)
  • 存储海量内容

先从google首页开始

打开google首页,见到的是这样的:
google首页
其实它的里面是这样的:
goole首页源码
这一坨到底是什么,对于完全不懂HTML和CSS的人来说,就是翔…就是翔…
不用怕,我的目的很简单,就是从网页上抓取到goole首页的logo,就是红色标出来的区域:
enter description here
关于HTML语言的属性和用法可以参考W3school上面学习一下,这里只要知道被<a>...</a>括住的就是超链接,就可能是logo的链接地址,也就是要抓的目标。
OK,目标明确,接下来就是找大米做饭了。

直接上代码:

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
    /*
* 爬去google首页的logo图片链接
*/

import java.io.*;
import java.net.*;
import java.util.regex.*;

public class BaiduLogoSpider {
//抓去网页所有内容
static String SendGet(String url) {
// 定义一个字符串用来存储网页内容
String result = "";
// 定义一个缓冲字符输入流
BufferedReader in = null;
try {
// 将string转成url对象
URL realUrl = new URL(url);
// 初始化一个链接到那个url的连接
URLConnection connection = realUrl.openConnection();
// 开始实际的连接 ,这一步是必须的 ,上一步取得URLConnection对象并没有创建实际的网络链接,所以...
connection.connect();
// 初始化 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
// 用来临时存储抓取到的每一行的数据
String line;
while ((line = in.readLine()) != null) {
// 遍历抓取到的每一行并将其存储到result里面
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
// 定义一个样式模板,此中使用正则表达式,括号中是要抓的内容
static String RegexString(String targetStr, String patternStr) {
// 相当于埋好了陷阱,匹配的地方就会掉下去
Pattern pattern = Pattern.compile(patternStr);
// 定义一个matcher用来做匹配
Matcher matcher = pattern.matcher(targetStr);
// 如果找到了
if (matcher.find()) {
// 打印出结果
return matcher.group(1);
}
return "Nothing";
}
public static void main(String[] args) {
// 定义即将访问的链接
String url = "http://www.google.cn";
// 访问链接并获取页面内容
String result = SendGet(url);
// 使用正则匹配图片的src内容
String imgSrc = RegexString(result, "src=\"(.+?)\"");
// 打印结果
System.out.println("网页所有内容="+result);
System.out.println("logo图片的链接="+imgSrc);
}
}

有几个技术点,1、怎么向网页发送GET请求;2、正在表达式书写,可以参考在线测试工具;3、java中则表达式匹配,先编译字符串正则表达式成Pattern对象,再用Pattern对象的matcher()方法活动Matcher对象,最后find()

运行结果:
运行结果
抓到图片链接直接在浏览器中输入可以得到如下的图片:
logo图片

有基础就可以,抓去更复杂的东西咯,fighting,骚年!

热评文章