a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 183|回复: 2

[其他] JAVA技巧:一个简单的java网络爬虫(spider)

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
一个简单的java收集爬虫,因为时刻原因,没有进一步诠释.   需要的htmlparser.jar包到官方网上去下.8 e/ ]% z7 w7 ]/ V
  ---------------Spider.java---------------------------, ?% h. D* ^# }; J9 k3 q. x* {
  import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.htmlparser.RemarkNode; import org.htmlparser.StringNode; import org.htmlparser.Node; import org.htmlparser.tags.*; import org.htmlparser.Parser; import org.htmlparser.filters.StringFilter; import org.htmlparser.util.NodeIterator; import org.htmlparser.util.NodeList; import org.htmlparser.util.ParserException; import java.util.Queue; import java.util.LinkedList;
+ X5 A9 `: w% ?6 y' a5 Z4 P, y  public class Spider implements Runnable {* ]9 O* i8 ~5 U, N1 Q
  boolean search_key_words = false;
4 S5 F. [1 M" ]% Z  y0 {; s! ?  int count = 0;
8 x/ h7 _. O+ d7 k2 x0 F  int limitsite = 10;
& \4 t5 v+ x) \, O# s6 Z* p8 L5 F  int countsite = 1;* h0 G( i) k: x/ Y0 h' |# e
  String keyword = "中国";//搜索关头字4 M" ~  B$ v$ }8 V! g
  Parser parser = new Parser();
7 F0 {% Q- T& K. _8 f  // List linklist = new ArrayList();( S+ y6 v0 J$ ]" e: X' S: p
  String startsite = "";//搜索的其拭魅站点3 e3 i3 Q- m& Y$ z0 O+ O# M
  SearchResultBean srb;//保留搜索结不美观& T/ d/ W# \; ~+ ~. @2 e9 L
  List resultlist = new ArrayList();//搜索到关头字链接列表
! |( M; M4 Y( M- x4 a0 ?  List searchedsite = new ArrayList();//已经被搜索站点列表
: U0 C- k2 S& J0 d& `. X- P  Queue linklist = new LinkedList();//需解析的链接列表! }' w, N) W4 O. l0 p7 j* Z  B8 L
  HashMap disallowListCache = new HashMap();  F, @1 L8 ]  ?# F
  public Spider(String keyword, String startsite) { this.keyword = keyword; this.startsite = startsite; linklist.add(startsite);
+ ]5 o( p( p. q3 U  q5 D. q+ |  srb = new SearchResultBean();
7 `7 R9 g" z' e: B  }! i+ u8 A) N  d1 a$ f' A7 a5 m0 R
  public void run() {4 ?  F3 c& S9 n9 W. a" o+ h& J
  // TODO Auto-generated method stub( |9 A- V( T! i1 o1 t2 M, ]
  search(linklist);
. V3 Q. `/ m* g; }9 p  r2 F  }6 x" s: x% P, o$ x
  public void search(Queue queue) {
; H5 O* n7 {! p. W4 {0 B, Z/ n  String url = "";
- _" a  o7 d0 q9 ?  while(!queue.isEmpty()){ url = queue.peek().toString();//查找排队
( [5 A. p: |9 x' d4 P
; Q/ A8 b- z6 x& ~0 n6 A4 E  try {
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:24 | 显示全部楼层

JAVA技巧:一个简单的java网络爬虫(spider)

</p>  if (!isSearched(searchedsite, url)) {; @; G- ?5 S6 w/ b" q4 l
  if (isRobotAllowed(new URL(url)))//搜检该链接是否被许可搜索
. |& p% A+ U! M% h  processHtml(url);/ F/ B% e& W7 o" ^3 j. j1 W
  else
, I) B/ |3 I, I+ C+ r' ^$ i- L  System.out.println("this page is disallowed to search");" A( \  t. i9 c" b( U' r% k( [4 @
  }4 N! `* P7 T8 ]  F  C
  } catch (Exception ex) {: q8 W8 u$ l& M
  }
2 v+ H+ g- Z  N, p  @2 v, c- K) C- e  queue.remove();" @5 Z) j, [5 A
  }
/ T* J$ B5 a" f; l  }
- L* @& U' W3 S8 t9 R+ j) h  /**
6 ?) f' t1 F) F4 n  *解析HTML6 \2 k/ A. c- v9 F  A* k
  * @param url& ^! p  N7 p. p- M
  * @throws ParserException
5 P, A) c3 Z# I  e. A$ ?  * @throws Exception
6 k* V% w7 }* f6 m  */
8 s8 F* D: q  H1 R, m! y  public void processHtml(String url) throws ParserException, Exception { searchedsite.add(url);
& J2 n3 p' m3 P  count = 0;/ P% r% E* t2 w- ~7 A
  System.out.println("searching ... :" + url); parser.setURL(url); parser.setEncoding("GBK"); URLConnection uc = parser.getConnection(); uc.connect(); //uc.getLastModified(); NodeIterator nit = parser.elements();1 `/ h( m0 ~, i# `7 T, {7 J" S
  while (nit.hasMoreNodes()) { Node node = nit.nextNode();! M- S' @6 l8 [/ q4 L3 I
  parserNode(node);
2 }# x2 u0 V6 I2 ~  l7 G) l5 u( o  }
. Y" L8 s1 G. V0 h, P  srb.setKeywords(keyword); srb.setUrl(url); srb.setCount_key_words(count); resultlist.add(srb); System.out.println("count keywords is :" + count); System.out.println("----------------------------------------------");
  N# a+ }- ]; D+ p  }% [3 H  c. t6 G. n2 f( s6 |
  /**
0 l5 j( O" j1 e9 Q+ S6 [& ?* Q" f  *措置HTML标签
. B* M# u5 I  D0 O2 _# e5 p( Z. ?  * @param tag
1 L+ }: `" U7 a& V- c  * @throws Exception! K, h. z; i, @8 S3 h  E
  */; d% Q/ W6 o* P6 s4 \6 o
  public void dealTag(Tag tag) throws Exception {
, S1 Y/ |) G, ^' k" T" q  NodeList list = tag.getChildren(); if (list != null) { NodeIterator it = list.elements(); while (it.hasMoreNodes()) { Node node = it.nextNode();4 E; n  Q# |5 D, D' ~
  parserNode(node);/ Y6 g* S0 A& m4 i" Y
  }3 ~! H7 {, @* l; N1 c
  }7 K9 f* t0 X5 x* `3 k
  }5 p5 D9 }3 k/ h$ A5 }( r
  /**
* X! J7 d% X2 v. D( L9 u. I  *措置HTML标签结点' c9 Z) M: C; p$ W$ }
  * @param node- L5 |; B8 d" _% p
  * @throws Exception
' a: N; U1 }1 S  */' y1 U0 `( V9 v) S7 l
  public void parserNode(Node node) throws Exception{% i5 X- T* Z# u1 c/ C0 x
  if (node instanceof StringNode) {//判定是否是文本结点
' Y% u" q5 m" n. I  StringNode sNode = (StringNode) node;. p& c, q) b7 {: y# ]' O
  StringFilter sf = new StringFilter(keyword,false); search_key_words = sf.accept(sNode);
9 n/ ?! P* G  @3 P2 S% h  if (search_key_words) {
6 I4 r# ~4 R2 }  count++;
. f- n, r( d0 E, z6 U
$ n3 O5 t3 f# b  }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:25 | 显示全部楼层

JAVA技巧:一个简单的java网络爬虫(spider)

</p>  // System.out.println("text is :"+sNode.getText().trim());0 O& A6 e2 q: V5 ]* U% \. S7 H
  } else if (node instanceof Tag) {//判定是否是标签库结点( }, M. n1 e4 E% A" H: L5 z
  Tag atag = (Tag) node;/ E; K( G  k+ n4 u* d
  if (atag instanceof TitleTag) {//判定是否是标TITLE结点) r% x" v# R: i: _* U* q- m$ N
  srb.setTitle(atag.getText());( \' i+ r* [0 r
  }) [; W7 g( |0 ~9 l0 [5 ?
  if (atag instanceof LinkTag) {//判定是否是标LINK结点
9 x4 C  Q) U, i/ W' w$ x6 u  LinkTag linkatag = (LinkTag) atag;7 x: v% a8 M4 u4 H- s
  checkLink(linkatag.getLink(), linklist); // System.out.println("-----------------this is link --------------");1 z8 p/ T8 f0 V( d0 g1 @* a
  }. p. t9 P) B7 e! s( [0 r, P0 w
  dealTag(atag);
0 a/ s$ L9 L) Z" m9 V9 c  } else if (node instanceof RemarkNode) {//判定是否是注释
. m! q, Q+ n& k0 M; p  // System.out.println("this is remark");+ `# h, k. M& k& u
  }
! j# r- q6 K* i& i7 ]' R  }& y, C* T: Z/ e# G6 y
  /*4 u% ^& G& g) C- ?1 d( m( I$ L
  *搜检链接是否需冲要手排队+ W! B/ Y8 m. _/ w5 U, Y; ?3 r
  */9 x. ?" Y: l; Z% x( y9 l) D
  public void checkLink(String link, Queue queue) { if (link != null && !link.equals("") && link.indexOf("#") == -1) { if (!link.startsWith("http://") && !link.startsWith("ftp://") && !link.startsWith("www.")) {
. W1 [5 z: u, [- w( S- H, F1 U. N: g8 T  link = "file:///" + link;
# j$ R) d2 h7 p/ h4 P% U  } else if (link.startsWith("www.")) {
( i! V6 ~( ~; p  link = "http://" + link;
* d; H  l$ z& X! u# R  }' c( R4 Q. b; _3 f- q7 d
  if (queue.isEmpty()) queue.add(link);+ @% u% _* N3 q* K4 b" @
  else {* O9 Q% L" F9 t( S+ j9 m5 B. K
  String link_end_=link.endsWith("/")?link.substring(0,link.lastIndexOf("/")):(link+"/"); if (!queue.contains(link)&&!queue .contains(link_end_)) { queue.add(link);  K& C; b) t: w  Y  ?$ a/ \# W
  }
  Q/ J/ ?3 `# G3 k' }  d. _2 K  }) O; M( Q; c0 o  {
  }7 c& }, L4 y$ Z+ M5 @+ @/ ^
  }
9 U+ e4 k  Z8 R) `6 I  @/ x  w  /**& J: Y$ D: Y) y
  *搜检该链接是否已经被扫描2 R1 E. L& M  B1 s) O. u9 k
  * @param list
' \" o3 r, s' O4 ~* p% p' b" F  * @param url6 w/ ~3 }: s) D0 H# U; ]! H1 Z; I
  * @return, a; C; `9 o1 Y6 O
  */
2 T8 O6 o% ^. {  E4 m  a  public boolean isSearched(List list, String url) {# x1 ~% @. i2 l) O# }# b
  String url_end_ = "";
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-4 06:18 , Processed in 0.207189 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表