关闭

spider

504人阅读 评论(0) 收藏 举报
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.net.URL;
  4. import java.net.URLConnection;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.Iterator;
  8. import java.util.List;
  9. import org.htmlparser.RemarkNode;
  10. import org.htmlparser.StringNode;
  11. import org.htmlparser.Node;
  12. import org.htmlparser.tags.*;
  13. import org.htmlparser.Parser;
  14. import org.htmlparser.filters.StringFilter;
  15. import org.htmlparser.util.NodeIterator;
  16. import org.htmlparser.util.NodeList;
  17. import org.htmlparser.util.ParserException;
  18. import java.util.Queue;
  19. import java.util.LinkedList;
  20. public class Spider implements Runnable {
  21. boolean search_key_words = false;
  22. int count = 0;
  23. int limitsite = 10;
  24. int countsite = 1;
  25. String keyword = "中国";//搜索关键字
  26. Parser parser = new Parser();
  27. // List linklist = new ArrayList();
  28. String startsite = "";//搜索的其实站点
  29. SearchResultBean srb;//保存搜索结果
  30. List resultlist = new ArrayList();//搜索到关键字链接列表
  31. List searchedsite = new ArrayList();//已经被搜索站点列表
  32. Queue linklist = new LinkedList();//需解析的链接列表
  33. HashMap<String, ArrayList<String>> disallowListCache = new HashMap<String, ArrayList<String>>();
  34. public Spider(String keyword, String startsite) {
  35.    this.keyword = keyword;
  36.    this.startsite = startsite;
  37.    linklist.add(startsite);
  38.    srb = new SearchResultBean();
  39. }
  40. public void run() {
  41.    // TODO Auto-generated method stub
  42.    search(linklist);
  43. }
  44. public void search(Queue queue) {
  45.    String url = "";
  46.      while(!queue.isEmpty()){
  47.     url = queue.peek().toString();//查找列队
  48.     try {
  49.      if (!isSearched(searchedsite, url)) {
  50.       if (isRobotAllowed(new URL(url)))//检查该链接是否被允许搜索
  51.        processHtml(url);
  52.       else
  53.        System.out.println("this page is disallowed to search");
  54.      }
  55.     } catch (Exception ex) {
  56.     }
  57.     queue.remove();
  58.   
  59.      }
  60.     
  61. }
  62. /**
  63. * 解析HTML
  64. * @param url 
  65. * @throws ParserException
  66. * @throws Exception
  67. */
  68. public void processHtml(String url) throws ParserException, Exception {
  69.    searchedsite.add(url);
  70.    count = 0;
  71.    System.out.println("searching ... :" + url);
  72.    parser.setURL(url);
  73.    parser.setEncoding("GBK");
  74.    URLConnection uc = parser.getConnection();
  75.    uc.connect();
  76.    //uc.getLastModified();
  77.    NodeIterator nit = parser.elements();
  78.   
  79.    while (nit.hasMoreNodes()) {
  80.     Node node = nit.nextNode();
  81.     parserNode(node);
  82.    }
  83.    srb.setKeywords(keyword);
  84.    srb.setUrl(url);
  85.    srb.setCount_key_words(count);
  86.    resultlist.add(srb);
  87.    System.out.println("count keywords is :" + count);
  88.    System.out.println("----------------------------------------------");
  89. }
  90. /**
  91. * 处理HTML标签
  92. * @param tag
  93. * @throws Exception
  94. */
  95. public void dealTag(Tag tag) throws Exception {
  96.    NodeList list = tag.getChildren();
  97.    if (list != null) {
  98.     NodeIterator it = list.elements();
  99.     while (it.hasMoreNodes()) {
  100.      Node node = it.nextNode();
  101.      parserNode(node);
  102.     }
  103.    }
  104. }
  105. /**
  106. * 处理HTML标签结点
  107. * @param node
  108. * @throws Exception
  109. */
  110.     public void parserNode(Node node) throws Exception{
  111.     if (node instanceof StringNode) {//判断是否是文本结点
  112.     StringNode sNode = (StringNode) node;
  113.     StringFilter sf = new StringFilter(keyword,false);
  114.     search_key_words = sf.accept(sNode);
  115.     if (search_key_words) {
  116.      count++;
  117.     }
  118.     // System.out.println("text is :"+sNode.getText().trim());
  119.    } else if (node instanceof Tag) {//判断是否是标签库结点
  120.     Tag atag = (Tag) node;
  121.     if (atag instanceof TitleTag) {//判断是否是标TITLE结点
  122.      srb.setTitle(atag.getText());
  123.     }
  124.     if (atag instanceof LinkTag) {//判断是否是标LINK结点
  125.      LinkTag linkatag = (LinkTag) atag;
  126.      checkLink(linkatag.getLink(), linklist);
  127.      // System.out.println("-----------------this is link --------------");
  128.     }
  129.     dealTag(atag);
  130.    } else if (node instanceof RemarkNode) {//判断是否是注释
  131.     // System.out.println("this is remark");
  132.    }
  133.     }
  134.     /*
  135.      * 检查链接是否需要加入列队
  136.      */
  137. public void checkLink(String link, Queue queue) {
  138.    if (link != null && !link.equals("") && link.indexOf("#") == -1) {
  139.     if (!link.startsWith("http://") && !link.startsWith("ftp://")
  140.       && !link.startsWith("www.")) {
  141.      link = "file:///" + link;
  142.     } else if (link.startsWith("www.")) {
  143.      link = "http://" + link;
  144.     }
  145.     if (queue.isEmpty())
  146.      queue.add(link);
  147.     else {
  148.      String link_end_=link.endsWith("/")?link.substring(0,link.lastIndexOf("/")):(link+"/");
  149.      if (!queue.contains(link)&&!queue .contains(link_end_)) {
  150.       queue.add(link);
  151.      }
  152.     }
  153.    }
  154. }
  155. /**
  156. * 检查该链接是否已经被扫描
  157. * @param list
  158. * @param url
  159. * @return
  160. */
  161. public boolean isSearched(List list, String url) {
  162.    String url_end_ = "";
  163.    if (url.endsWith("/")) {
  164.     url_end_ = url.substring(0, url.lastIndexOf("/"));
  165.    } else {
  166.     url_end_ = url + "/";
  167.    }
  168.    if (list.size() > 0) {
  169.     if (list.indexOf(url) != -1 || list.indexOf(url_end_) != -1) {
  170.      return true;
  171.     }
  172.    }
  173.    return false;
  174. }
  175. /**
  176. * 检查URL是否被允许搜索
  177. * @param urlToCheck
  178. * @return
  179. */
  180. private boolean isRobotAllowed(URL urlToCheck) {
  181.    String host = urlToCheck.getHost().toLowerCase();// 获取给出RUL的主机
  182.    // System.out.println("主机="+host);
  183.    // 获取主机不允许搜索的URL缓存
  184.    ArrayList<String> disallowList = disallowListCache.get(host);
  185.    // 如果还没有缓存,下载并缓存。
  186.    if (disallowList == null) {
  187.     disallowList = new ArrayList<String>();
  188.     try {
  189.      URL robotsFileUrl = new URL("http://" + host + "/robots.txt");
  190.      BufferedReader reader = new BufferedReader(
  191.        new InputStreamReader(robotsFileUrl.openStream()));
  192.      // 读robot文件,创建不允许访问的路径列表。
  193.      String line;
  194.      while ((line = reader.readLine()) != null) {
  195.       if (line.indexOf("Disallow:") == 0) {// 是否包含"Disallow:"
  196.        String disallowPath = line.substring("Disallow:"
  197.          .length());// 获取不允许访问路径
  198.        // 检查是否有注释。
  199.        int commentIndex = disallowPath.indexOf("#");
  200.        if (commentIndex != -1) {
  201.         disallowPath = disallowPath.substring(0,
  202.           commentIndex);// 去掉注释
  203.        }
  204.        disallowPath = disallowPath.trim();
  205.        disallowList.add(disallowPath);
  206.       }
  207.      }
  208.      for (Iterator it = disallowList.iterator(); it.hasNext();) {
  209.       System.out.println("Disallow is :" + it.next());
  210.      }
  211.      // 缓存此主机不允许访问的路径。
  212.      disallowListCache.put(host, disallowList);
  213.     } catch (Exception e) {
  214.      return true// web站点根目录下没有robots.txt文件,返回真
  215.     }
  216.    }
  217.    String file = urlToCheck.getFile();
  218.    // System.out.println("文件getFile()="+file);
  219.    for (int i = 0; i < disallowList.size(); i++) {
  220.     String disallow = disallowList.get(i);
  221.     if (file.startsWith(disallow)) {
  222.      return false;
  223.     }
  224.    }
  225.    return true;
  226. }
  227. public static void main(String[] args) {
  228.    Spider ph = new Spider("英超""http://www.microsoft.com");
  229.    try {
  230.     // ph.processHtml();
  231.     Thread search = new Thread(ph);
  232.     search.start();//启动线程
  233.    } catch (Exception ex) {
  234.    }
  235. }
  236. }
  237. --------------------------------------SearchResultBean.java---------------------------------------------------------
  238. public class SearchResultBean {
  239.    String url = "";
  240.    String title = "";
  241.    String keywords = "";
  242.    int count_key_words = 0;
  243. public int getCount_key_words() {
  244. return count_key_words;
  245. }
  246. public void setCount_key_words(int count_key_words) {
  247. this.count_key_words = count_key_words;
  248. }
  249. public String getKeywords() {
  250. return keywords;
  251. }
  252. public void setKeywords(String keywords) {
  253. this.keywords = keywords;
  254. }
  255. public String getTitle() {
  256. return title;
  257. }
  258. public void setTitle(String title) {
  259. this.title = title;
  260. }
  261. public String getUrl() {
  262. return url;
  263. }
  264. public void setUrl(String url) {
  265. this.url = url;
  266. }
  267. }
0
0
查看评论

windows 下 python spider环境配置(requests + bs4)

1,安装python 下载地址:https://www.python.org/downloads/windows/ 由于个人一直使用python2.7,所以这里使用python2.7作参考。 下载安装 安装好之后,需要配置环境变量:C:\Python27\;(具体根据个人的安装目录) 在cmd下输入...
  • wangbin19911213
  • wangbin19911213
  • 2017-07-14 21:58
  • 346

python spider学习笔记(一)

以前早就听说过网络爬虫这东西,如今我也开始接触这神奇的东西了,可是乍一看,都是一些高大上的东西,天书啊,什么也看不懂,不知道初学者是否有和我一样的感受? 万事开头难,但是总有办法解决的。首先,我们得学一些网页基础知识,如何一步步深入。 一、网络爬虫的定义 网络爬虫,即Web Spider,是一...
  • deepexpert_liujian
  • deepexpert_liujian
  • 2014-11-07 15:22
  • 2463

spider工具类

package com.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.i...
  • u010029983
  • u010029983
  • 2015-05-11 19:32
  • 444

Spider 之 爬虫 基本工作原理

网络爬虫是捜索引擎抓取系统的重要组成部分。爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份。这篇博客主要对爬虫以及抓取系统进行一个简单的概述。 一、网络爬虫的基本结构及工作流程     一个通用的网络爬虫的框架如图所示:  &#...
  • u013630349
  • u013630349
  • 2016-03-21 20:36
  • 2943

raise KeyError("Spider not found: {}".format(spider_name)) KeyError: 'Spider not found: novelspider'

>>>runfile('D:/python/novelspider/main.py', wdir='D:/python/novelspider') Reloaded modules: novelspider.items, novelspider, n...
  • liyuetao680
  • liyuetao680
  • 2015-09-15 22:23
  • 4159

Python Spider 的总结

学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自动收邮件的脚本,写过简单的验证码识别的脚本,本来想写google music的抓取脚本的,结果有了强大的gmbox,也就不用写了。 这些脚本有一个共性,都...
  • I_peter
  • I_peter
  • 2016-11-28 17:01
  • 3401

Spider工作流程.

使用request获取网页得到response,使用selector去分析网页内容,selector使用XPath,CSS等方法来解析网页内容。 1. HTML语言,网页文本语言解读 2. Spider中的request和response,如何获取网页列表,如何复制网页内容,并将网页内容存起来以待分...
  • xuxiatian
  • xuxiatian
  • 2016-10-26 18:19
  • 424

关于开源框架Scrapy运行命令Crawl

KeyError: 'Spider not found: ''
  • qq_20545625
  • qq_20545625
  • 2017-07-26 16:56
  • 343

Spider之Scrapy安装的方法详解

安装scrapy的方法详解   scrapy在国内目前使用的人比较少,除了他比较新以外,还在于他本身还有很多弊端,比如:需要的支持包比较多,这些支持包相互之间的依赖关系,导致人们在安装他的时候各种吐血,而且吐血了还不一定又正确的结果!所以,今天趁自己需要换工作环境,记录点滴。  ...
  • Mr_Data_Mining
  • Mr_Data_Mining
  • 2013-03-01 10:11
  • 1364

scrapy KeyError: 'Spider not found: doubanmovie' FAQ

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "D:\anzhuang\Anaconda\lib\site-packages\spy...
  • liyuetao680
  • liyuetao680
  • 2015-09-09 10:27
  • 2380
    个人资料
    • 访问:240261次
    • 积分:3229
    • 等级:
    • 排名:第12514名
    • 原创:36篇
    • 转载:318篇
    • 译文:0篇
    • 评论:19条
    最新评论