爬虫就是批量自动将网页的内容抓取下来。用任何语言做爬虫必须要了解的就是网页语法,网页语言无非就是HTML,XML,JSON等,因为正是通过这些我们才能在网页中提取数据,过多的就不再描述,大家可以自行参考大量的资料,大多数语法都是树形结构,所以只要理解了,找到需要数据的位置并不是很难。
用R语言制作爬虫无非就是三个主要的包。XML,RCurl,rvest,这三个包都有不同的主要函数,是R语言最牛的网络爬虫包。
了解html
HTML框架简单说就是任何HTML网页文件中都会包含的基本代码内容。如果我们打算写一个页面,就一定要把框架代码写入后才能正式开始添加内容。框架代码如下:
<!DOCTYPE HTML><html> <head> </head> <body> </body> </html>
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
</body>
</html>
这七行代码是所有HTML页面所共有的,也就是HTML的框架了。可以发现也是很有规律的,比如<head>
是开头,</head>
是结尾,成对出现。
rvest 介绍及使用
官网连接如下
https://github.com/tidyverse/rvest
对于rvest的使用,主要掌握read_html、html_nodes、html_attr、html_text几个函数。
read_html函数获取获取网页信息;
html_nodes获取网页节点信息;
html_attr函数获取特定节点的属性值。
html_text():获取指定名称的网页元素、节点文本;
rvest是R语言一个用来做网页数据抓取的包,包的介绍就是“更容易地收割(抓取)网页”。其中html_nodes()函数查找标签的功能非常好用。
相关的函数:
read_html():读取html文档;
html_nodes():获取指定名称的网页元素、节点;
html_text():获取指定名称的网页元素、节点文本;
html_attrs(): 提取所有属性名称及内容;
html_attr(): 提取指定属性名称及内容;
html_tag():提取标签名称;
html_table():解析网页数据表的数据到R的数据框中;
html_session():利用cookie实现模拟登陆;
guess_encoding():返回文档的详细编码;
repair_encoding():用来修复html文档读入后乱码的问题。
html_session()用来在浏览器中模拟会话
jump_to()用来接收一个url用来连接的跳转
follow_link()用来接收一个表达式(例如a标签)进行连接的跳转
back()用来模拟浏览器后退按钮
forward()用来模拟浏览器前进按钮
submit_form()用来提交表单
str_trim() 删除字符串2端的空格,转义字符也能删掉。
例子
以爬取链家房的名称 https://hz.lianjia.com/ershoufang/pg/ 为例。
**目标:**我们想要爬取房名。
步骤:
鼠标右键==》审查元素(或者检查),可以看到这些信息所位于的网页标签。
一步一步解析我们要爬取的内容的位置,因为是树结构,直接看。
内容位于title里面。class="title"表示网页元素div的类为title,用“.”表示类.title a
(如果遇到< div id=“idName”>就需要用#,即:#idName)
可以理解为class名为title下的a标签,直接定位到房名。
# 完整代码
lianjia <- read_html("https://hz.lianjia.com/ershoufang/pg/",encoding = "UTF-8")
# 获得节点信息 : CSS 或者 xml 方式
# https://www.w3school.com.cn/cssref/css_selectors.asp
# https://www.w3school.com.cn/xpath/xpath_syntax.asp
pinfen <- lianjia %>% html_nodes('.title a')%>%
html_text()
pinfen
pinfen <- lianjia %>% html_nodes('.sellListContent .title a')%>%
html_text()
pinfen
# 问题:为什么两个 pinfen内容差一个呢?答案如下图。
答案:因为如果上层只定义title的话,可能匹配到另外的类,所以为了增加准确性可以再加一个上层类sellListContent。
这次的例子是爬取了1页的房名,如果想爬取30页的呢?我们查看网址信息:
https://hz.lianjia.com/ershoufang/pg2/
https://hz.lianjia.com/ershoufang/pg3/
https://hz.lianjia.com/ershoufang/pg4/
https://hz.lianjia.com/ershoufang/pg30/https://hz.lianjia.com/ershoufang/pgxxx/
所以,如上,我们只需要写个循环就可以获得所有页的房名信息。
**注意:**我们这里教程是爬取静态网页的信息,如果是动态网页的话,就需要其它包来爬取,敬请期待~
【末尾福利】
这里强烈推荐一个插件:SelectorGadget
https://huajiakeji.com/web-development/2019-08/957.html
相信爬虫的爱好者们都经历过这样一个爬虫前期的准备过程,那就是用浏览器的审查元素进行爬取目标的定位。每次我们都要浪费部分时间去寻找定位点和xpath,这样既不很方便,也不高效,那么如何提高爬虫中这部分工作的效率呢?它就是:SelectorGadget 插件