使用 C# 进行网页抓取 - 指点与抓取!






4.98/5 (45投票s)
自动化您的网页抓取 - 使用 JavaScript 和 C# 构建一个指点点击的网页抓取引擎
引言
本文是多部分系列文章的第三部分
- 第一部分 - 如何使用 C# 进行网页抓取
- 第二部分 - 使用 .NET 进行网页爬行 - 概念
- 第三部分 - 使用 C# 进行网页抓取 - 指点与抓取!(本文)
- 第四部分 - 使用 .NET 进行网页爬行 - 示例代码(待续)
背景
我练习网页抓取技艺已经有一段时间了,而且大部分时间都是手动进行的。我看到过一些商业产品,它们提供了一种更快、更简单的方法来抓取网页上的数据,那就是字面意义上的“指点点击”。这不仅可以为我们这些可怜的程序员节省时间,对于那些非程序员用户来说也非常有用,他们仍然需要从网页上获取数据*(当然,是在不烦扰程序员的前提下!)*。本文将作为对构建这样一个引擎所需内容的简短介绍,并重点介绍构建指点点击式网页抓取/爬行引擎的一些技术。
本文内容足以让您开始自己动手开发,一旦我完成了完整的代码,我还会回过头来重新探讨它。
指点点击引擎
构建大多数东西通常是三分靠智慧,七分靠连接点,还有一个部分是站在前人的肩膀上——这个项目也不例外。
工作流程相当基础——一些商业公司已经做过类似的事情,包括 Kimono Labs。他们公司被收购,产品也已关闭,所以对我们来说已经没有用了,但我们可以从中学到很多!...
步骤 1 - 高亮/选择要抓取的元素
第一步是有一种方法可以在浏览器中动态地选择/识别包含我们要抓取数据的 HTML 元素。这通常作为一个浏览器扩展/插件来实现。
总的来说,这是一件很简单的事情,这里有示例,那里也有示例。'Selector Gadget' 也是一个很好的参考示例。
要获取重复的元素,就像下面的 Kimono 截图一样,您只需要查看选定的元素,然后在其父级/同级元素周围寻找重复元素的模式,然后进行猜测(让用户在您进行的过程中进行纠正)。在这个例子中,您可以看到我在浏览器中点击了我的一篇文章的标题,代码就已经自动地选择了它认为的其他文章标题。
上述概念会随着您要抓取页面上的其他字段/数据块而重复出现,并保存到模板中。确定要抓取什么的关键是获取您想要抓取的元素的 XPath。当然,这有时会有点复杂,但从长远来看是值得的。在这里了解更多关于XPath 的知识。一旦您拥有一个或多个元素的 XPath,您就可以使用我网页抓取入门文章中演示的技术,使用CSS 选择器查询来抓取数据。
下图展示了例如,您如何为上面抓取的 `div` '`title`' 存储一个 XML 模板。
借用上一篇关于网页抓取的文章中的一些代码,并基于上面的 XML 示例,这就是您如何将页面上所有 '`title`' 数据提取到名为 `Titles` 的列表变量中。
WebPage PageResult = Browser.NavigateToPage(new Uri(XML.url));
var Titles = PageResult.Html.SelectNodes(XML.elements.element[n].xpath)
步骤 2 - 抓取流程
您需要告诉您的引擎如何访问数据所在的页面以及数据在页面上的位置。这与第 1 步中的选择不同。我在这里指的是那些将数据带到页面的事物——假设我有 100 篇文章,但页面一次只显示 30 篇。在这种情况下,您需要让您的引擎知道它需要
- 转到页面
- 查找元素,抓取
- 转到下一页(以及如何操作)
- 重复,直到最后一页
要实现这一点,您需要让引擎知道如何导航,这涉及到识别分页数据
- 起始页
- 结束页
- 每页行数
- 上一页/下一页链接
步骤 3 - 计划与抓取!
好了,这个谜题的最后一块是将所有东西整合起来,这样您就可以指点点击您想要抓取的内容,然后定期安排它执行。根据您的需求,以下是一些可能对您有帮助的有用工具
这是一个极其健壮的定时器/调度框架。它被广泛使用,易于实现,并且比使用和滥用无处不在的 `timer` 类来安排代码中的任务要好得多。您可以实现非常简单的计划,如“每周二”、“一次,在特定时间”,或者使用内置的CRON 触发器方法来处理相当复杂的任务。
以下是一些示例
0 15 10 ? * * | 每天上午 10:15 执行 |
0 0/5 14 * * ? | 每天下午 2 点开始,下午 2:55 结束,每 5 分钟执行一次 |
2002-2005 年,每年的最后一个星期五上午 10:15 执行 | 2002、2003、2004 和 2005 年期间,每月的最后一个星期五上午 10:15 执行 |
相当强大的功能!
如果您的用户界面是在 Web 上,这个 JQuery 插件可能会很有用。它为用户提供了一个简单的界面来生成/选择计划时间,而无需了解 cron 的语法!
这个最后一步的工作就是根据存储的模板执行抓取过程,在预定的时间执行。要快速启动和运行基本功能很容易——有趣的挑战在于构建它。请关注后续更新。:)
摘要
至此,本文的基础内容就完成了,应该足以让您开始编写代码了!
下一次更新将提供一些您可以实现和构建的可用代码。
所以请记住
- 选择并创建模板
- 识别抓取流程
- 计划并抓取!
我附加了一个示例项目,其中包含浏览器中的动态选择功能,该功能取自上面的一个链接,供您开始使用。
最后 - 如果您喜欢这篇文章,请在上面给它投一票!!
历史
- 2016 年 4 月 7 日:版本 1