如何编写一个爬虫?

时间:2020-03-06 14:26:25  来源:igfitidea点击:

我曾想过尝试编写一个简单的爬网程序,该爬网程序可能会爬网并为NPO的网站和内容生成其发现列表。

是否有人对此有任何想法?我们将爬虫指向何处开始使用?它如何发回其发现并仍在继续爬行?它怎么知道它发现了什么,等等。

解决方案

使用wget进行递归Web吸收,它将所有文件转储到硬盘驱动器上,然后编写另一个脚本来浏览所有下载的文件并进行分析。

编辑:或者也许用curl代替wget,但是我对curl不熟悉,我不知道它是否像wget一样递归下载。

我们可以列出单词,并为在google中搜索到的每个单词创建一个主题。
然后,每个线程将为其在页面中找到的每个链接创建一个新线程。
每个线程都应该写它在数据库中找到的内容。当每个线程读完页面后,它终止。
在那里,数据库中有一个很大的链接数据库。

爬虫的概念很简单。

我们可以通过HTTP GET获得一个根页面,对其进行解析以查找URL并将它们放置在队列中,除非已对其进行了解析(因此,我们需要全局记录已解析的页面)。

我们可以使用Content-type标头来查找内容的类型,并将搜寻器限制为仅解析HTML类型。

我们可以剥离HTML标记以获取纯文本,可以对其进行文本分析(以获取标记等页面的内容)。如果我们已经高级的话,甚至可以在图片的alt / title标签上执行此操作。

在后台,我们可以拥有一个线程池,这些线程从Queue中获取URL并执行相同的操作。我们当然要限制线程数。

Wikipedia上有一篇有关Web爬网程序的好文章,涵盖了许多算法和注意事项。

但是,我不会费心编写自己的搜寻器。这需要大量工作,并且由于我们只需要一个"简单的爬虫",所以我认为我们真正需要的只是现成的爬虫。有许多免费的开放源代码搜寻器可以完成我们需要的所有工作,而我们所做的工作很少。

如果NPO站点相对较大或者复杂(具有动态页面,可以动态创建"黑洞",如带有"第二天"链接的日历),则最好使用真正的网络爬虫,例如Heritrix。

如果站点总数只有几页,则只需使用curl或者wget或者我们自己的页面就可以摆脱。只要记住它们是否开始变大,或者我们开始​​使脚本变得更复杂以仅使用一个真正的搜寻器,或者至少查看其源代码就可以知道它们在做什么以及为什么。

一些问题(还有更多):

  • 黑洞(如上所述)
  • 重试(如果得到500,会怎样?)
  • 重新导向
  • 流量控制(否则我们可能会成为站点的负担)
  • robots.txt实施

可以肯定的是,我们将重新发明轮子。但是,这是基础知识:

  • 未访问的URL列表-使用一个或者多个起始页面作为种子
  • 访问过的网址列表-这样我们就不会出现圈圈的情况
  • 一组我们不感兴趣的URL的规则-这样就不会为整个Internet编制索引

将它们放在持久性存储中,这样我们就可以停止并启动搜寻器,而不会丢失状态。

算法是:

while(list of unvisited URLs is not empty) {
    take URL from list
    remove it from the unvisited list and add it to the visited list
    fetch content
    record whatever it is you want to about the content
    if content is HTML {
        parse out URLs from links
        foreach URL {
           if it matches your rules
              and it's not already in either the visited or unvisited list
              add it to the unvisited list
        }
    }
}