在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
作者:梁凯 R语言中文社区专栏作者 知乎ID:https://www.zhihu.com/people/liang-kai-77-98 前言 众所周知巧妇难为无米之炊,数据科学也一样,没有数据所有算法模型都是一个摆设,所以这篇就是手把手教大家怎样从网络上自动收取数据(老司机都知道叫网络爬虫)。因为各种原因,如果在做分析的时候完全依赖问卷和访问数据(除开实验室里的实验数据),有时会感到数据十分匮乏,特别在互联网是一个庞大的社交网络的今天,各种数据在互联网上等待被人收集,如果手动收集将会是一个很复杂,繁杂又浪费时间的工作,并且容易出现手动录入的人为误差。那么怎么解决这个问题?最有效的办法就是设计一个网络爬虫(网络机器人)以高效率的方式帮助我们自动收集网络数据。今天为大家带来的就是一个简单但实用的例子,用R语言编写网络爬虫爬取甘孜州新闻。希望通过这个例子能够让大家了解,网络爬虫的魅力和智能化收集数据的便利性。 用任何做爬虫必须要了解的就是网页语法,网页语言无非就是HTML,XML,JSON等,因为正是通过这些我们才能在网页中提取数据,过多的就不再描述,大家可以自行参考大量的资料,大多数语法都是树形结构,所以只要理解了,找到需要数据的位置并不是很难。动态网页的爬取要用到另外的方法,此处暂且不表。 二、R语言网络爬虫三大包 用R语言制作爬虫无非就是三个主要的包。XML,RCurl,rvest,这三个包都有不同的主要函数,是R语言最牛的网络爬虫包,关于rvest是大神Hadley Wickham开发的网络爬虫新利器,在此按照业内惯例,给大神送上单膝。rvest正在研究中,在本例中将会只涉及XML,RCurl,两个包。 网络提取策略的选择是经过你把大量的网络编码解析存储在R或者本地文件夹中,通过对繁杂的网络代码查找筛选而得到想要的数据的必要策略,现今爬虫的世界,最主要的提取策略有三个。正则表达式,XPATH,和API。这三个策略各有优劣。 正则表达式 优点: 1.相比于其他策略在网页结构不正确情况下依然能用 2.在DOM解析失效的情况下能用 3.适用于各种格式的字符识别 4.处理文档较多的时候最快最方便 缺点: 1. 不能保持采集后数据原有的结构。 2. 复杂难以掌握,具有挑战性 3. 无法处理异构化的数据,当所提取的数据没有共同点时候就会显得尴尬 XPATH 优点: 1. 灵活,方便,易于编写 2. 基于文字内容搜索而不是像正则表达式基于上下文结构便于查找 3. 能够处理异构化网页 缺点: 1.当解析网页无效时,XPATH则无法使用 2.对动态网页,多样化网页提取难度大 API 优点: 1. 难度最低,几乎不用任何技术手段 2. 抓取的数据最可靠,最整洁有效 3. 数据来源透明,有效,能进行有效的数据更新 缺点: 1.使用十分有限,权限较高 2.严重依赖数据提供者和API,技术含量低 首先需要说明的是本例子中只是一个例子,为什么选取新闻,是因为新闻是文本数据爬取的难度比表格难度大,表格可以直接用readHTMLTable读取,而且本例子中全部选用正则表达式提取数据策略,意在为大家进行深动的教学,而并非是仅仅的一个例子。其次爬取的新闻是对外公布新闻,人畜无害。 1 对象选取 本例子中选取甘孜州政府外网中国甘孜(http://www.gzz.gov.cn/),里面的新闻为例子 进入网址点击甘孜新闻 观察页面我们可以看见共142页,每页有20条新闻,我们随便打开一个,右键点击查看网页源代码 我们很容易发现这是用javascript写的网站。 而我们需要的新闻内容在源代码的下方也就是如上图所示,鉴于网页复杂,本人又喜欢正则表达式所以用正则表达式来提取信息。 2 打开R开始进行编写爬虫任务 首先必须安装几个包然后再读取
然后分析开始,首先观察我们的基本网站网址url为gzz.gov.cn/,然后打开新闻链接 红色部分就是我们新闻链接的url网址,上图是首页让我们看看第二页和最后一页网站url是什么?第二页的网址为:gzz.gov.cn/10000/10276/ 最后一页的网址为:gzz.gov.cn/10000/10276/ 发现规律没? 手也不算从第二页开始我们就可以看出网址的变化规律为 http://www.gzz.gov.cn/10000/10276/10288/index从1到141.shtml这让我们能够很清晰的构建正则表达式。 接下来我们随便从一页中打开一个新闻, 我们可以观察他的网址url为 gzz.gov.cn/10000/10276/ 这也可以看作基本网站 http://www.gzz.gov.cn/ 加上 10000/10276/10288/2017/03/24/10564577.shtml的组合。 从上面的分析中我们就不难得到正则表达式了。
具体代码如下:
让我们来看看代码运行的效果我们随便,打开一个来看看 所以我们可以写出代码:
运行代码我们可以得到(查看最后3页的链接) 在这里我们可以看见最后一页的链接为NA,这是怎么回事呢?嘿嘿,先不要急,说好了这是教育贴,没有轻易让你得到正确答案。
于是我们修改我们的代码:
我们再来运行代码试试,得到: 为保险我们再来检查看看他有没有NA
可以看出现在已经没有NA这个元素,我们可以放心接着下一步了。 在此之前我们先把上面的代码写成一个函数
我们现在已经得到了所有新闻的链接url,接下来我们就要对每一条链接用readLines函数进行处理,在R中显示源代码。
WTF!!!???试了几次都是这个样,难道是反爬虫程序?不急,理论上所有网页都可以爬取,我们换一种方法,把每个URL都下载下来再解析
又遇到解析失败,到底什么原因呢?我们查看下文件 下到文件236就断了,我们检查下文件236的url,然后看看怎么回事? 我们可以看到我们打开的链接并不等于我们所知道的链接,试着打开页面 我们可以知道原来是云直播搞的鬼,这个无法解析是因为网站不是做的而是由转载的。所有这类的网页地址末尾都不是以shtml结尾,所以我们写一个正则表达式来判断哪些是不合格的url:
上面的grepl("\\.shtml$", entirelinksnew)代码就是找出所有结尾为shtml的url。而别的就可以省略了。 我们可以看出去掉了6条结尾不是shtml1的url,然后我们再来尝试运行代码
全部评论
|
请发表评论