hdqqq

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  35 随笔 :: 0 文章 :: 104 评论 :: 0 Trackbacks

最近需要收集资料,在浏览器上用另存为的方式实在是很麻烦,而且不利于存储和检索。所以自己写了一个小爬虫,在网上爬东西,迄今为止,已经爬了近百万张网页。
现在正在想办法着手处理这些数据。

爬虫的结构:
   爬虫的原理其实很简单,就是分析下载的页面,找出其中的连接,然后再下载这些链接,再分析再下载,周而复始。在数据存储方面,数据库是首选,便于检索,而开发语言,只要支持正则表达式就可以了,数据库我选择了mysql,所以,开发脚本我选择了php。它支持perl兼容正则表达式,连接mysql很方便,支持http下载,而且windows系统和linux系统都可以部署。

正则表达式:
  正则表达式是处理文字的基本工具,要取出html中的链接和图片,使用的正则表达式如下。

   "#<a[^>]+href=(['\"])(.+)\\1#isU"   处理链接
    "#<img[^>]+src=(['\"])(.+)\\1#isU" 处理图片

其他问题:
  写爬虫还需要注意的一个问题是,对于已经下载过的url,不能重复进行下载,而有些网页的链接会形成环路,所以需要处理这个问题,我的处理方法是计算已经处理的url的MD5 值,并存入数据库,这样就可以检验是否已经下载过。当然还有更好的算法,有兴趣的话,可以在网上找一下。

相关协议:
  爬虫也有自己的协议,有个robots.txt文件定义了那些是网站允许遍历的,但是由于我的时间有限,没有实现这个功能。


其他说明:
  php支持类编程,我写的爬虫主要的类.
  1.url处理web_site_info,主要用处理url,分析域名等。
  2.数据库操作mysql_insert.php,处理和数据库相关的操作。
  3.历史记录处理,记录已经处理的url。
  4.爬虫类。

存在的问题和不足

  这个爬虫在小数据量的情况下,运行良好,但是在大数据量的情况下,历史记录处理类的效率就不是很高,通过在数据库结构中,对相关字段进行了索引,速度有了提高,但是需要不断得读取数据,可能和php本身的array实现有关系,如果一次加载10万条历史记录,速度非常慢。
  不支持多线程,每次只能处理一个url。
  php运行本身有内存使用量限制,有一次在抓取深度为20的页面的时候,内存用尽程序被杀。


下面的url是源码下载。

http://www.cppblog.com/Files/hdqqq/net_spider.rar


使用的时候,先在mysql中创建net_spider数据库,然后用db.sql创建相关表。再在config.php中设置mysql的用户名口令。
最后
php -f spider.php 深度(数值) url
就可以开始工作。如

php -f spider.php 20 http://news.sina.com.cn

 

现在感觉下来,其实做个爬虫没那么复杂,难的是数据的存储和检索。我现在的数据库,最大一个数据表已经15G,正在想办处理这些数据,mysql进行查询已经感觉有点力不从心了。这点上还真佩服google。

 

 

posted on 2008-05-09 14:09 hdqqq 阅读(21674) 评论(7)  编辑 收藏 引用 所属分类: 其他开发语言

评论

# re: 一个轻量级家用爬虫 2008-05-13 08:27 mm
我不会这方面的技术,不过看了还是蛮佩服的  回复  更多评论
  

# re: 一个轻量级家用爬虫 2008-05-13 21:57 merlinfang
爬虫还是很复杂的,你这个太简单了.就比如连接来说吧,你只处理了<a href>的,还有其他类型的,脚本的等等.
再比如排重吧,你只是避免同一url的访问,但是同一url也要多次访问的,因为内容会变化的,策略上有考虑.再考虑分布式多线程,排重就更难了  回复  更多评论
  

# re: 一个轻量级家用爬虫[未登录] 2008-05-14 11:36 hdqqq
是的,那些在javascript中的url比较难用正则表达式概括出来,因为还可能是根据变量生成的,所以就直接过滤了.

至于排重的问题,因为我计算的是url的md5,而不是整个html的md5,所以在碰到页面更新而url不变的时候,会有问题.这个我在测试新浪新闻首页的时候,发现尽管新浪新闻首页的url不变,内容会变,但是具体到其中的某条新闻,都是有单独的url的.碰到这种情况,只要周期的运行一下爬虫就可以了,我现在的机器上就是用crontab 定时运行的.

这个也和爬虫的目的有关系,有的可能更关注某个具体站点,有的也许想多爬一些站点,这个是深度和广度的关系,和使用者的策略有关.

我现在用的是一张表记录历史记录,在百万数量记录下,效率不是最好的,建立更小的的分布存储表可能会更好一些. 这些可以部署架构方面进行改进.  回复  更多评论
  

# re: 一个轻量级家用爬虫 2008-05-19 11:50 苦恼
我是一个本科毕业生,这次毕业设计是网络爬虫,我用java没编出来,
看到您写的东西,想让您指点一下。看有没有事件  回复  更多评论
  

# re: 一个轻量级家用爬虫 2008-05-19 11:51 苦恼
我的QQ271244426
能不能留下您的QQ?  回复  更多评论
  

# re: 一个轻量级家用爬虫[未登录] 2008-05-19 14:50 hdqqq
@苦恼
我写的爬虫,主要的几个类都在代码里面了,你用java开发的话,关键还是找到对应的功能,象map或者hash map, http下载, 正则表达式等功能的类或者库,还有就是处理数据库的模块,应该可以实现的.  回复  更多评论
  

# re: 一个轻量级家用爬虫 2008-11-10 21:35 李玉
厉害!能认识你吗?我一直想学习一下,邮箱:heiseqilinlyf@163.com
这个不常用,常用的不便公开,能给我发个邮件,我给你发那个邮箱,麻烦了!
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理