vlambda博客
学习文章列表

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


调用包

#以下安装包不能调用的需要手动安装: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


R语言网络爬虫:获取近7000种中草药信息


#准备文件名为“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"] <- TitleZYID [i,"Detail"] <- Detail}write.csv(ZYID,file="./ZYID.csv")#导出数据


02


结果


R语言网络爬虫:获取近7000种中草药信息

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"] <- TitleZYID [i,"Detail"] <- Detail}write.csv(ZYID,file="./ZYID.csv")#导出数据


03


结果文件


结果内容都在一个单元格内,再利用EXCEL提取出相应的内容即可。

共获取6800条信息,不重复的有6300条。


想要文件可以联系我