全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
1553 2
2021-03-12
一般情况下,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.jpg



[注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、结果:

2.jpg



20个规律节点对应的20条名称信息就抓取成功了。同样可用于抓取类似节点的企业注册资金、存续状态、联系方式等相关信息。








二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2021-8-16 18:58:33
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2021-8-17 22:24:47
stevekkk 发表于 2021-3-12 12:04
一般情况下,rvest爬虫在抓取时,先找到节点,然后顺次抓取节点下的所有信息。

在特殊情况下,会出现:一 ...
好的好的好的好的好的好的好的
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群