简单的网页抓取功能的实现实例的Node.js
今天,网络爬虫是一个明显的任何技术,但仍有许多复杂的、简单的网络爬虫很难做Ajax培训、XMLHttpRequest、WebSockets、插座和Flash开发的各种复杂的技术和现代的网站。让我们在Hubdoc的项目基本需求为例。在这个项目中,我们抢单的金额、到期日期、帐号和最重要的:从银行最近的账单PDF,公用事业和信用卡公司的网站。对于这个项目,我开始用一个很简单的计划(不使用我们目前正在评估昂贵的商业产品)--我曾经在Perl messagelab /赛门铁克做简单的爬虫项目。但结果是非常糟糕的,并由垃圾邮件发送者的网站比银行的网站更简单,公共服务的公司。
那么如何解决这个问题呢我们主要是从Mikea开发的优秀要求图书馆开始。请求在浏览器中看到的请求标头发送在网络窗口,然后复制请求标头插入代码。这个过程是非常简单的。只是跟踪过程从着陆登陆下载PDF文件的结束,然后模拟过程所有的要求。为了让类似的事情更容易,并允许开发人员编写更合理的网络爬虫,我采取了从HTML到出口侧jQuery(轻量级再见图书馆),这使得类似的工作更容易,选择器选择网页元素被使用CSS简单。整个过程封装成一个框架,而框架能还做了额外的工作,如拿起证书从数据库加载个人机器人,并通过socket.io UI沟通。
这对于一些网站是有效的,但它只是一个JS脚本,而不是我的Node.js,这些公司把他们的网站上的代码。他们是分层对遗产的复杂性,使得它很难找出如何得到信息点要登录一些网站我。试了几天,结合图书馆的要求(),但它仍然是徒劳的。
在几近崩溃,我发现节点PhantomJS,图书馆我可以控制PhantomJS无头的WebKit浏览器从节点(译者注:我没有想到这个词,对应的无头在这里是指在背景,使页面不显示设备),它看起来像一个简单的解决方案,但也有一些PhantomJS需要解决的问题:
1.phantomjs只能告诉你页面完成加载,但你无法确定是否有一个重定向(重定向)通过Javascript或Meta标签的过程中,尤其是当Javascript使用setTimeout()的调用延迟。
2.phantomjs提供启动页面加载你(pageloadstarted)挂钩,可以解决上述问题,但这种功能只有在你确定页数的负荷,减少每一页上的号码被加载,并可以提供超时间(因为这种事不会发生),当你降低0的号码,你可以打电话给你的回调函数,它可以以这种方式工作,但它总是让人感觉有点像黑客。
3.phantomjs需要为每个页面的完整和独立的过程,因为如果不这样做,饼干不能从每个页面分开。如果你使用的是相同的PhantomJS过程,页面中的会话已登录将被发送到另一个网页。
4。不能使用PhantomJS下载资源只能网页保存为PNG或PDF格式。这是有用的,但这意味着我们需要将请求()下载PDF。
5。基于以上原因,我必须找到一个方法来分发cookie PhantomJS会话请求的会话库()。只需要发布文件。cookie的字符串,解析它,然后注入到请求的饼干罐()。
6。在浏览器会话中注入变量并不容易。要做到这一点,我需要创建一个字符串来构建Javascript函数。
复制代码代码如下所示:
robot.prototype.add_page_data =功能(页面、名称、数据){
Page.evaluate(
函数(){ var+姓名+=窗口。+姓名+=+ json.stringify(数据)+}
);
}
7。网站总是充满代码像console.log(),他们需要重新定义和出口,我们希望他们能够。要做到这一点,我这样做:
复制代码代码如下所示:
如果(!控制台(日志){
VaR IFRAME = document.createelement(iframe);
document.body.appendchild(iframe);
控制台=框架{ 0 }控制台;
}
8。网站总是充满代码像console.log(),他们需要重新定义和出口,我们希望他们能够。要做到这一点,我这样做:
复制代码代码如下所示:
如果(!控制台(日志){
VaR IFRAME = document.createelement(iframe);
document.body.appendchild(iframe);
控制台=框架{ 0 }控制台;
}
9。告诉浏览器我点击标签也是一件非常困难的事情。为了做这些事情,我添加了以下代码:
复制代码代码如下所示:
无功clickelement = window.clickelement =功能(ID){
创建一个document.getelementbyid(ID);
var = document.createevent(鼠标事件来);
e.initmouseevent(单击
A.dispatchEvent(E);
};
10。我还需要限制浏览器会话的最大并发性,这保证了我们不会破坏服务器。在这种情况下,这个限制要比昂贵的业务解决方案所提供的要高得多。
所有的工作后,我有一个更体面的PhantomJS +要求履带式的解决方案。你必须使用PhantomJS之前您可以返回到请求()的要求,将使用在PhantomJS设置验证登录会话cookie。这是一个巨大的胜利,因为我们可以使用请求的流量()下载PDF文件。
整个计划是让Web开发人员比较容易理解如何使用jQuery和CSS选择器创建不同网站的爬虫。我还没有成功地证明这一想法是可行的,但我相信它很快就会发生。