Java爬虫入门笔记
来源:互联网 发布:php类和对象 编辑:程序博客网 时间:2024/05/22 05:26
今天一天都在想怎么爬到我需要的数据,然后用Java代码实现了一下。以前只是知道正则表达式很强大,但是看起来头晕,所以也懒得去看。然后突然要爬数据,看到别人写的例子,一大堆的正则表达式,所以硬着头皮也去入了一个门。附上参考网站,很给力的正则学习,30分钟真能入门。
正则表达式30分钟入门教程
1 需求:比如要从这样一个网页上抓取数据
http://map.baidu.com/detail?qt=ninf&from=housezt&detail=house&uid=5ef5edbdc64c1bb49e9d6899
这个请求最后面的uid其实是百度地图上查到该点的uid,我的数据库里面已经获取了武汉的房地产的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 { 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("fcg\">\\w*.+\\s*<dd>\\w*.+</dd>"); Matcher matcher1 = pattern1.matcher(targetStr); String info = ""; while (matcher1.find()) { info = matcher1.group(); //提取出的片段 Pattern pattern2 = Pattern .compile("f24 fcr\">[0-9]+"); Matcher matcher2 = pattern2.matcher(info); while (matcher2.find()) { String price = matcher2.group().substring(9); //提取出价格//System.out.println("价格:" + price); lastInfo.append("价格:"+price+"元/平米\n"); } Pattern pattern3 = Pattern .compile("房屋类型:</dt>\\s*<dd>[\\u4e00-\\u9fa5]+( *[\\u4e00-\\u9fa5]+)*"); Matcher matcher3 = pattern3.matcher(info); String houseType = ""; //可能有的没有 while (matcher3.find()) { int n = matcher3.group().lastIndexOf(">"); houseType = matcher3.group().substring(n + 1); }//ystem.out.println("房屋类型:" + houseType); lastInfo.append("房屋类型:"+houseType+"\n"); //建筑类型同理 Pattern pattern4 = Pattern .compile("建筑类型:</dt>\\s*<dd>[\\u4e00-\\u9fa5]+( *[\\u4e00-\\u9fa5]+)*"); Matcher matcher4 = pattern4.matcher(info); String blockType = ""; //可能有的 while (matcher4.find()) { int n = matcher4.group().lastIndexOf(">"); blockType = matcher4.group().substring(n + 1); }//System.out.println("建筑类型:" + blockType); lastInfo.append("建筑类型:"+blockType+"\n"); //建筑年代 Pattern pattern5 = Pattern .compile("建筑年代:</dt>\\s*<dd>[0-9]+"); Matcher matcher5 = pattern5.matcher(info); String blockAge = ""; //可能有的没有 while (matcher5.find()) { int n = matcher5.group().lastIndexOf(">"); blockAge = matcher5.group().substring(n + 1); }//System.out.println("建筑年代:" + blockAge); lastInfo.append("建筑年代:"+blockAge+"\n"); //容积率 Pattern pattern6 = Pattern .compile("容积率:</dt>\\s*<dd>[0-9]+\\.[0-9]+"); Matcher matcher6 = pattern6.matcher(info); String FAR = ""; //可能有的没有 while (matcher6.find()) { int n = matcher6.group().lastIndexOf(">"); FAR = matcher6.group().substring(n + 1); }//System.out.println("容积率:" + FAR); lastInfo.append("容积率:"+FAR+"\n"); //物业费 Pattern pattern9 = Pattern .compile("物业费:</dt>\\s*<dd>[0-9]+\\.[0-9]+"); Matcher matcher9 = pattern9.matcher(info); String fee = ""; //可能有的没有 while (matcher9.find()) { int n = matcher9.group().lastIndexOf(">"); fee = matcher9.group().substring(n + 1); }//System.out.println("物业费:" + fee); lastInfo.append("物业费:"+fee+"元/平米/月\n"); //物业公司 Pattern pattern7 = Pattern .compile("物业公司:</dt>\\s*<dd>[\\u4e00-\\u9fa5]+( *[\\u4e00-\\u9fa5]+)*"); Matcher matcher7 = pattern7.matcher(info); String pManage = ""; //可能有的没有 while (matcher7.find()) { int n = matcher7.group().lastIndexOf(">"); pManage = matcher7.group().substring(n + 1); }//System.out.println("物业公司:" + pManage); lastInfo.append("物业公司:"+pManage+"\n"); //开发商 Pattern pattern8 = Pattern .compile("开发商:</dt>\\s*<dd>[\\u4e00-\\u9fa5]+( *[\\u4e00-\\u9fa5]+)*"); Matcher matcher8 = pattern8.matcher(info); String company = ""; //可能有的没有 while (matcher8.find()) { int n = matcher8.group().lastIndexOf(">"); pManage = matcher8.group().substring(n + 1); }//System.out.println("开发商:" + pManage); lastInfo.append("开发商:"+pManage+"\n"); } return lastInfo.toString(); }}
5 获取结果
uid:5ef5edbdc64c1bb49e9d6899
图片url:http://webmap2.map.bdimg.com/maps/services/thumbnails?width=350&height=200&align=center,center&src=http://src.house.sina.com.cn/imp/imp/deal/fa/86/f/cf94afde93e3f5622746b3ec86f_p7_mk7_os02c14c_cm240X180.jpg”
价格:13000元/平米
房屋类型:塔楼
建筑类型:塔楼 多层 小高层 高层水景地产 宜居生态地产 公园地产 武汉特色楼盘
建筑年代:2014
容积率:1.05
物业费:2.8元/平米/月
物业公司:碧桂园物业发展有限公司
开发商:武汉生态城碧桂园投资有限公司
Process finished with exit code 0
- Java爬虫入门笔记
- 【爬虫笔记】爬虫入门
- python爬虫入门笔记
- Python爬虫入门笔记
- Java网络爬虫crawler4j学习笔记<1>入门
- java爬虫入门
- Java爬虫入门实例
- java爬虫入门实战
- 爬虫-java-百度--入门
- Python爬虫入门笔记:爬虫简介
- java 爬虫 WebMagic-使用入门
- Python爬虫笔记----爬虫技术入门(1)
- Python爬虫入门笔记:一个简单的爬虫架构
- Python爬虫入门笔记(序)
- Python爬虫入门笔记:正则表达式
- python爬虫入门笔记:Requests库
- Python爬虫入门系列 笔记一
- Python爬虫学习笔记(2):多线程入门
- url加密和解码
- 归并排序的实现
- (转)使用TextInputLayout创建一个登陆界面
- [html]解决点击a标签页面回到顶部
- java中判断一个String是否都由数字组成
- Java爬虫入门笔记
- POJ 2253 Frogger (dijkstra变形)
- 输出两个字符串的最大公共前缀及其长度
- 找到最近的星期一
- 什么叫持久层框架
- B. Weird Rounding
- Shell 教程
- 安卓UI设计对安卓程序的影响
- js没有replaceAll,但是有正则表达式