a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 233|回复: 4

[基础知识] JAVA基础:一个简单的java网络爬虫(spider)

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
  需要的htmlparser.jar包到官方网上去下.
$ b  n; o* @. W  ---------------Spider.java---------------------------- O2 V3 e- B2 d9 j+ X$ J- f; M
  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;: C7 }. w3 g& {- E
  public class Spider implements Runnable {( t+ N( w: f8 d$ j2 p* K
  boolean search_key_words = false;) T( i' }: l$ g9 K1 |
  int count = 0;
4 e# M; Q2 Z6 B  int limitsite = 10;4 N6 R( m, [9 ?# U  p4 d- \' a
  int countsite = 1;; u" ]/ _& a8 u/ [4 ~$ s8 `" O, X; N
  String keyword = "中国";//搜索关键字
8 `( G9 M7 E2 L' T* q% @% m8 q0 p1 a  Parser parser = new Parser();1 j) }# t5 a0 h. I* T% r3 I! v
  // List linklist = new ArrayList();0 Z7 s4 E% G! `4 E' B* `
  String startsite = "";//搜索的其实站点
8 w" Z5 A6 |5 U  SearchResultBean srb;//保存搜索结果
: Q5 K- z* R( J. ~  List resultlist = new ArrayList();//搜索到关键字链接列表
! P# [# @1 ^* L* [. T  List searchedsite = new ArrayList();//已经被搜索站点列表
- S& V0 X4 P) c9 C5 x2 }  Queue linklist = new LinkedList();//需解析的链接列表
4 B& Y% g" U' R# l8 `0 Q0 Q% p  HashMap disallowListCache = new HashMap();& B+ ?- S! r5 m
  public Spider(String keyword, String startsite) { this.keyword = keyword; this.startsite = startsite; linklist.add(startsite);
5 {% f8 I3 v# V1 V+ ^* D  srb = new SearchResultBean();: c: J3 N, f" l6 L% h
  }
& s& F  x! }# }  public void run() {
6 ~8 c, L& S8 y% ?5 B/ E2 i6 I  // TODO Auto-generated method stub
# `; R: B; `) K8 A6 t  search(linklist);, j6 Y. o7 S+ j2 S9 E
  }9 f3 i  Z8 |* B1 B$ U
  public void search(Queue queue) {7 B# m0 l& c& J% H4 O
  String url = "";  D0 t$ T' N) T3 S: N. Y
  while(!queue.isEmpty()){ url = queue.peek().toString();//查找列队: {' z% g, y# H# s3 \6 B
  try {
1 E" B# ~. A* I9 p6 x  if (!isSearched(searchedsite, url)) {6 e; j9 i3 S  i3 e  W6 Y, H
  if (isRobotAllowed(new URL(url)))//检查该链接是否被允许搜索
+ r0 K2 @' y) W) x9 r/ ?  processHtml(url);$ _  i: h2 `$ A7 m" o/ o
  else
. k( N0 D' K5 n/ T7 S; I  System.out.println("this page is disallowed to search");( Q' C: N  _6 A7 ^9 i6 G
  }
4 M5 r( A$ N+ ]# j3 f  } catch (Exception ex) {& t1 w  m" @& F* ?! S6 ]
  }! {6 _/ W+ V( a  n# C/ U: W
  queue.remove();
1 ]4 S, C9 N+ g( n" F7 B- a7 x  }' f% o  \2 A) N3 X& O) E  v
  }
% r; S; v, Q7 I+ g( V7 t. ]. g: ~9 S2 X. K* w
  /**
回复

使用道具 举报

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

JAVA基础:一个简单的java网络爬虫(spider)

</p>  *解析HTML
+ ~9 i$ R& g2 w* I: v3 }4 X1 ^  * @param url8 O( r1 |+ ]6 S9 o) t/ H# \2 m
  * @throws ParserException: U7 e6 Q' k9 D- U, W& Z
  * @throws Exception
/ c% Q$ D" X. |! `7 W! r# W$ q. x; s  */
. z5 ?0 B- {4 j  [  public void processHtml(String url) throws ParserException, Exception { searchedsite.add(url);: v1 a- {- F* k+ o+ v  B7 e
  count = 0;6 e) S' E# L- J% m9 Q9 j
  System.out.println("searching ... :" + url); parser.setURL(url); parser.setEncoding("GBK"); URLConnection uc = parser.getConnection(); uc.connect(); //uc.getLastModified(); NodeIterator nit = parser.elements();: o5 c8 e+ ^% @# P) U7 u' v; o
  while (nit.hasMoreNodes()) { Node node = nit.nextNode();) Y. q! B: x0 |/ l
  parserNode(node);
: b5 }% q$ H/ f6 W( E. f  }# U: ^) x: I$ y
  srb.setKeywords(keyword); srb.setUrl(url); srb.setCount_key_words(count); resultlist.add(srb); System.out.println("count keywords is :" + count); System.out.println("----------------------------------------------");" I0 ?; ^2 p6 L3 c# G+ `! ~3 z
  }: h: O$ I9 C6 A  ~4 j+ b) _, T
  /**
0 o5 T- l; z! Q- o- `* {  *处理HTML标签
/ l; V0 x. F/ {! ]% c3 ^* Q  * @param tag
3 s" _+ Q: \+ o, g+ b  * @throws Exception
3 @% t% r& A& e1 F0 E  v/ {  */
; |1 S; G2 W- g) V9 J( \2 D  public void dealTag(Tag tag) throws Exception {! _% M3 |4 P) \, h
  NodeList list = tag.getChildren(); if (list != null) { NodeIterator it = list.elements(); while (it.hasMoreNodes()) { Node node = it.nextNode();
* D1 v" `5 h3 ~4 m  ^+ V" @  parserNode(node);5 }  [$ [; a8 I6 C* Y$ S5 q' E
  }2 f0 K9 A% f+ ^" S3 _, Z
  }6 R. {/ _9 `+ M( L
  }
1 ^0 j8 t- z2 E+ @5 I  /**
/ S" ]8 b6 y2 K  I  *处理HTML标签结点% c: k& P) `2 t: G% w% X
  * @param node
  M- X. Z; K. h* N( L  * @throws Exception. ~- z% Z( J; M2 c
  */( \2 s% V7 F* h7 Y3 A( K
  public void parserNode(Node node) throws Exception{
, o+ S6 v% x& Q& k5 t, T  if (node instanceof StringNode) {//判断是否是文本结点/ q, J' u8 s5 R) F- L
  StringNode sNode = (StringNode) node;
$ {3 J5 G9 T) u- Z  {5 K  StringFilter sf = new StringFilter(keyword,false); search_key_words = sf.accept(sNode);2 t9 T$ A, y: K# g
  if (search_key_words) {! k# `. V; ?  h, I
  count++;
1 ^$ \! R. Y2 M( z3 S+ k  }
& U1 |1 `; n7 E2 Z  // System.out.println("text is :"+sNode.getText().trim());
7 a+ Q( x* M+ w* b2 w9 U! `  } else if (node instanceof Tag) {//判断是否是标签库结点
9 O6 g+ U+ N; Q: ~+ G  Tag atag = (Tag) node;
6 f. N; ]3 v8 o, X+ X$ A  if (atag instanceof TitleTag) {//判断是否是标TITLE结点0 u, A. a( G" v4 z; f
  srb.setTitle(atag.getText());
/ A; U) j$ N* x( u' g; n/ z  }% t. f1 t7 y2 H0 V4 Z6 Z
  if (atag instanceof LinkTag) {//判断是否是标LINK结点
  y, j* ~* `% E! U  LinkTag linkatag = (LinkTag) atag;4 S0 z- j" ^$ G3 _- f: P" ?  |
  checkLink(linkatag.getLink(), linklist); // System.out.println("-----------------this is link --------------");3 K; [$ X1 `$ |8 L! }: \1 s
  }
! p6 v- g# _9 s  dealTag(atag);
% O! p; w) Z8 Z, [9 z* s/ G% X$ H  } else if (node instanceof RemarkNode) {//判断是否是注释
2 A5 X& ]  z: q! z& T" y* b  // System.out.println("this is remark");* J9 e! S) ?  E2 w' v5 U: I3 E

! H  @2 a6 f9 [+ |6 K+ ~1 n  }
回复 支持 反对

使用道具 举报

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

JAVA基础:一个简单的java网络爬虫(spider)

</p>  }
$ g- J% L1 ]8 Z% N5 a8 U  /*0 ^6 ~( F" S! {7 s' J- r+ v
  *检查链接是否需要加入列队* q3 T' j( Y$ [/ h! v
  */5 R: h( G- {" h! z: S) B
  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.")) {" k8 U# v4 T5 w4 M  J# k
  link = "file:///" + link;9 a/ V' F1 h4 p- H
  } else if (link.startsWith("www.")) {7 E% z* m0 _4 d
  link = "http://" + link;( Z1 x& {7 g9 ?+ K# }/ c! M" a7 E
  }( P  }2 B1 s3 D- r) G; c
  if (queue.isEmpty()) queue.add(link);
! J% l3 @; d& H: [: q  else {
8 N: f$ D  j. j/ j  String link_end_=link.endsWith("/")?link.substring(0,link.lastIndexOf("/")):(link+"/"); if (!queue.contains(link)&&!queue .contains(link_end_)) { queue.add(link);
! |, Z( f$ L; i" L1 s* j5 @  }& d* E$ H5 {( {" p1 Z7 s
  }3 G4 x$ g5 o. i- J) ?4 h& v
  }
4 }, c% V7 i. v* @8 O1 o  }
  M# p) _; C1 R. o1 R! R  /**1 O3 e' w6 b5 L: E1 K
  *检查该链接是否已经被扫描  p8 a3 S- L; O; k' T# d, ?
  * @param list1 q+ R! i+ e& l3 g- Y" P. y: R3 K. A
  * @param url
$ p. ?  j0 G! E* Z! ^0 v  f' E  * @return. c$ V% e# n# Q+ N. w3 l6 ~8 k
  */  @1 l, q8 l7 _& V' D
  public boolean isSearched(List list, String url) {
6 l) z! v  R  k# x  String url_end_ = "";
回复 支持 反对

使用道具 举报

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

JAVA基础:一个简单的java网络爬虫(spider)

if (url.endsWith("/")) { url_end_ = url.substring(0, url.lastIndexOf("/"));   } else {9 z5 k, t. I9 E* _) n* d
  url_end_ = url + "/";
. l+ {1 p4 ~: f1 F. h) O0 |- n. I  }
( |0 [! N- m  ]) p6 ?) q  if (list.size() > 0) { if (list.indexOf(url) != -1 || list.indexOf(url_end_) != -1) {) w4 ~3 w8 F" C+ j7 D2 I
  return true;( D% N# o3 I' f5 K* M
  }
$ G; b" y6 r; d/ ], J5 a  }
3 l4 A3 v+ e" Q1 A+ @7 \) y0 U  return false;
$ U* w2 a: k& ~- S  }
/ {" i+ ]) o* O' E! |  /**+ ^+ N/ o# Y3 V0 A1 d5 Q
  *检查URL是否被允许搜索2 R+ U) ~  E- y) L) U
  * @param urlToCheck
$ d6 K  J- M3 |( F1 W: r9 S5 u8 P  * @return, D5 _+ U* s  m( b; D; x9 }
  */1 z5 ~9 |) |: J- c: g
  private boolean isRobotAllowed(URL urlToCheck) {
2 z1 G1 P3 m- n) I# y  String host = urlToCheck.getHost().toLowerCase();// 获取给出RUL的主机// System.out.println("主机="+host);  ?. @! w# E; w8 s7 N
  //获取主机不允许搜索的URL缓存  k  s; {$ a* m& J" T- j" y
  ArrayList disallowList = disallowListCache.get(host);
; i( Y+ B) q& o1 B! z  // 如果还没有缓存,下载并缓存。
3 M2 k, i& l4 r5 h8 l- ~5 E  if (disallowList == null) {
5 n6 [7 p7 E$ q, k: {$ D. A" \2 O  disallowList = new ArrayList();
3 b( s- g9 Y- ?/ \7 \  try {
9 j& L8 `- @( U$ r0 ]$ H  URL robotsFileUrl = new URL("http://" + host + "/robots.txt");) c6 `) z3 X1 g1 v
  BufferedReader reader = new BufferedReader(
9 _8 W- }3 r2 g& a/ M  new InputStreamReader(robotsFileUrl.openStream()));
+ N. U# v3 E2 l" `  // 读robot文件,创建不允许访问的路径列表。
3 T/ }/ b4 M3 o. J' \. X  String line;# k7 v- Y1 i( d. T  y9 A2 x
  while ((line = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) {// 是否包含"Disallow:" String disallowPath = line.substring("Disallow:" .length());// 获取不允许访问路径; ]  S5 p4 ^( Z4 S% }' q
  // 检查是否有注释。+ c1 P. }% \% ~7 @
  int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0,
: W- q6 @4 G( ^5 n' L' e  commentIndex);//去掉注释  c% b6 h- K- g  v" [
  }, r0 n5 H0 w% X0 Z9 E" a; J
  disallowPath = disallowPath.trim(); disallowList.add(disallowPath);. E* Q& x7 J9 G  D2 D( K$ j- Q
  }
! q4 q7 m8 `1 k" f' R  }7 H, W+ p6 d/ c
  for (Iterator it = disallowList.iterator(); it.hasNext();) { System.out.println("Disallow is :" + it.next());: I! `: n5 M1 o, @! ^( f0 U
  }
$ {5 }6 w9 T' f, G  // 缓存此主机不允许访问的路径。6 b3 r( d& Z& ^( _# c& Q. K/ i
  disallowListCache.put(host, disallowList);
. C* ^  i1 X5 |% W7 E- |- B  } catch (Exception e) {
( k) \1 w2 K# E& t$ L- R  return true; // web站点根目录下没有robots.txt文件,返回真$ ~4 l. L$ n4 k8 d
  }" ?8 d" h- U/ D+ n

0 x! J) U" C5 X0 m; l  }
回复 支持 反对

使用道具 举报

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

JAVA基础:一个简单的java网络爬虫(spider)

</p>  String file = urlToCheck.getFile(); // System.out.println("文件getFile()="+file); for (int i = 0; i < disallowList.size(); i++) { String disallow = disallowList.get(i); if (file.startsWith(disallow)) {
0 l9 a# i7 V' |  return false;
. s* R$ \: u3 [  }! x+ ~5 B3 \  }! f7 o) S& A7 z
  }
4 X6 Q3 M  U' `( N  return true;
* U) ?& c8 X" E5 }- S  }
9 b. L! H5 H/ l$ b, O; O6 s  public static void main(String[] args) {
1 ]$ a5 n% R* X4 k; c! q9 ?; Z  Spider ph = new Spider("英超", http://www.microsoft.com);
% K$ E$ B# E% \9 \- w' q# ]! \  try {
2 b+ k6 [* r0 @+ n; G' W+ {  // ph.processHtml();
0 ]6 P& O& \2 R2 o  Thread search = new Thread(ph);
6 w' N* D9 X) i# n  search.start();//启动线程/ g# L) d$ h& C/ w% m# n
  } catch (Exception ex) {
" O, X% q1 \) L: Z  }
0 u. b$ P7 \) s0 `! V( P: ?4 ?5 d( W+ n  }
; E, C8 {& G. b: S" Y! G; i  }
; s- G# `$ H8 F1 i* W  --------------------------------------SearchResultBean.java---------------------------------------------------------
$ v" w$ O5 J5 g& H+ P$ j7 D  public class SearchResultBean {
+ A4 i/ n+ x2 R, m  String url = "";
& N) R6 E4 k5 B) c# z3 D  String title = "";
8 R- q% P: |6 S: d( e+ ]8 [; b1 p1 ?  String keywords = "";) q/ m- o( l6 C0 n2 W' `" N1 {
  int count_key_words = 0;0 i, j0 U6 a7 u7 U' }5 W
  public int getCount_key_words() {. r- K, S/ R. g0 l
  return count_key_words;
& x5 ?  a$ t7 a  }2 n* M& h' ~3 d5 D
  public void setCount_key_words(int count_key_words) {! J4 V8 ]& g0 ~+ \9 Z9 g  e
  this.count_key_words = count_key_words;
7 W" u& e- ^9 `$ ?  }6 q/ R3 R" U" O" F
  public String getKeywords() {
; F7 o  p1 a$ o$ J. G, c' d0 l  return keywords;
; z  }. P: H. o+ l  }7 S9 {! c) f' H% C4 W7 G
  public void setKeywords(String keywords) {8 z8 U% t- e$ ^, G
  this.keywords = keywords;
: |. o1 ?+ u7 ]) q( e! N  }2 E7 |& b2 z9 O( z2 }* x% F* r
  public String getTitle() {& I! p5 ]* G4 a) P4 S/ q
  return title;
, A& w1 j2 v: W4 [  }
6 G# V: s% V5 s/ [) z& |  public void setTitle(String title) {
& H$ i1 o; `" X6 S  this.title = title;
( O9 j$ J& W+ A! H9 L$ l" [  }
: \0 [/ e+ m2 `+ _) B3 ^: L  public String getUrl() {
  S) ]# M( G  e8 ]4 V& U9 Z; ]  return url;! g1 J2 z5 w+ n# {9 f) L
  }' v& B$ Y" u/ e8 J) F% ]% w3 q
  public void setUrl(String url) {' i! R1 n* G" k: _
  this.url = url;( A4 P( \5 i# O, p( C0 V1 G
  }
7 k. e( ^8 r6 Q  }
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 16:14 , Processed in 0.203888 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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