use*_*743 7 python database url storage web-crawler
我用Python创建了一个小网页蜘蛛,用于收集网址.我对内容不感兴趣.现在我将所有访问过的URL保存在内存中,因为我不希望我的蜘蛛两次访问URL.当然,这是实现这一目标的一种非常有限的方式.
那么跟踪我访问过的网址的最佳方法是什么?
我应该使用数据库吗?
或者我应该将它们写入文件?
我确信有关于这个或类似主题的书籍和大量论文.你能告诉我一些我应该阅读的建议吗?
我写了很多蜘蛛.对我来说,比内存耗尽更大的问题是,如果代码或计算机崩溃或您决定需要调整代码,则可能会丢失已经抓过的所有URL.如果你的RAM耗尽,那么现在大多数机器和操作系统都会打开页面,这样你就会放慢速度但仍能运行.必须重建一组在几小时的运行时间内收集的URL,因为它不再可用,这可能是对生产力的真正打击.
在RAM中保存您不想丢失的信息是不好的.显然,数据库是此时的方法,因为您需要快速随机访问才能查看您是否已找到URL.当然,内存中查找速度更快,但是计算WHICH url保留在内存中的权衡会增加开销.我没有尝试编写代码来确定我需要/不需要哪些URL,而是将其保存在数据库中,专注于使我的代码清洁和可维护,并且我的SQL查询和模式是明智的.使您的URL字段成为唯一索引,DBM将能够立即找到它们,同时自动避免冗余链接.
您与Internet和您访问的站点的连接可能比您在内部网络上的计算机上连接数据库要慢得多.同一台机器上的SQLite数据库可能是最快的,尽管DBM本身并不像Postgres那样复杂,这是我最喜欢的.我发现将数据库放在与我的蜘蛛机相同的交换机上的另一台机器上非常快; 让一台机器处理spidering,解析,然后数据库读/写非常密集,所以如果你有一个旧盒子扔Linux,安装Postgres,然后去城里.如果你需要更快的速度,请在盒子里加一些额外的RAM.拥有用于数据库使用的单独框可以非常好.
这些似乎是我的重要方面:
有很多方法可以做到这一点,这取决于您的数据库有多大.我认为SQL数据库可以为您的问题提供一个很好的模型.
您可能只需要一个SQLite数据库.通常,存在检查的字符串查找是一个缓慢的操作.为了加快速度,您可以创建URL的CRC哈希并将CRC和URL存储在数据库中.您将在该CRC字段上有一个索引.
URL散列当然有可能发生冲突,但如果100%跨越对您不重要,那么当发生冲突时,您可以在数据库中获取没有URL的命中.
您还可以通过多种方式减少碰撞.例如,您可以增加CRC的大小(CRC8而不是CRC4)并使用更大尺寸的散列算法.或者使用CRC以及URL长度.
| 归档时间: |
|
| 查看次数: |
976 次 |
| 最近记录: |