`
445822357
  • 浏览: 731062 次
文章分类
社区版块
存档分类
最新评论

java程序员菜鸟进阶(八)分享一个爬取B2B网站信息的程序

 
阅读更多


前段时间,女朋友如愿以偿的找到了销售的工作,第一天正式上班还挺高兴,第二天就开始愁眉苦脸了。就是因为他这销售实在是太麻烦,以后每天要到一些B2B网站去找一些客户信息,每天要找几百条,刚开始我还安慰的说,没事,以后我帮你找,我接手这工作第一天还很老实,第一天用了不到一个小时的时间帮忙找了八十条,但到了第二天我也烦了,太枯燥了。瞪得眼珠子都疼,突然想想,我堂堂苦逼程序员,今天竟然做这种枯燥重复性的工作!对啊,咱是苦逼程序员啊。程序员怎么能总做这些重复的工作呢。这种重复性的工作让代码来做就好了。说干就干,终于研究了两天的时间写了一个类似小爬虫的工具来爬取这些B2B网站的信息。虽然功能很简单,技术含量也不高,但想想怎么也是一个小工具,分享出来,也许大家以后会用到。OK,项目背景介绍完毕,下面开始分享程序的详细信息。

首先写一个获得页面源码的方法:

// 通过url和postdata获取返回值。该函数为主要函数可以copy使用返回值为一个Html页面的数据。
public static String GetResponseDataByID(String url, String postData) {
String content = null;
try {
URL dataUrl = new URL(url);
HttpURLConnection con = (HttpURLConnection) dataUrl
.openConnection();
// System.out.println(con.getResponseCode());
// System.out.println(con.getContentLength());
// con.setRequestMethod("POST");
// con.setRequestProperty("Proxy-Connection", "Keep-Alive");
// con.setDoOutput(true);
// con.setDoInput(true);
// OutputStream os = con.getOutputStream();
// DataOutputStream dos = new DataOutputStream(os);
// dos.write(postData.getBytes());
// dos.flush();
// dos.close();
byte d[] = new byte[4];
String line;
InputStream is = con.getInputStream();
StringBuffer stringBuffer = new StringBuffer();
Reader reader = new InputStreamReader(is, "GBK");
// 增加缓冲功能
BufferedReader bufferedReader = new BufferedReader(reader);
while ((line = bufferedReader.readLine()) != null) {
stringBuffer.append(line + "\n");
}
if (bufferedReader != null) {
bufferedReader.close();
}
content = stringBuffer.toString();
} catch (Exception ex) {
ex.printStackTrace();
}
return content;
}


PS:这里有必要说明一下我要爬取的B2B网站的有关内容,这些网站大都提供了一个搜索功能,在搜索框里填写上想要搜索的公司关键字就可以获得相关公司的一个列表。这里本来是想写一个可以提交POST请求然后获得提交请求后页面的源码的方法,但是在写完之后,有一部分B2B网站禁止以代理的形式提交POST的请求,所以只能改成自己手动填写搜索信息,然后把搜索到的信息列表的地址传过来,获得该页面的源码。在本工具中postdata参数无用。为了以后可以扩展,所以没有删除。Ok,这个方法就可以获得我们想要的一些公司列表了。




搜素到公司列表之后,每个公司都会对应一个url。下一步我们就要去遍历这些公司的url。打开对应公司的url后他是一个公司的介绍页面,这里面没有我想要的信息,要想得到我想要的信息必须还得打开一个“更多详细信息”链接。所以下一步我们还需获得当前页面,然后得到这个链接。对了,这里还写了一个获得一个html页面链接的方法,上面获得所有公司列表的链接也是用的这个方法。这里运用到了一个开源包htmlparser。这个东西功能挺强大的,大家以后可以研究一下。请看获得页面链接的代码,这里我有好几个地方用到,每次都有一个过滤,所以我还设置了一个标志量来区分。




public static Set<String> getHref(String f, int flag) {
Set<String> set = new HashSet<String>();
try {
Parser parser = new Parser(f);
parser.setEncoding("UTF-8");
NodeFilter filter = new NodeClassFilter(LinkTag.class);
NodeList links = new NodeList();
for (NodeIterator e = parser.elements(); e.hasMoreNodes();) {
e.nextNode().collectInto(links, filter);
}
for (int i = 0; i < links.size(); i++) {
LinkTag linktag = (LinkTag) links.elementAt(i);
if (flag == 0
&& linktag.getLink().length() > 12
&& !(linktag.getLink().substring(0, 18)
.equals("http://www.product"))
&& linktag.getLinkText().contains("济南")) {
set.add(linktag.getLink());
} else if (flag == 1
&& (linktag.getLinkText().equals("更多>>") || linktag
.getLinkText().equals("更多>>"))) {
set.add(linktag.getLink());
} else if (flag == 2 && linktag.getLinkText().equals("下一页"))
set.add(linktag.getLink());
}
} catch (ParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// System.out.println(list);
return set;
}


OK,下一步就到了我们想要信息的页面了。这里没什么技术含量。主要是用到的就是一个字符串截取和替换

public static String getPart(String source, String type) {
if (source == null)
return null;
if (source.indexOf(type) != -1) {
source = source.substring(source.indexOf(type));
source = source.substring(0, source.indexOf("</dl>"));
source = source.replace("</dt><dd>", "");
source = source.replace("</dd>", "");
source = source.replace("/p", "");
source = source.replace("\n", "");
source = source + "\r\n";
System.out.println(source);
outFile(source);
return source.trim();
} else
return null;
}


这样获得到相关信息之后,我们就可以把他输出到一个文件里面了。

private static void outFile(String source) {
try {
File file = new File("d:" + File.separator + "老婆资料.txt");
Writer out = null;// 声明字符输出流
out = new FileWriter(file, true);// 表示可以追加
out.write(source);// 写入数据
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}


为了更像一个小软件,我还做了一个swing界面,现在不得不感叹啊,我的界面做的还是依然那么的难看。代码就不上了,很简单,看一下界面吧。哈哈




开始地址即为你要从那页开始的url,因为每天所需要的信息都不一样,所以你要记住你当天弄到第几页了。最好的方法就是一次把你搜索的结果都获取完,差不多有上万条。信息数量就是你想得到的信息条数。

下面看一下爬取到的信息吧:



好了,到此基本上一些详细细节介绍完了,当然这个工具有很多不足的地方,最不足的地方就是每换一个B2B网站都需要修改代码,因为每个网站的架构都不一样,所以用不同的B2B网站都要修改代码。只是小改一下就行。他的大体步骤还是都一样的。由于时间仓促,也没注意什么编码规范问题,仅仅是简单实现功能而已。本文中仅提供了部分代码,如若想得到整个项目源码,请在下面留下您的邮箱。


PS:冯老师,我可没占用专升本的时间,这个小工具是在晚上从图书馆回来的时候写的哈,真的没占用专升本时间,我发誓。哈哈,还是非常感谢,也很感动您老每次的督促。在此表示谢意。

孙老师,最近您老跑哪去了,开学之后一直没见过你,您老是不是也爱玩躲猫猫啊。没有基友的日子真的不好过啊。哈哈。老孙同志啊,有空聚聚哈。

李某某,好好工作,脚踏实地,只要努力,天道勤筹,相信老天不会负有心人的哦。加油,我永远是你最坚实的后盾。不管以后再大的风浪,我们风雨同舟。有我的地方就有咱的小家。最后真心的感谢有你的这七年。相信以后的七十年我们会过得更幸福。


最后给天下所有的妹子说声:找个程序猿就嫁了吧。




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics