一、前言
在爬取房天下小区信息时,发现通过read_html直接打开网址会出现验证码,而通过网页菜单进入则可以正常打开。
为了解决这个问题,想到了用Rselenium来实现。
二、背景
使用Rvest包抓取静态网页非常方便,但如果如果碰上动态网页,Rvest包则无法满足需求,例如:
1. 要抓取的内容非静态网页,而是js、jquery等查询结果;
2. 网站控制了页面的入口,只能从网站内进入,直接通过网址进入则会出现验证码、需登录等提示从而导致无法抓取页面内容;
3. 需要翻页的时候。(部分翻页也可以通过Rvest包实现)
三、准备
1. Java开发环境下载及安装。Selenium Server是一个JAVA程序,需要JAVA的开发环境。
下载地址:https://www.oracle.com/java/technologies/javase-jdk14-downloads.html。
建议安装到默认路径,然后配置环境变量,
方法见:https://jingyan.baidu.com/article/48206aea070004606bd6b31d.html。
2. Selenium Server下载。(不需安装)
下载地址:http://selenium-release.storage.googleapis.com/index.html 。
选择最新版本,本文使用的是 selenium-server-standalone-3.9.1.jar 。
3. Chrome浏览器下载及安装。
下载地址:https://www.google.cn/chrome/ 。
4. ChromeDriver下载。
下载地址:http://npm.taobao.org/mirrors/chromedriver/2.33/ 。
解压后将ChromeDriver.exe(最新版本)放在Chrome的安装路径下,和chrome.exe放在同一个目录下面。
5. 环境变量配置
将chrome.exe所在文件路径(如 C:\Program Files (x86)\Google\Chrome\Application) 添加进环境变量中。
环境变量配置方法见:https://jingyan.baidu.com/article/db55b6099d1e0d4ba30a2fc0.html。
四、使用selenium及rvest抓取数据
本文以抓取房天下小区信息为例。
【重要提醒:本文仅用于单页面技术讲解,切勿大批量抓取或用于商业用途,由此带来的法律风险个人自负】
第一步:启动selenium server
1. 在刚才下载的seleniumn server文件(selenium-server-standalone-3.9.1.jar)所在的文件夹,
Shift+鼠标右键,选择“在此处打开命令窗口”。
2. 在命令窗口中输入java -jar selenium-server-standalone-3.9.1.jar
注意jar包文件名使用自己真实下载的版本。
3. 最小化命令窗口(切勿关闭)。
第二步:在R中引用Rselenium包和Rvest包
install.packages("RSelenium")
library(RSelenium) #这个包用于操作网页,以便于获取js、jquery等数据
install.packages("rvest")
library(rvest)
第三步:连接selenium server、打开浏览器、访问网址、爬取数据
explorer <- RSelenium::remoteDriver(remoteServerAddr = "127.0.0.1" #本地
, port = 4444
, browserName = "chrome")#连接Server
explorer$open() #打开浏览器
explorer$navigate("https://cd.esf.fang.com/") #打开网页
#因为网站控制不能直接打开找小区的页面,所以在上面打开二手房页面后再打开找小区页面即可,不用模拟点击页面
explorer$navigate("https://cd.esf.fang.com/housing/") #打开网页
#获取到对应元素
webElem <- explorer$findElement(using = "class", "houseList")
web<-read_html(webElem$getElementAttribute("outerHTML")[[1]]) #读取打开的网页
nodes<-html_nodes(web,".plotTit") #读取小区名称及链接
xiaoqu_name<-html_text(nodes) #获取小区名称
xiaoqu_url<-html_attr(nodes,"href") #获取小区链接
nodes<-html_nodes(web,".priceAverage") #读取均价
price<-html_text(nodes) #获取均价
price2<-trimws(price,which=c("both","left","right"),whitespace = "[\t\r\n]") #去除均价内容汇总的空格
xiaoqu_list<-data.frame(xiaoqu_name,xiaoqu_url,price2) #构建成数据帧,也就是一张表
setwd("E:/房天下数据爬取") #设置工作目录
write.csv(xiaoqu_list,"xiaoqu_list.csv") #导出爬取到的数据
这样就成功利用RSelenium+rvest爬取到了房天下网站的小区信息。
更多教程在个人网站:www.idata8.com