zoukankan      html  css  js  c++  java
  • 使用C# 实现简单的爬虫

    转自:http://www.cnblogs.com/suyuan/archive/2008/04/20/1163016.html

    花了三个小时,实现了一个简单的爬虫,现在实现的功能是设置抓取深度,设置入口
    出现的问题是:目前是单线程 在url抓取过程中会出现重复的url 尽管我努力去避免此类问题的发生,但是在我本地调试过程中还是出现了类似的问题
    我避免url重复的方式 是 根据父页面 来判断  具体看程序代码 整个代码相对比较简单,希望对刚刚开始研究爬虫的新手有所帮助,也希望对我这个代码目前存在的问题 给予纠正 
    /Files/suyuan/CSpider.rar

    以下内容为转载

    Spider技术:设计Spider时要解决的几个问题

    spider是整个搜索引擎系统中很重要的一个组成部分,可以说是搜索引擎的基础。它不仅仅是为搜索引擎提供了搜索对象——海量数据,更重要的是它使搜索引擎从一个检索工具上升为一个信息整合的平台
    搜索引擎的本质就是信息的整合,通过信息的整合构建了一个用户平台。这样就使得搜索引擎成为一个很好的且很有利润的商业化对象。

    好的搜索引擎必须配一个好的spider,好的spider需要设计人员优雅的去设计。

    设计时spider重点要解决以下几个问题:

    1. 抓取的效率 
                抓取的效率和计算机硬件的性能、硬件的多少、网络的带宽有关系,但为了提高抓取效率不能一味地增加硬件,而是要利用有限的硬件资源在一定的时间内抓取最多的的网页。
                常见的提高抓取效率的策略有:
                (1)采用多线程并发抓取
                (2)采用单线程、非阻塞I/O抓取
                (3)分布式抓取,把抓取工作分布到多台服务器完成,对于Google这样的搜索引擎还包括地理上的分布式,把抓取服务器机群分布到全球各个国家的主干网上抓取。
                (4) 抓取的效率很大程度也取决于抓取的对象——网站服务器和带宽的速度。因此设计spider时要有估算抓取网站服务器负载和带宽的功能并且有一个很好调度策略,使得访问不同状况网站服务器有不同的频率。

    2. 抓取的质量
                设计spider的目标不是把互联网上的所有网页都抓回来,而是抓重要的而且是最新的网页的即可。
                怎样抓取高质量的网页?哪些网页是质量比较高的?这里就要求设计人员对互联网以及用户的习惯和常理都有一定的理解。
                从互联网整体上看,网站中各个网页之间的链接关系是一个很重要的资源,因此在抓取网页时要记录网页之间的链接关系,以便进行链接分析,从而通过链接关系来评价网页的质量。
                网页重要性的评价指标可以从以下几个方面着手:
                (1)某个网页的链接深度。
                (2)网页的入度。
                (3)网页的父网页的入度。
                (4)网页的重复数。
                以上这些指标都基于这么几个常理:
                (1)网站最重要的网页都放在前面,即层次越浅。网站首页以及首页指向的网页都是比较重要的。
                (2)有很多网页、很重要的网页都指向这个网页,这个网页就比较重要,就像检索工具《SCI》评价论文的质量一样,被引用的论文的次数越多,则说明这篇论文比较重要。
                (3)第二点讲的是引用,还有一个就是转载,网页转载的次数越多,则说明这个网页比较重要,就像报纸或杂志文章一样,好的文章都被其他媒体大量转载。
                具体实现时除了第一个指标外,其他三个指标只有在预处理阶段的统计才能得出。
                所以在抓取时应首先获得尽量多的网站首页,然后从该网站首页出发采用先宽的抓取策略。

    3. 抓取的礼貌问题
                 礼貌的抓取具体表现在:网站不让抓取的网页就不要抓取,控制好访问网站的频率,spider的抓取行为不能影响正常用户的访问。因此spider在抓取时要:
                (1)限制单位时间内对一个网站抓取网页的数量。
                (2)限制同时对同一个网站抓取的线程/进程的数量。
                (3)控制对同一个网站抓取的时间间隔。
                (4)遵循robots、META Tag 、sitemap.htm协议 ,对不允许访问的目录不访问。
                (5)在抓取网页的时发送的请求中,通过User-agent、Form字段,标识spider的身份、联系Email、spdier注意事项页面URL。

    4. 避免重复抓取
                之所以会造成重复抓取,是因为:
                (1)互联网上大量网页被其他网页引用,这就使得同一个网页的URL出现在多个不同的网页中,这就要求spider必须有URL消重功能。
                (2)网页被其他网页转载,这就使得同一篇文章出现在不同URL的页面中,这就要求spider具有内容消重功能,目前这块比较难以实现,当前很多搜索引擎公司都没有较好的解决这个问题。
               (3)网页的URL有多种表示形式,这是由于DNS与IP对应关系造成的。
                一个URL对应一个网页,但由于URL可以采用以下两种表示方式:
                [协议://]域名[:端口][/路径/文件名]
                [协议://]点分十进制IP地址[:端口][/路径/文件名]
                且域名与IP存在以下对应关系:
                -- 一对一,http://www.baidu.com 与http://220.231.39.97指向的是同一网页。
                -- 一对多,DNS轮转,http://www.163.com 与http://202.108.42.73,http://202.108.42.91指向的是同一网页。
                -- 多对一,虚拟主机,多个域名对应同一个ip,不同的URL指向不同的网页。
                                 一个网站具有多个域名,对应同一个IP,例如:www.netease.com,www.163.com指向同一个网页。
                - - 多个域名对应多个ip ,一个网站有多个域名,同时采用了DNS轮转技术,一个域名对应多个ip地址。
                            
    5. 抓取数据的更新
                 抓取数据的更新问题是一个很重要的问题,它决定了用户能不能马上搜索到最新的新闻,最新的内容,但是由于互联网上海量的网页使得一次抓取的周期都很长 ,如果通过每次重新抓取一次来更新,势必更新周期很长。
                 spider已经抓取的网页可能被修改、删除,spider要定期检测这些网页的更新情况,同时更新原始网页库、提取的数据库以及索引库。
                 互联网上同时不断的产生新的网页,spider也要抓取回来。
                 不同的网站的更新周期不一样,有的很长,有点很短。
                spider要根据网站的更新周期,对网站进行分类,不同更新周期的网站抓取的周期不一样。
                一般来说,网络蜘蛛在更新原始网页库等的时候,不用把URL对应的网页重新抓取一遍,对于大部分的网页,只需要HTTP Head请求、条件Get请求来更新。

    6.内容提取
                spider要抓取的文件各种各样,比如有HTML、XML网页,有doc、ppt、xls、pdf等带格式的文档,有图片、音频、视频等多媒体数据,对这些不同类型文件spider都要提取出文件里的纯文本内容。
                对于doc、pdf等文档,这种由专业厂商提供的软件生成的文档,厂商都会提供相应的文本提取接口。
                对于HTML、XML网页来说,除了标题和正文以外,会有许多版权信息、广告链接以及公共的频道链接,这些链接和文本正文一点关系也没有,在提取网页内容的时候,也需要过滤这些无用的链接。
                对于多媒体、图片等文件,一般是通过链接的锚文本(即,链接文本)和相关的文件注释来判断这些文件的内容。另外,许多多媒体文件中有文件属性,考虑这些属性也可以更好的了解文件的内容。
                对于网页内容的提取一般采用插件的形式,通过一个插件管理服务程序,遇到不同格式的网页采用不同的插件处理。这种方式的好处在于扩充性好,以后每发现一种新的类型,就可以把其处理方式做成一个插件补充到插件管理服务程序之中。

    7. 硬件投入、抓取速度、一次抓取时间、抓取数据量等估算
                 孙子曰:凡是预则立,不预则废。强调计划的重要性。很多事情也要做到心中有数。
                 设计一个spider一定要考虑抓取10亿网页需要多长时间,需要多少硬盘来存,需要多少服务器来抓等。这些都可以通过估算得到一个最好/最大值的。
                  例如:抓取时应该使用多少台机器以及一台机器启动多少抓取进程/线程呢?
                  这里要考虑硬件资源情况:
                   -- 局域网带宽 //发送速率
                   -- 互联网接入带宽
                   -- 局域网时间延迟 //1 ~ 10 ms
                   -- 互联网时间延迟 //100 ~ 500 ms
                   -- 服务器端接收请求、响应时间
                   -- CPU利用率
                   -- 内存大小以及利用率
                   -- 硬盘大小以及读写速度
                   -- 系统负载情况

    以上提到了设计spider时要着重考虑的几个问题,这只是从大的方面概略地介绍了以一下,技术其实还是一门精工细作的工作,需要技术人员不断地去打磨。

  • 相关阅读:
    在C++中使用GDI+绘制带箭头的线,箭头大小可调
    tomcat通过conf-Catalina-localhost目录发布项目详解
    VC++ 获取Windows系统标准字体方法
    简单实现全屏对话框
    采用ATL实现无模板对话框的显示
    C++实现全局鼠标、键盘消息hook,支持事件
    C++ FastDelegate 扩展,实现与.net类似的事件处理功能
    技术研发在国内的现状
    [STM32F103]DMA原理
    [STM32F103]RTC日历
  • 原文地址:https://www.cnblogs.com/waniu/p/2826019.html
Copyright © 2011-2022 走看看