今天一天都在想怎么爬到我需要的数据,然后用Java代码实现了一下。以前只是知道正则表达式很强大,但是看起来头晕,所以也懒得去看。
然后突然要爬数据,看到别人写的例子,一大堆的正则表达式,所以硬着头皮也去入了一个门。
附上参考网站,很给力的正则学习,30分钟真能入门。
1 需求:比如要从这样一个网页上抓取数据
http://map.baidu.com/detail?qt=ninf&from=housezt&detail=house&uid=5ef5edbdc64c1bb49e9d6899
这个请求最后面的uid其实是百度地图上查到该点的uid(也就是5ef5edbdc64c1bb49e9d6899),我的数据库里面已经获取了武汉的房地产的uid,现在要通过uid获取详细信息。
先从一个着手,再多的数据也是循环抓取了。
2 发送请求到网页 ,用到HttpURLConnection类
这里用别人写好的一个
package connection;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class ConnectionUtil {
public static String Connect(String address){
HttpURLConnection conn = null;
URL url = null;
InputStream in = null;
BufferedReader reader = null;
StringBuffer stringBuffer = null;
try {
url = new URL(address);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setDoInput(true);
conn.connect();
in = conn.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
stringBuffer = new StringBuffer();
String line = null;
while((line = reader.readLine()) != null){
stringBuffer.append(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
conn.disconnect();
try {
in.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return stringBuffer.toString();
}
}
3 接收服务器返回的页面html数据
返回了html字符串之后,首先要明确需要抓取的数据是哪些,分析网页的特点。
比如我现在要抓取的数据有:
图片url
价格
房屋类型
建筑类型
建筑年代
容积率
物业费
物业公司
开发商
然后分析它的html结构:
分析好结构之后就好写正则表达式了,用来匹配获取。
4 进行解析
package main;
import connection.ConnectionUtil;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Analyze {
//使用时调用此方法,传入uid,如 5ef5edbdc64c1bb49e9d6899,返回的是一个字符串,可以打印出来看一下
public String regexMain(String uid) {
String url="http://map.baidu.com/detail?qt=ninf&from=housezt&detail=house&uid="+uid;
String result = ConnectionUtil.Connect(url);
return getHouseInfo(result);
}
private String getHouseInfo(String targetStr) {
StringBuilder lastInfo=new StringBuilder();
//提取图片url
Pattern imgpattern=Pattern.compile("<img class=\"img-large\".*\" />");
Matcher imgmatcher=imgpattern.matcher(targetStr);
while (imgmatcher.find()){
String imgString=imgmatcher.group();
int n=imgString.lastIndexOf("=\"");
String imgUrl=imgString.substring(n+2,imgString.length()-3);
//System.out.println("imgRul:"+imgUrl);
lastInfo.append("图片url:"+imgUrl+"\n");
}
//首先提取出包含房产信息的html片段,再分别处理
Pattern pattern1 = Pattern
.compile(