网页源代码抓取工具(【本文介绍】爬取别人网页上的内容,听上的样子)

优采云 发布时间: 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 行:手动拼接我们需要的字符串。

  经过上面的处理,一个简单的爬取就完成了。

  中间的正则表达式部分是最不满意的。如果您有什么好的建议,请留下宝贵的意见。我很感激~

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线