数据抓取--学习笔记1

近期对数据的抓取相关知识进行了学习,有点浅,有点散,简单总结一下,以便日后的深入学习:
 
1、框架:spring ,ibatis
 由于前期完成的是抓取数据,实现目标网站的数据入库,暂未对数据展示做相关设计,所以框架暂用spring,和ibatis。
 spring:日后可和struts集成,也可使用其自身的MVC进行数据展示。
 ibatis:由于抓取到的数据势必会涉及到相关的数据统计,所以选择sql语句相对灵活处理的ibatis。
2、抓取html内容:UrlConnection or HttpURLConnection
 2.1 使用固定代理或不使用代理的情况--代码:  

 

Proxy proxy = null;
if(true){ //使用代理的条件,如果使用代理,则可将创建 Proxy对象。
SocketAddress addr = new InetSocketAddress("代理IP",代理的端口);
proxy = new Proxy(Proxy.Type.HTTP,addr);
}
URLConnection conn = null;
URL url = new URL("www.xx.com");

if(proxy==null){//proxy 是否使用代码
conn = (URLConnection)url.openConnection();
}else{
conn = (URLConnection) url.openConnection(proxy);
}
//URLConnection 的参数详解可参看 http://blog.chinaunix.net/u3/109937/showart_2162626.html
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows XP; DigExt)");
conn.setConnectTimeout(60000);
conn.setReadTimeout(120000);
InputStreamReader isr = new InputStreamReader(conn.getInputStream());
BufferedReader br = new BufferedReader(isr);
String temp;
StringBuilder html = new StringBuilder();
while ((temp = br.readLine()) != null) {
html.append(temp).append("\n");
}
br.close();
isr.close();

   由此则获得该url里面的内容。
 2.2 使用非固定代理的情况:
  由于某些网站处于安全的考虑,对数据抓取类的自动程序进行了限制,例如当一个固定ip短时间内连续访问次数太多,则限制该IP的访问,或拒绝该IP的访问。
  这种情况下,可以采用动态代理的方式,在该网站拒绝访问时,可以切换一个代理去再次访问。一被拒绝,就切换,直到完成数据的抓取。
  动态代理ip地址和端口可参考 http://www.5uproxy.net/
3、现有些网站的数据使用js进行展示,根据2的方式也可以对类似的js文件进行数据抓取,例如:http://www.a.com/xx/x.js,同样可以抓取到页面信息,速度比抓取html也快很多。解析这个使用可以考虑JSONArray 进行解析
  eg:
   

JSONArray array = JSONArray.fromObject(htmlJS.toLowerCase());
//注意 JSONArray 是区分大小写的,所以为了使js中的各个属性与你java bean中的属性对应上,最好保持field相同。
JSONArray.toArray(array,Yourbean yourbean)

 
 
4、解析:HtmlParser
  解析html文件现有很多工具使用,我采用的是 HtmlParser
  4.1 使用 NodeVisitor 进行解析
  继承 NodeVisitor 类实现自己的解析器,该类中方法  public void visitTag (Tag tag){……},当调用创建的解析器的时候会自动调用,进行html的解析。
  eg:
     

if("td1234".equalsIgnoreCase(tag.getAttribute("class"))){ //解析出 class="td1234" 标签
//do something
} else if(……){
//解析出其他的标签
}

 
  这样就可以在抓取html的时候解析出自己需要的特定标签。
  
 4.2 使用 Filter 解析内容
 Parser parser = new Parser(url);
 NodeFilter filter = new TagNameFilter (\"TABLE\");
 NodeList nodes = parser.extractAllNodesThatMatch(filter);
 再通过 遍历node获得想要的内容
 
 4.3 类似 4.1,NodeVistor
 这里是用 NodeVistor  ,不做父类,而是以内部类的方式使用,在网上也有很多这样的例子:
    

parser = new Parser(htmlSource);
NodeVisitor visitor = new NodeVisitor() {
public void visitTag(Tag tag) {
String str;
if("table".equalsIgnoreCase(tag.getTagName())){
if("td1234".equals(tag.getAttribute("class"))){
whatYouWantGet = tag.toPlainTextString();
}
}
}
};
parser.visitAllNodesWith(visitor);
whatYouWantGet 中存储的即为你需要的标签 Table 中 class="td1234" 的值。

 5、在抓取的过程中,能一次抓取过来的数据别分成两次抓取,抓取数据一次还是比较浪费时间的,如果对方服务器较慢,这个浪费会更加明显。
 
  下次继续~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值