js 爬虫抓取网页数据(爬虫)
优采云 发布时间: 2021-11-22 20:15js 爬虫抓取网页数据(爬虫)
其实一开始我是拒绝写这个博客的,因为爬虫在爬cnblog博客园。也许编辑看到后会屏蔽我的帐户:)。
言归正传,前端同学可能对爬虫不是很感冒,认为爬虫需要用到后端语言,比如php、python等,当然这是在nodejs之前。随着nodejs的出现,Javascript也可以用来写爬虫了。由于nodejs强大的异步特性,我们可以轻松爬取异步高并发的网站。当然,这里的easy指的是cpu的开销。
要阅读本文,您只需要拥有
这篇文章很长,图片很多,但是如果你能耐心看完这篇文章,你会发现一个简单的爬虫实现起来并不难,从中可以学到很多东西。
本文完整的爬虫代码可以在我的github上下载。主要逻辑代码在server.js中,建议查代码的时候往下看。
在详细讨论爬虫之前,我们先简单了解一下要实现的最终目标。入口是,博客园文章列表页每页有20篇文章文章,最多可以翻到200页。我的爬虫要做的就是异步并发的爬取这4000个文章的具体内容,得到一些我们想要的关键数据。
爬虫进程
看到最后的结果,我们来看看如何通过一个简单的nodejs爬虫一步步的获取我们想要的数据。首先简单普及一下爬虫流程。完成一个爬虫,主要的步骤分为:
抓住
爬虫最重要的一步就是如何检索到想要的页面。并且可以兼顾时间效率,可以同时抓取多个页面。
同时,为了获取目标内容,我们需要分析页面结构。由于ajax的盛行,很多页面内容无法通过一个url来请求。通常,一个页面的内容是在多次请求后异步生成的。所以这就要求我们能够使用抓包工具来分析页面结构。
如果再深入,你会发现你要面对不同的web需求,比如认证、不同的文件格式、编码处理、各种奇怪的URL合规处理、重复爬取问题、cookies跟随问题、多线程等一系列进程爬取、多节点爬取、爬取调度、资源压缩等问题。
所以第一步就是把网页拉回来,慢慢的就会发现各种问题等着你去优化。
贮存
在抓取页面内容的时候,一般不会直接分析,而是通过一定的策略保存。我个人认为更好的结构应该是将分析和爬行分开,并且更松散一些,每个环节都可以相互隔离。链接中可能出现的问题,易于排查或更新发布。
那么如何保存文件系统,SQL或者NOSQL数据库,内存数据库,就是这个环节的重点。
分析
对于网页的文本分析,是提取链接还是提取文本,这取决于您的需求,但您要做的就是分析链接。通常分析和存储会交替进行。您可以使用您认为最快和最好的方法,例如正则表达式。然后将分析结果应用到其他链接。
展示
如果你做了很多事情,根本没有显示输出,如何显示值?
因此,找到一个好的展示元件,展示肌肉也是关键。
如果你写一个爬虫是为了做一个站点,或者你想分析一些东西的数据,不要忘记这个链接,以便更好地向其他人展示结果。
编写爬虫代码 Step.1 页面分析
现在我们一步一步完成我们的爬虫。目标是抓取博客园第1-200页的4000篇文章,获取其中的作者信息,并保存分析。
一共4000个文章,所以首先我们需要拿到这4000个文章的入口,然后异步并发请求4000个文章的内容。但是这4000个文章的入口URL分布在200页。所以我们需要做的第一步就是从这 200 个页面中提取 4000 个 URL。并且通过异步并发,当采集到 4000 个 URL 时,进行下一步。所以现在我们的目标非常明确:
Step2.获取4000个文章入口网址
要得到这么多的URL,首先要从分析单个页面开始,F12打开devtools。很容易发现文章入口链接存放在类titlelnk的标签中,所以4000个URL需要我们轮询200个列表页面,每页保存20个链接。那么如何异步并发从200个页面中采集这4000个URL,继续搜索规则,查看每个页面的列表页面的URL结构:
那么,第1~200页的列表页面的URL应该是这样的:
<p>for(var i=1 ; i