R语言网络爬虫:获取近7000种中草药信息
网络爬虫参考以前的,但是这次对象不一样,为了获取中草药信息,如别名、基源、功效、生境分布、用法用量等。
爬取对象网址
http://www.pharmnet.com.cn/tcm/knowledge/detail/106330.html
查看网址是否允许爬虫:网址后加robots.txt:
http://www.pharmnet.com.cn/robots.txt
结果:
User-Agent:*
Allow:/
01
—
调用包
rm(list=ls())
library(data.table)
library(openxlsx)
library(stringr)
library(stringi)
library(VennDiagram)
library(RCurl)
library(stringr)
library(XML)
library(downloader)
library("dplyr")
library("rvest")
原始资料准备:文件名ID.txt,需要获取的每个中草药ID
#准备文件名为“ID.txt”的文件,文件仅有一列,第一行为“ID”
#读取文件
ZYID <- fread("ID.txt",header = T,stringsAsFactors = F)
ZYID<-ZYID[c("ID")]
开始循环获取资料
#开始循环爬取
for(i in 1:nrow(ZYID)){
#数据清洗,is.na为判别函数,判断是否为空值:
if(is.na(ZYID [i,ID])){
print(paste("处理第",i,"个代号时发现,ID为:",ZYID [i,ID],",已经跳过"))#代号为空时打印:处理第i个代号时发现ID为:ZYID [i,ID]已经跳过
next
} else {
print(paste("开始处理第",i,"个草药,ID为:",ZYID [i,ID]))#开始处理第i个草药,ID为:ZYID [i,CID]
}
#下载网页文件
file <- paste("./",ZYID [i,ID],".html",sep="")#设置html文件下载地址
a<-ZYID [i,ID]
url <- paste("http://www.pharmnet.com.cn/tcm/knowledge/detail/",a,".html",sep="")#设置网址
#以下5行代码是用于下载html文件,若需要下载可去掉开头的井号符
#JudgeHtml<-try(download.file(url, destfile = file, quiet = TRUE),silent=TRUE)#判断下载链接是否可行
#ifelse(JudgeHtml==0,'download.file(url, destfile = file, quiet = TRUE)','F')#如果下载链接可行,就下载,否者退出
#ifelse(JudgeHtml==0,Html<- 1,Html<- 0)#如果下载链接可行,Html等于1,否则Html为0
#cat(ifelse(file.exists(file),"Html文件下载成功!","Html文件下载失败!"))
#ZYID [i,"Html"] <- Html
# 读取网页源码(read_html())
web <- url %>%read_html(encoding = "GBK") # 有时候其他网站是UTF-8是编码方式
Title <- web %>% html_node("h1") %>% html_text()#
Detail <- web %>% html_node("#fontsize") %>% html_text()#
ZYID [i,"Title"] <- Title
ZYID [i,"Detail"] <- Detail
}
write.csv(ZYID,file="./ZYID.csv")#导出数据
02
—
结果
3500个大概花费20min
完整代码
#以下安装包不能调用的需要手动安装:install.packages("")
rm(list=ls())#清除所有变量
library(data.table)
library(openxlsx)
library(stringr)
library(stringi)
library(VennDiagram)
library(RCurl)
library(stringr)
library(XML)
library(downloader)
library("dplyr") # 管道操作符所属的包
library("rvest") # 本次爬取网页数据的工具在这里
#准备文件名为“ID.txt”的文件,文件仅有一列,第一行为“ID”
#读取文件
ZYID <- fread("ID.txt",header = T,stringsAsFactors = F)
ZYID<-ZYID[c("ID")]
#开始循环爬取
for(i in 1:nrow(ZYID)){
#数据清洗,is.na为判别函数,判断是否为空值:
if(is.na(ZYID [i,ID])){
print(paste("处理第",i,"个代号时发现,ID为:",ZYID [i,ID],",已经跳过"))#代号为空时打印:处理第i个代号时发现ID为:ZYID [i,ID]已经跳过
next
} else {
print(paste("开始处理第",i,"个草药,ID为:",ZYID [i,ID]))#开始处理第i个草药,ID为:ZYID [i,CID]
}
#下载网页文件
file <- paste("./",ZYID [i,ID],".html",sep="")#设置html文件下载地址
a<-ZYID [i,ID]
url <- paste("http://www.pharmnet.com.cn/tcm/knowledge/detail/",a,".html",sep="")#设置网址
#以下5行代码是用于下载html文件,若需要下载可去掉开头的井号符
#JudgeHtml<-try(download.file(url, destfile = file, quiet = TRUE),silent=TRUE)#判断下载链接是否可行
#ifelse(JudgeHtml==0,'download.file(url, destfile = file, quiet = TRUE)','F')#如果下载链接可行,就下载,否者退出
#ifelse(JudgeHtml==0,Html<- 1,Html<- 0)#如果下载链接可行,Html等于1,否则Html为0
#cat(ifelse(file.exists(file),"Html文件下载成功!","Html文件下载失败!"))
#ZYID [i,"Html"] <- Html
# 读取网页源码(read_html())
web <- url %>%read_html(encoding = "GBK") # 有时候其他网站是UTF-8是编码方式
Title <- web %>% html_node("h1") %>% html_text()#
Detail <- web %>% html_node("#fontsize") %>% html_text()#
ZYID [i,"Title"] <- Title
ZYID [i,"Detail"] <- Detail
}
write.csv(ZYID,file="./ZYID.csv")#导出数据
03
—
结果文件
结果内容都在一个单元格内,再利用EXCEL提取出相应的内容即可。
共获取6800条信息,不重复的有6300条。
想要文件可以联系我