草庐IT

python - 爬取时存储 URL

coder 2023-08-22 原文

我用 Python 创建了一个小网络蜘蛛,我用它来收集 URL。我对内容不感兴趣。现在我将所有访问过的 URL 保存在内存中的一个集合中,因为我不希望我的蜘蛛访问 URL 两次。当然,这是一种非常有限的实现方式。

那么跟踪我访问过的 URL 的最佳方式是什么?

我应该使用数据库吗?

  • 哪个? MySQL、SQLite、PostgreSQL?
  • 我应该如何保存 URL?作为主键尝试在访问每个 URL 之前插入它?

还是应该将它们写入文件?

  • 一个文件?
  • 多个文件?我应该如何设计文件结构?

我敢肯定有很多关于这个或类似主题的书籍和论文。您能给我一些建议吗?

最佳答案

我写过很多蜘蛛。对我来说,比内存不足更大的问题是,如果代码或机器崩溃,或者您决定需要调整代码,则可能会丢失您已经抓取的所有 URL。如果您用完了 RAM,现在大多数机器和操作系统都会进行分页,因此您的速度会变慢但仍能正常运行。必须重建一组在数小时和数小时的运行时间内收集的 URL,因为它不再可用,这对生产力来说是一个真正的打击。

将您不想丢失的信息保存在 RAM 中是不好的。显然,此时数据库是可行的方法,因为您需要快速随机访问以查看是否已经找到了 URL。当然,内存中查找速度更快,但权衡要将哪些 url 保留在内存中会增加开销。我没有尝试编写代码来确定我需要/不需要哪些 URL,而是将其保存在数据库中并专注于使我的代码干净和可维护,并使我的 SQL 查询和模式合理。使您的 URL 字段成为唯一索引,DBM 将能够立即找到它们,同时自动避免冗余链接。

与您访问的互联网和网站的连接可能比您与内部网络机器上的数据库的连接慢很多。同一台机器上的 SQLite 数据库可能是最快的,尽管 DBM 本身不如我最喜欢的 Postgres 复杂。我发现将数据库放在与我的蜘蛛机器相同的交换机上的另一台机器上速度非常快;让一台机器处理抓取、解析,然后数据库读/写是非常密集的,所以如果你有一个旧机器,把 Linux 扔在上面,安装 Postgres,然后去镇上。如果您需要更快的速度,请在包装盒中添加一些额外的 RAM。拥有用于数据库使用的单独盒子可能非常好。

关于python - 爬取时存储 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2615830/

有关python - 爬取时存储 URL的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  4. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  5. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  6. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  7. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  10. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

随机推荐