一般情况下,rvest爬虫在抓取时,先找到节点,然后顺次抓取节点下的所有信息。
在特殊情况下,会出现:一条信息对应一个节点,而这些节点名又是成规律出现的。例如:
信息01 对应节点名:#search_company_0 > div > div.content > div.header > a
信息02 对应节点名:#search_company_1 > div > div.content > div.header > a
信息03 对应节点名:#search_company_2 > div > div.content > div.header > a
......
信息20 对应节点名:#search_company_19 > div > div.content > div.header > a
此时,设定好一个节点,只能抓取一条信息。
那么如何批量抓取这类节点信息?
思路:
1、根据文件名特点,构建文件名变量
2、用for循环依次执行抓取不同文件名下的节点内容
3、输出结果
实践:
1、文件名构建
文件名变化的只有数字部分,因此将整个节点作为一个文件名看待[注1],用paste0函数表示为:
filenames<-paste0("#search_company_",0:19," > div > div.content > div.header > a")
结果为:
[注1] :此处有个细节,就是构建好的文件名,都是自带“”符号的,在节点填写时,不能再加“”符号,否则输出时总会出现“character(0)”的提示。因此,要将整个节点名作为一个名字看待,而不能只设定有变量的部分,即("#search_company_",0:19),由于符号原因会造成错误。
2、构建for循环:
library(rvest)
web=read_html("https://www.tianyancha.com/search?key=%E9%87%91%E7%89%9B%E8%A7%92%E7%8E%8B")
filenames<-paste0("#search_company_",0:19," > div > div.content > div.header > a")
for(i in filenames)
{
name=web%>%html_nodes(i)%>%html_text()
print(name)
}
此处用print(name)包含在循环内,输出每次抓取的name信息。如果去掉print循环输出,只能获得最后一个name抓取的信息(当然,此处也可以构建一个name变量名,分别对应每个节点变量名,然后把每次抓取的信息保存在数据框里,暂略)。
3、结果:
20个规律节点对应的20条名称信息就抓取成功了。同样可用于抓取类似节点的企业注册资金、存续状态、联系方式等相关信息。