您的位置:首页 > 编程语言 > Java开发

JAVA简单的爬虫代码

2016-02-04 15:09 441 查看
在写文章之前,我想先申明一下。我是一个刚刚开始学习JAVA的新手,所有我写的文章可能会很基础,而且还可能会出现一些低级错误,如果各位前辈发现任何错误,欢迎留言指出,小弟在此感激不尽。首先,我和大家说一下我的思路。我是用的最简单的方法实现从网页上提取有用的信息的。①写一个类读取网页的HTML代码的全部内容②然后用对应的正则表达式获取你需要的对应的内容③最后写了一个类把获取的所有有用的信息写到txt文本里下面我就附上我写的代码,希望那些和我一样的新手能从中学习到一些有用的知识,前辈么就帮我看看纠纠错和指出哪些地方可以改进的。第一步:写一个类读取网页的HTML代码的全部内容<pre name="code" class="java">package com.acxiom;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;public class GetOneHtml {public static String getOneHtml(final String htmlurl) throws IOException {URL url;String temp;final StringBuffer sb = new StringBuffer();try {url = new URL(htmlurl);final BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "utf-8"));// 读取网页全部内容while ((temp = in.readLine()) != null) {sb.append(temp);}in.close();} catch (final MalformedURLException me) {System.out.println("你输入的URL格式有问题!");me.getMessage();throw me;} catch (final IOException e) {e.printStackTrace();throw e;}return sb.toString();}}第二步:用对应的正则表达式获取你需要的对应的内容
<span style="white-space:pre">	</span>这里我写的这个程序需要从网页上提取9个有用的字段,我这里就不全部给大家展示了,因为用到的思想是一模一样的,我就放两个类在上面给大家参考一下,你们需要使用的时候,可以根据自己的需求修改下正则表达式和一些相应的代码就可以了。
<span style="white-space:pre">	</span>1:获取停车位信息的代码
<pre name="code" class="java">package com.acxiom;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.acxiom.GetOneHtml;

public class GetCarport {
public String getCarport(final String s) {
String regex;
final List<String> list = new ArrayList<String>();
String html = "";
String title = "";
try {
html = GetOneHtml.getOneHtml(s);
} catch (final Exception e) {as
e.getMessage();
}
regex = "停 车 位</td><td>\\S*</td>";
final Pattern pa = Pattern.compile(regex, Pattern.CANON_EQ);
final Matcher ma = pa.matcher(html);
while (ma.find()) {
list.add(ma.group());
}
for (int i = 0; i < list.size(); i++) {
title = title + list.get(i);
}
return outTag(title);
}

public String outTag(final String s) {
return s.replaceAll("停 车 位</td><td>", "").replaceAll("</td>", "");
}

}
<pre name="code" class="java"><span>	</span>2:获取房价信息的代码
<pre name="code" class="java">package com.acxiom;import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;public class HousePrice {public String housePrice(final String s) {String regex;final List<String> list = new ArrayList<String>();String html = "";String title = "";try {html = GetOneHtml.getOneHtml(s);} catch (final Exception e) {e.getMessage();}regex = "本周均价:<.*>\\d+</span>元/㎡";final Pattern pa = Pattern.compile(regex, Pattern.CANON_EQ);final Matcher ma = pa.matcher(html);while (ma.find()) {list.add(ma.group());}for (int i = 0; i < list.size(); i++) {title = title + list.get(i);}return outTag(title);}public String outTag(final String s) {return s.replaceAll("</span>", "").replaceAll("本周均价:<.*>", "");}}
<span>	</span>第三步:写一个类把获取的所有有用的信息写到txt文本文件里
<span style="white-space:pre">	</span>这个代码里面最下面导出的数据是我需要的所有字段,还有一些代码是对一些提取的信息的一些特殊处理,你们可以根据自己的具体需求做相应的修改就可以了。
package com.acxiom;import java.io.BufferedReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;public class ExportData {public static void main(final String args[]) throws IOException {String url = "";final List<String> list = new ArrayList<String>();System.out.print("输入URL,一行一个,输入结束后输入 go 程序开始运行:   \n");final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));try {while (!(url = br.readLine()).equals("go")) {list.add(url);}} catch (final Exception e) {e.getMessage();}RealmName rn = new RealmName();GetCarport gc = new GetCarport();GetHouseTime gh = new GetHouseTime();HousePrice hp = new HousePrice();GreenSpace gs = new GreenSpace();VolumeRatio vr = new VolumeRatio();PropertyFee pf = new PropertyFee();XiaoquName xn = new XiaoquName();XiaoquAddress xa = new XiaoquAddress();FileWriter fw = new FileWriter("温州小区信息概况.txt");for (int i = 0; i < list.size(); i++) {String carportNum = "" ;String realmName = "";if (gc.getCarport(list.get(i)).equals("暂无资料")) {carportNum = "";} else {String str = gc.getCarport(list.get(i));Pattern p = Pattern.compile("\\d+");Matcher m = p.matcher(str);while(m.find()){carportNum = m.group();}}if(rn.getRealmName(list.get(i)).contains("-")){String str = rn.getRealmName(list.get(i));Pattern p = Pattern.compile("-[\u4e00-\u9fa5]+");Matcher m = p.matcher(str);while(m.find()){realmName = m.replaceAll("");}}else{realmName = rn.getRealmName(list.get(i));}fw.write("温州市" + "|" + realmName + "|"+ xn.getXiaoquName(list.get(i))+ "|" + xa.getXiaoquAddress(list.get(i)) + "|" + gc.getCarport(list.get(i))+ "|" + carportNum + "|" + gh.getHouseTime(list.get(i)) + "|"+ hp.housePrice(list.get(i)) + "|" + gs.greenSpace(list.get(i)) + "|"+ vr.volumeRatio(list.get(i)) + "|" + pf.propertyFee(list.get(i)) + "\n");System.out.println("温州市" + "|" + realmName + "|"+ xn.getXiaoquName(list.get(i))+ "|" + xa.getXiaoquAddress(list.get(i)) + "|" + gc.getCarport(list.get(i))+ "|" + carportNum + "|" + gh.getHouseTime(list.get(i)) + "|"+ hp.housePrice(list.get(i)) + "|" + gs.greenSpace(list.get(i)) + "|"+ vr.volumeRatio(list.get(i)) + "|" + pf.propertyFee(list.get(i)));}fw.close();}}
在这里我在说一个事,我跑这个程序所用到的URL在这之前我用类似的方法把网站上所有我需要的链接给爬出来了,然后把所有的URL放到这个代码里面跑就能得到我需要的结果了,因为我爬URL的代码不太好还有待优化,所以就没有放上来,之后等我做进一步的学习之后,把代码做进一步的优化之后在来和大家分享。
    <span style="font-family: Arial, Helv4000etica, sans-serif;">好了,我这次的分享就到此结束了,希望能对和我一样的新手有些帮助,同时也欢迎各路大神给我提出宝贵的意见,谢谢大家。</span><span style="font-family: Arial, Helvetica, sans-serif;">	</span>
<span style="white-space:pre">	</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: