最近在尝试用R写简单的网络爬虫,顺手分享一下代码和学习笔记。适合新手阅读。
关于编程
非程序猿出身的同学们可能会对打代码这件事情抱有天然的敬畏感,什么JSON、Ajax、CDN、React Native之类层出不穷的术语,一听到就很头疼。虽然程序猿的世界水很深,但是成为一个入门级选手也并没有我们想的那么难。
Just Do It,我觉得这是个很好的法则。找一个感兴趣的项目,动手开干,当你解决了所有技术问题和知识盲区终于完成项目后,就已经进步很多了。
前期准备
网络爬虫是一个很有意思的技术,如果会写个简单的爬虫,就可以用来爬取网页上的数据,自己可以做做简单的分析,获取一些新的知识。用R或者用Python都可以写,据说Python的能力更强大一些。但是由于我只学过R没学过Python,所以还是先从R入手。
开始码代码之前,首先为自己选择一个感兴趣的课题。我选择的是IT桔子上的互联网公司融资记录,大概是下图这个样子的。这个网站并不要求登录后才能查看,没有其他的鉴权机制,数据可以直接爬下来,难度不高。因为每页只显示10条数据,所以我们需要用一个循环爬取多页的数据。
我们的目标是把这些数据以结构化的方式存储下来,并将数据导出到Excel表格中。
代码分析
首先上代码:
1、安装程序包
Rvest是用R做网络爬虫时最常用的程序包之一,另一个常用的程序包是RCurl。第三部分的几个关键函数read_html、html_nodes和html_text都是Rvest程序包中的函数。
安装xlsx程序包是为了最终将获取到的数据输出到excel中,如果没有这个需求也可以不安装这个包。第四部分的函数write.csv就是xlsx中的函数。
2、定义变量
我把CSS选择器的定义放在了这个阶段,因为虽然需要爬取几个不同的页面,但是页面结构都是一样的,所以几个页面都使用一样的CSS Selector。CSS选择器要怎么写可以参考这篇文章。如果不太懂的话,有一个很简单的方法:
如果你用的是Chrome浏览器,鼠标移到你关注的元素上,右键-检查,就可以打开开发者工具并且自动定位到你刚刚选的元素上。确认你要的信息在哪个元素中之后,选中-右键-Copy-Copy selector,就可以复制下来对应元素的CSS选择器。
这一部分的最后两行代码是用来定义存储数据的矩阵com的。这里需要先定义矩阵的大小,否则在后面的循环中会报错。为了便于识别信息,顺便定义了矩阵的列名。
3、开始循环,爬取内容
观察IT桔子的融资事件列表页面,几个页面的url结构基本是一致的,所以根据这个规律我们可以定义每一个页面的url字符串。
read_html函数将url中的信息读取到read变量中。html_nodes读取了我们选择的CSS选择器对应的元素的内容,而html_text()函数表示只读取其中的文本信息。这样子我们就把网页中的主要信息读取到变量info中了。
得到的info是下面这样的一个混乱的字符串,有很多我们不需要的\n\t。
这里主要通过gsub和strplit两个函数实现字符串的替换和分割,看起来似乎比较复杂,但是对不同情况的字符串会有不同的处理方法,所以这里不细讲。可以通过在R中键入help(gsub)和help(strsplit)来查看函数的具体使用方式。经过整理后的数据是这样的:
接下来通过一个嵌套循环将整理好的数据写入com中。写入数据后的com是这样的:
4、输出到csv文件
使用一个简单的函数write.csv就可以把com变量写入到指定的文件中了。最终输出的表格是这样的:
后记
对于大多数网站来说写个爬虫把数据爬取下来并不难,但是有些网站需要登录,有些网站有反爬虫机制,就需要花费更多功夫跟这些网站斗智斗勇。
R同时也可以做数据分析,以及输出非常漂亮的可视化图表。所以我们把数据整理到excel表格中并不是终点,用R还可以做很多其他尝试。