网页抓取是一种从网页中提取数据的技术,对于开发者和非开发者来说都非常有用。本文将介绍如何使用C#来构建一个点选式的网页抓取/爬虫引擎。
从事网页抓取已有一段时间,通常都是手工进行。市面上有一些商业工具提供了快速简便的方法来从网页上提取数据,这些工具通常是通过点选操作来实现的。这不仅为开发者节省了时间,也方便了那些需要从网页上获取数据但并非开发者的用户。本文将简要介绍构建此类引擎所需的组件,并展示构建点选式网页抓取/爬虫引擎的一些技术。
构建大多数东西通常需要一部分脑力劳动和连接点,以及一部分站在前人肩膀上的工作——这个项目也不例外。
首先,需要有一种方法来动态地在浏览器中选择/识别包含想要抓取的数据的HTML元素。这通常是通过浏览器扩展/插件来实现的。
例如,'Selector Gadget'就是一个很好的例子。要获取像Kimono截图中那样的重复元素,只需要查看选中的元素,然后查看其父元素/兄弟元素的模式,然后进行猜测(让用户在过程中进行更正)。在这个例子中,可以看到在浏览器中点击了一篇文章的标题,代码就自动选择了它认为的其他文章标题。
上述概念在页面上想要抓取的其他字段/数据块上重复,并保存到模板中。知道要抓取什么的关键,是要获取想要抓取的元素的XPath。这有时可能会有点复杂,但从长远来看是值得的。了解更多关于XPath的信息,请参考。
一旦有了XPath,就可以使用在中展示的技术,使用CSS选择查询来抓取数据。
以下图表展示了如何将模板存储在XML中,例如,抓取上面的'div' 'title'。
WebPage PageResult = Browser.NavigateToPage(
new Uri(
XML.url
));
var Titles = PageResult.Html.SelectNodes(
XML.elements.element[n].xpath
)
需要告诉引擎如何访问数据所在的页面以及页面上的数据。这与步骤1中的选择不同。在这里指的是将数据带到页面上的东西——比如说有100篇文章,但页面一次只显示30篇。在这种情况下,需要让引擎知道它需要:
要实现这一点,需要让引擎知道如何导航,这涉及到为分页数据识别:
这个谜题的最后一部分是将所有内容整合在一起,这样就可以点选想要抓取的内容,然后定期进行抓取。根据需求,以下是一些有用的工具,可能会帮助:
Quartz .net scheduler是一个非常强大的定时器/调度框架。它被广泛使用,易于实现,并且比滥用无处不在的timer类要好得多。可以实现非常简单的计划,比如“每周二”,“一次,在这个特定时间”,或者使用内置的CRON触发方法来实现相当复杂的计划。
以下是一些示例:
非常强大的功能!
如果用户界面在Web上,这个JQuery插件可能会很有用。它为用户提供了一个简单的界面来生成/选择计划时间,而不需要知道如何使用cron!
最后一步的工作就是简单地执行一个抓取过程,针对存储的模板,在预定的计划时间进行。快速启动并运行基本功能很容易——乐趣开始于需要构建它的时候。敬请期待。
本文介绍了网页抓取的基础知识,应该足以让开始编码了!下一次更新将提供一些可以实施和构建的工作代码。
所以请记住: