c#抓取网页数据(基于C#.NET的高端智能化网络爬虫2本篇故事的起因)
优采云 发布时间: 2021-12-07 23:30c#抓取网页数据(基于C#.NET的高端智能化网络爬虫2本篇故事的起因)
【转】基于C#.NET 2的高端智能网络爬虫
这个故事的原因是携程网的一名技术经理。他说他会用自己超高的智商完美碾压爬虫开发者。作为一个业余爬虫开发爱好者,我当然不能发表这样的言论。忽略它。于是,最后一个基础爬虫和这个进阶爬虫开发教程就诞生了。
有人在我上一篇文章中评论了简单爬虫:代码太简单了,太弱了。真是被这群有教养的孩子给震撼到了!我得猜你是不是携程的托儿。为什么在我写完之前就知道你很弱?好像不期待一点点的凶猛,是不会满足的!
今天我们将学习高级爬虫的开发。同时,我们将使用简单的爬虫程序来实现分布式爬虫的Links Master部分,以提高分布式爬虫的效率。
下面我们要讲的内容涉及到很多开源软件。不要太紧张,通常封装的越高级的东西就越好,只要你放轻松,综合使用,我首先假设你对以下工具有一定的了解:
一、什么是高级爬虫?
我们讲了很久的高级爬虫,通常是指它具有浏览器的运行特性,需要第三方库或工具的支持,比如以下常见的东西:
很多人认为分布式爬虫可以算是高级爬虫。这绝对是错误的理解。分布式只是我们实现爬虫架构的一种手段,而不是定义它的高级因素。
我们称它们为高级爬虫组件主要是因为它们不仅可以直接爬取网页源代码,还可以渲染网站页面的HTML、CSS、Javascript等内容。
这样的功能对于爬虫的开发有什么好处呢?说到这个好处,就有点谦虚了,毫不夸张的说:这东西可以称得上是“攀登无敌”!!!
我猜你还有这个表达式,因为它强大的机制,它可以让我们执行Javascript代码,触发各种鼠标和键盘事件,操纵页面的Dom结构,使用XPath语法抓取数据,几乎直接在网站 页面。做你可以在浏览器上做的一切。
很多网站使用Ajax动态加载和翻页,比如携程的评论数据。如果之前使用简单的爬虫,很难直接抓取所有的评论数据。我们需要分析满天的Javascript代码才能找到API数据接口,时刻提防对方添加数据陷阱或者修改API接口。
如果使用高级爬虫,完全可以忽略这些问题。无论他们如何加密Javascript代码隐藏API接口,最终的数据都必须呈现在网站页面的Dom结构中,否则普通用户是看不到的。到达。所以我们可以直接从Dom中提取数据,完全不用分析API数据接口,甚至不用写复杂的正则表达式。
二、高级爬虫如何开发?
现在我们要一步一步地实现这个高级爬虫。接下来,我们将利用目前正在蓬勃发展的两个组件来完成一个具有基本功能的高级爬虫。首先,我们将下载开源组件:
PhantomJS:可以算是一个没有UI界面的浏览器。主要用于实现页面自动测试。我们使用它的页面解析功能进行网站内容爬取。下载解压后,将bin文件夹下的phantomjs.exe文件复制到你的爬虫项目下的任意文件夹中,我们只需要这个。
下载链接:
Selenium:是一个自动化的测试工具,封装了很多WebDriver与浏览器内核进行通信。我用开发语言调用它来实现PhantomJS的自动化操作。它的下载页面有很多东西,我们只需要Selenium Client,它支持多种语言(C#、JAVA、Ruby、Python、NodeJS),用你学习的语言下载即可。
下载链接:
这里我下载了C#语言客户端,将这4个DLL文件添加到项目引用中。其他语言的开发者请自行寻找方法,然后开始我们的编码之旅。
老规矩,打开Visual Studio 2015新建一个控制台应用,添加一个简单的StrongCrawler类,因为这两个爬虫类有一个共同的部分,符合DRY的原则,需要重构部分代码,我们先提取一个 ICrawler 接口:
然后我们使用StrongCrawler类来实现这个接口:
然后我们编写它的异步爬虫方法:
好了,这个高级爬虫的基本功能就定义好了。我们以携程的酒店数据为例进行爬取。让我们测试一下爬取(酒店名称、地址、评级、价格、评论数量、当前评论页数和评论旁边)。尝试使用详细数据,例如一个页码、评论页总数、每页评论数)。我们现在使用控制台程序来调用它:
从上图可以看出,等待酒店页面加载后,我们通过XPath语法搜索页面元素,首先点击页面上的“酒店评论”按钮,然后等待页面的Dom结构更改,即等待Ajax加载成功,然后抓取需要的数据。看一下代码的执行结果:
我们轻松地在酒店的第一页上抓取了酒店信息和所有评论数据。由于携程网的评论数据是通过ajax进行分页的,为了抓取所有评论,还抓取了评论页码等数据。我们来看看执行性能:
不错,484 毫秒。可以说,在所有高级爬虫组件中,PhantomJS 的效率应该是最高的,几乎没有其他组件可以直接与之抗衡。有了页码数据,我们就可以对评论进行翻页抓取操作。在这个速度下,爬取数百页的评论数据不需要分发。
三、如何实现分布式?
分布式爬虫通常使用消息队列来实现。目前,网上有很多开源的消息队列。今天我们将介绍一个非常流行的分布式消息队列开源组件:
RabbitMQ 是一个开源的 AMQP 实现。服务器采用Erlang语言编写,支持.NET、Python、Ruby、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等多种客户端,并支持AJAX。它用于在分布式系统中存储和转发消息,在易用性、可扩展性和高可用性方面表现非常出色。
下载链接:
分布式爬虫通常需要两端:
控制端主要负责控制爬虫运行、监控爬虫状态、配置爬虫抓取方式等,爬虫主机的作用是抓取数据,并将数据提交给数据清洗服务。
爬虫端也需要分离Master爬虫和Worker爬虫。Master爬虫主要采用简单的爬虫操作方式来实现高性能的超链接。Worker 爬虫使用高级爬虫特性来采集 细化数据,例如 Ajax 加载的内容。给最合适的爬虫做你最擅长的事。
聪明的你应该已经想到了它们之间的通信方式是消息队列。Master爬虫只需要把抓到的Links扔进数据抓包队列。Worker爬虫通过周期性的拉取队列中的Links来实现数据抓取,抓取完成后将数据提交到数据清洗队列。
原理应该很清楚了吧?然后自己实现代码。RabbitMQ官网上有示例代码,这里不再赘述。
四、如何实现一个稳定的加密代理?
在这个互联网时代,免费的东西基本都在消失,即使存在也绝对是垃圾。所以今天要讲的*敏*感*词*也是需要小费的东西。这东西的厉害之处在于,它的流量特征并不明显,而且可以提供非常稳定的上网代理。
下载链接:
*敏*感*词*客户端会在本地启动一个socks5代理,通过这个代理的网络访问请求从客户端发送到服务器,服务器发送请求,然后将响应数据发送回客户端。中间使用AES-256加密传输数据,所以普通代理服务器肯定安全很多。我们来看看它的运行模式:
如图所示,需要在本地运行客户端程序,并连接到远程代理服务器的服务端程序,实现加密通信。然后在本地模拟代理端口,让本地流量由本地客户端加密,然后传输到远程服务器,完成代理转发服务。
因此,我们只需要购买一台基于Linux的VPS服务器,费用大约15元/月,安装服务器后,可以实现非常稳定的加密代理服务。网上有很多相关的教材,这里就不啰嗦了。
五、结论
由于一些压力,我不会在这里发布详细的爬虫源代码。看上面的例子,我绝对可以自己完成一个更强大的高级爬虫。完整源代码下载: