acm-header
登录

ACM通信

BLOG@CACM

通过爬行挖掘网络数据


凯特Matsudaira

任何数据挖掘项目的核心都是拥有足够数量的数据,这些数据可以被处理以提供有意义的和统计相关的信息。但获取数据只是第一个阶段。这些数据通常以非结构化的形式收集,因此必须将其转换为结构化的格式,以便于处理。

在过去的几年中,……有了增长免费的网络爬虫数据集但对于许多应用程序来说,仍然需要在网上搜索来收集信息。如果数据挖掘的难度还不够大,那么在网络上搜索发现和收集内容还会面临许多违反直觉的挑战。在规模更大的情况下,挑战变得越来越困难。

实际上,捕获单个网页的内容非常容易。下面是一个使用命令行工具的简单爬虫程序wget

Wget - r——html-extension——convert-links——mirror——progress=bar——no-verbose——no-parent——tries=5 -level=5 $your_url

如果你想要抓取多个页面的内容,有很多开源的网络爬虫,但你会发现其中很多解决方案都是多余的,它们通常被设计成以一种非常大规模、分布式的方式抓取web。本文主要讨论在小范围内为数据挖掘项目收集特定类型的web数据所面临的挑战;通过探索其中的三个挑战(创建URL边界、调度URL和提取信息)和潜在的解决方案。

创建URL边界

URL边界是爬虫打算在将来获取和处理的URL的集合。URL边界通常以两种方式工作——批处理抓取或连续抓取。批处理抓取的边界只包含新的url,而连续抓取的边界可以包含url的种子集,但在抓取期间可能会添加新的url(或删除现有的url)。

不管抓取的类型是什么,用于管理边界的数据存储都需要非常快,因为它会减慢抓取速度。下图帮助说明了爬行边界中的url。

URL边界图

爬行的核心非常简单:

  1. 选择一个要抓取的URL
  2. 获取和解析页面
  3. 保存重要内容
  4. 从页面中提取url
  5. 向队列中添加url
  6. 重复

当然,关于URL发现的细节非常复杂,这取决于您的应用程序(例如,您可能不希望每个URL都出现在页面上)。围绕要选择抓取的url(选择)和要过滤的url添加逻辑(通常一个简单的限制是将过滤器设置为只应用于特定域而忽略所有其他域),可以帮助确保抓取紧紧针对目标内容/数据。

创建URL边界的一种方法是定义URL或域的种子集,并抓取它们以提取和发现新的链接。对链接进行后期处理以规范化它们可以帮助减少重复,这是一个值得遵循的最佳实践。这种后处理的另一个例子是在将链接添加到边界之前过滤链接,例如将链接限制到特定的域,或使用一种算法根据应用程序和爬行的目标对url进行优先级排序。

(如需更多信息,请结帐这篇论文斯坦福关于URL调度和排序)

爬行和调度

说到爬行,有很多细节可以让人快速和大规模地爬行。如果您的爬行少于1亿个页面,并且您有足够的时间不需要跨服务器分布爬行,那么爬行和调度就更容易管理。跨多个服务器的分布式爬行的协调很快就会变得很困难(因为它要复杂得多,我将不得不把这些细节留到以后的文章中讨论)。

当涉及到获取和解析页面时,每个url都涉及到几个步骤:

  1. DNS查找
  2. 获取robots . txt
  3. 获取URL
  4. 解析内容
  5. 存储结果

对于DNS查找和robots.txt规则,可以缓存这些规则,这样来自同一IP的任何后续url都将更快,而且不需要跨网络访问。

提示:对于DNS查找,许多内置工具包在默认情况下是同步的,因此配置它有助于实现并行性和速度。

当然,这对任何爬虫都很重要遵守robots.txt文件中的规则,可能会排除域名的全部或部分。

(有关此排除协议的详细信息,请参阅http://www.robotstxt.org/wc/norobots.html

爬行的另一个重要方面是选择抓取哪些url以及以什么顺序抓取

如果您正在进行连续的爬行,那么考虑什么时候可以重新爬行一个页面是很重要的。互联网的某些部分一直在变化(如新闻网站http://www.cnn.com),并应定期爬取,因为它们有新的内容、是权威网站或重要的数据来源。

记住礼貌的重要性。你的爬虫不应该同时发出太多的请求,因为它们可能会使动力不足的服务器不堪重负。最佳实践是对相同IP的请求之间等待2秒

提示:不要对输入url进行排序,否则您将在调用之间等待。随机化各个域的url顺序。

调度不仅仅是选择要抓取的url,还包括跟踪到目前为止已经抓取过的url。如果您有一个小的抓取(<1亿个url),那么将这些url存储在内存中可能是有意义的,否则您的应用程序性能可能会受到从磁盘或通过网络读取的影响。可以将url存储为纯文本,尽管使用绽放过滤器(http://en.wikipedia.org/wiki/Bloom_filter)哈希url使读写速度更快。

最后,当新url被发现时,重要的是对它们进行规范化以去除重复。

例如,许多页面是相对于主域表示的。这样一个链接可能是/about.html,但需要转换为:http://katemats.com/about.html.由于许多URL都具有查询参数(例如用于分析或会话信息的URL),因此很容易遇到引用同一网页的多个不同版本的URL。这些无关的参数通常必须被删除或规范化,以便爬行的唯一URL是页面的规范版本。

使用rel = "规范"标签(以阅读更多检查谷歌的文档)可以作为一个信号,如果页面是一个副本,但它不是到处使用,因此值得实现一个指纹算法。使用和算法叠瓦构造可以帮助检测相同或接近重复的页面。

说到爬行,下面列出了一些开源爬行器:

提取的信息

一旦配置了爬虫,最后一块拼图是提取和结构数据从不同的网页。

解析网页最重要的部分是你的解析器能够处理杂乱的标记,并对错误具有弹性。您可能需要一些智能逻辑来删除页面chrome(如导航、页眉/页脚、搜索框、广告等),以便只返回数据。考虑ASCII文本以外的内容也很重要,因为它通常会在Unicode url和内容之间运行。

如果你试图抓取整个网络,还有更多的事情需要考虑,因为互联网充满了垃圾,如巨大的或永不结束的页面,蜘蛛陷阱看起来像动态内容,但实际上是无限生成的链接。

有了html内容之后,就有必要在页面和DOM中导航,以找到与您的目标相关或重要的页面特定部分。当然,然后以结构化的形式存储信息,这可能意味着将其转换为JSON,或将其转换为适合模式并将其插入到数据库中。值得庆幸的是,有很多解析网页的提取器,如下所示:

  • Scrapy(抓取和爬行框架)
  • 用机械装置
  • 美丽的汤
  • 样板(用于去除网页周围的chrome)

有一点不同,但适合从页面中提取文章文本Readabillity

现在你知道了!希望这是一个很好的介绍通过爬行收集一些网络数据,如果你有其他链接或资源,请在评论中包括他们。

参考文献

http://pdf.aminer.org/000/003/078/crawling_the_web.pdf

http://nlp.stanford.edu/IR-book/html/htmledition/web-crawling-and-indexes-1.html

http://pdos.csail.mit.edu/~strib/docs/tapestry/tapestry_jsac03.pdf

http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf

http://pdos.csail.mit.edu/papers/chord:sigcomm01/chord_sigcomm.pdf


没有发现记录

Baidu
map