任何数据挖掘项目的核心都是拥有足够的数据量,可以对这些数据进行处理,以提供有意义的统计相关信息。但获取数据只是第一阶段。这些数据通常以非结构化形式收集,必须将其转换为适合处理的结构化格式。
在过去的几年中,有…的增长免费的网络爬虫数据集,但对于许多应用程序来说,仍然需要在web上爬行以收集信息。如果数据挖掘还不够困难,那么在爬行网络以发现和收集内容时,还有许多违反直觉的挑战。在规模更大的情况下,挑战变得越来越困难。
实际上,捕获单个网页的内容是相当容易的。下面是一个使用命令行工具的简单爬虫程序wget:
Wget - r——html-extension——convert-links——mirror——progress=bar——no-verbose——no-parent——tries=5 -level=5 $your_url
如果你想抓取多个页面的内容,有很多开源的网络爬虫程序,但你会发现很多解决方案都是多余的,通常是为了以非常大规模、分布式的方式抓取网络。本文侧重于在较小规模的数据挖掘项目中收集特定类型的web数据所面临的挑战;通过探索其中的三个挑战(创建URL边界、调度URL和提取信息)和潜在的解决方案。
URL边界是爬虫程序打算在将来获取和处理的URL的集合。URL边界通常以两种方式之一工作——批处理抓取或连续抓取。批处理抓取的边界只包含新的url,而连续抓取可以包含一组url的种子集,但在抓取期间可能会添加新的url(或删除现有的url)。
无论爬行的类型是什么,用于管理边界的数据存储都需要快速,否则会降低爬行的速度。下面是一个图表,它有助于说明爬行边界中的url。
爬行的核心非常简单:
当然,有关URL发现的细节根据应用程序的不同而非常复杂(例如,您可能不希望页面上的每个URL都是URL)。围绕要选择哪些url进行抓取(选择),以及要过滤哪些url(通常情况下,一个简单的限制是将过滤器设置为只应用于特定域,而忽略所有其他域)添加逻辑,可以帮助确保您的抓取紧密针对目标内容/数据。
创建URL边界的一种方法是定义一组URL或域的种子集,并对它们进行抓取以提取和发现新链接。对链接进行后期处理以使其规范化可以帮助减少重复,这是一个很好的最佳实践。这种后处理的另一个例子是在将链接添加到边界之前对其进行过滤,例如将链接限制到特定的域,或者使用一种算法对url进行优先级排序,使其对爬行的应用程序和目标有意义。
(欲了解更多信息,请查看斯坦福大学的论文有关网址调度和排序)
说到爬行,有很多细节可以让人快速而大规模地爬行。如果您的爬行少于1亿页,并且您有足够的时间不需要在服务器之间分布爬行,那么爬行和调度就更易于管理。跨多个服务器的分布式爬行协调很快就会变得困难(因为它要复杂得多,我将不得不把这些细节留到以后的文章中)。
当涉及到获取和解析页面时,每个url都涉及几个步骤:
对于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,尽管使用bloom过滤器(http://en.wikipedia.org/wiki/Bloom_filter)来散列url使读写速度更快。
最后,当发现新的url时,对它们进行规范化以删除重复的url是很重要的。
例如,许多页面是相对于主域表示的。这样一个链接可能是/about.html,但需要转换为:http://katemats.com/about.html.由于许多URL都有查询参数(例如用于分析或会话信息的URL),因此很容易遇到引用同一网页的URL的许多不同版本。这些无关的参数通常必须删除或规范化,以便抓取的唯一URL是页面的规范版本。
使用rel = "规范"标签(阅读更多检查谷歌的文档)可以作为一个信号,如果页面是重复的,但它不是到处都使用,所以值得实现一个指纹算法。使用和算法叠瓦构造可以帮助检测相同或几乎重复的页面。
说到爬行,有一些开源爬行程序可以考虑以下列出的:
一旦爬虫配置的最后一块拼图是提取和结构的数据从不同的网页。
解析网页的最重要的部分是你的解析器能够处理混乱的标记,并对错误有弹性。你可能需要一些聪明的逻辑来移除页面chrome(如导航、页眉/页脚、搜索框、广告等),这样就只返回数据。考虑ASCII文本以外的内容也很重要,因为在Unicode url和内容之间运行很常见。
如果你想要抓取整个网络,还有更多的事情需要考虑,因为互联网充满了垃圾,比如巨大的或永无止境的页面,蜘蛛陷阱看起来像动态内容,但实际上是无限生成的链接。
一旦有了html内容,就有必要导航页面和DOM,以找到页面中与您的目标相关或重要的特定部分。当然,然后以结构化形式存储信息,这可能意味着将其转换为JSON,或将其转换为适合模式并将其插入到数据库中。值得庆幸的是,有很多解析网页的提取器,如下所示:
有一点不同,但适合从页面中提取文章文本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
没有找到条目