网页源代码抓取工具(【本文介绍】爬取别人网页上的内容,听上的样子)
优采云 发布时间: 2021-11-08 14:10网页源代码抓取工具(【本文介绍】爬取别人网页上的内容,听上的样子)
【本文介绍】
抓取其他人网页上的内容听起来很有趣。只需几步,您就可以完成超出您能力范围的事情,例如?比如天气预报,你不能带着仪器自己去测量!当然,最好使用 webService 来获取天气预报。这里只是一个例子。话不多说,看看效果吧。
【影响】
找个天气预报员网站试试:
从图中可以看出,天气是今天(6日)。让我们以此为例来获取今天的天气!
最后,背景打印出来:
今天:6日
天气:雷阵雨
温度:26°~34°
风力:微风
【思维】
1、通过url获取输入流————2、获取网页html代码————3、用正则表达式抽取有用的信息————4、拼装成想要的格式
其实最难的是第三点。如果对正则表达式不熟悉,基本会在这一步挂掉——比如我的T_T。为了提取正确的数据,我匹配了很多次。如果能匹配一次,代码量会少很多!
【代码】
1 package com.zjm.www.test;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.io.InputStreamReader;
7 import java.net.HttpURLConnection;
8 import java.net.URL;
9 import java.util.regex.Matcher;
10 import java.util.regex.Pattern;
11
12 /**
13 * 描述:趴取网页上的今天的天气
14 * @author zjm
15 * @time 2014/8/6
16 */
17 public class TodayTemperatureService {
18
19 /**
20 * 发起http get请求获取网页源代码
21 * @param requestUrl String 请求地址
22 * @return String 该地址返回的html字符串
23 */
24 private static String httpRequest(String requestUrl) {
25
26 StringBuffer buffer = null;
27 BufferedReader bufferedReader = null;
28 InputStreamReader inputStreamReader = null;
29 InputStream inputStream = null;
30 HttpURLConnection httpUrlConn = null;
31
32 try {
33 // 建立get请求
34 URL url = new URL(requestUrl);
35 httpUrlConn = (HttpURLConnection) url.openConnection();
36 httpUrlConn.setDoInput(true);
37 httpUrlConn.setRequestMethod("GET");
38
39 // 获取输入流
40 inputStream = httpUrlConn.getInputStream();
41 inputStreamReader = new InputStreamReader(inputStream, "utf-8");
42 bufferedReader = new BufferedReader(inputStreamReader);
43
44 // 从输入流读取结果
45 buffer = new StringBuffer();
46 String str = null;
47 while ((str = bufferedReader.readLine()) != null) {
48 buffer.append(str);
49 }
50
51 } catch (Exception e) {
52 e.printStackTrace();
53 } finally {
54 // 释放资源
55 if(bufferedReader != null) {
56 try {
57 bufferedReader.close();
58 } catch (IOException e) {
59 e.printStackTrace();
60 }
61 }
62 if(inputStreamReader != null){
63 try {
64 inputStreamReader.close();
65 } catch (IOException e) {
66 e.printStackTrace();
67 }
68 }
69 if(inputStream != null){
70 try {
71 inputStream.close();
72 } catch (IOException e) {
73 e.printStackTrace();
74 }
75 }
76 if(httpUrlConn != null){
77 httpUrlConn.disconnect();
78 }
79 }
80 return buffer.toString();
81 }
82
83 /**
84 * 过滤掉html字符串中无用的信息
85 * @param html String html字符串
86 * @return String 有用的数据
87 */
88 private static String htmlFiter(String html) {
89
90 StringBuffer buffer = new StringBuffer();
91 String str1 = "";
92 String str2 = "";
93 buffer.append("今天:");
94
95 // 取出有用的范围
96 Pattern p = Pattern.compile("(.*)()(.*?)()(.*)");
97 Matcher m = p.matcher(html);
98 if (m.matches()) {
99 str1 = m.group(3);
100 // 匹配日期,注:日期被包含在 和 中
101 p = Pattern.compile("(.*)()(.*?)()(.*)");
102 m = p.matcher(str1);
103 if(m.matches()){
104 str2 = m.group(3);
105 buffer.append(str2);
106 buffer.append("\n天气:");
107 }
108 // 匹配天气,注:天气被包含在<p class="wea" title="..."> 和 中
109 p = Pattern.compile("(.*)(
)(.*?)()(.*)");
110 m = p.matcher(str1);
111 if(m.matches()){
112 str2 = m.group(5);
113 buffer.append(str2);
114 buffer.append("\n温度:");
115 }
116 // 匹配温度,注:温度被包含在
和 中
117 p = Pattern.compile("(.*)(<p class=\"tem tem2\"> )(.*?)()(.*)");
118 m = p.matcher(str1);
119 if(m.matches()){
120 str2 = m.group(3);
121 buffer.append(str2);
122 buffer.append("°~");
123 }
124 p = Pattern.compile("(.*)(<p class=\"tem tem1\"> )(.*?)()(.*)");
125 m = p.matcher(str1);
126 if(m.matches()){
127 str2 = m.group(3);
128 buffer.append(str2);
129 buffer.append("°\n风力:");
130 }
131 // 匹配风,注: 和 中
132 p = Pattern.compile("(.*)()(.*?)()(.*)");
133 m = p.matcher(str1);
134 if(m.matches()){
135 str2 = m.group(3);
136 buffer.append(str2);
137 }
138 }
139 return buffer.toString();
140 }
141
142 /**
143 * 对以上两个方法进行封装。
144 * @return
145 */
146 public static String getTodayTemperatureInfo() {
147 // 调用第一个方法,获取html字符串
148 String html = httpRequest("http://www.weather.com.cn/html/weather/101280101.shtml");
149 // 调用第二个方法,过滤掉无用的信息
150 String result = htmlFiter(html);
151
152 return result;
153 }
154
155 /**
156 * 测试
157 * @param args
158 */
159 public static void main(String[] args) {
160 String info = getTodayTemperatureInfo();
161 System.out.println(info);
162 }
163 }
【详细解释】
第 34-49 行:通过 URL 获取网页的源代码,没什么好说的。
第96行:在网页上按F12,查看“今天”的html代码,找到下图,所以我们的第一步就是过滤掉这段html代码以外的东西。
(.*)()(.*?)()(.*) 这个正则表达式可以很容易地分为以下 5 组:
(.*): 匹配除换行符 0-N 次以外的任何内容
(): 匹配中间的 heml 代码一次
(.*?): .*? 是一个匹配的惰性模式,这意味着尽可能少地匹配除换行符以外的任何内容
():匹配中间一段html代码
(.*): 匹配除换行符 0-N 次以外的任何内容
这样我们就可以用m.group(3)得到匹配中间(.*?)的一串代码。也就是我们需要的“今天”天气的代码。
第101行:取出中间那段代码后,如下图,有很多没用的标签。我们必须想办法继续删除。方法和上面一样。
第 106 行:手动拼接我们需要的字符串。
经过上面的处理,一个简单的爬取就完成了。
中间的正则表达式部分是最不满意的。如果您有什么好的建议,请留下宝贵的意见。我很感激~