使用Rvest或Selenium在R中爬取网站链接遇问题
批量爬取并点击网站链接问题解决
一、rvest爬PHP页面出现404的原因
不是.php后缀的问题,是你写URL的方式错了——data_url <- website.php这种写法没有把URL当成字符串,R会把它当成变量解析,自然找不到资源。另外如果目标页面是动态渲染的(比如用JS加载内容),rvest只能爬静态HTML,这种情况得用RSelenium。
正确的静态页面爬取写法:
library(rvest) # 必须是完整的字符串格式URL data_url <- "https://你的目标域名/website.php" page <- read_html(data_url) # 直接抓取所有a标签的href属性 links <- page %>% html_elements("a") %>% html_attr("href") # 过滤掉空的href links <- links[!is.na(links)]
二、RSelenium正确获取链接并循环点击
你之前选的是li元素,当然只能拿到文本,要直接选li下面的a标签,就能获取href或者直接点击元素。
方法1:直接遍历元素点击(推荐)
不用存链接,直接拿到所有目标a标签元素,循环点击,操作完返回上一页:
# 定位所有目标a标签 link_elements <- remDr$findElements(using = "css selector", value = '#maincontent > div.pad-helper > ul > li > a') # 逐个点击 for (elem in link_elements) { elem$clickElement() # 这里写你要执行的代码,比如爬取当前页面数据 # 操作完成后返回列表页 remDr$goBack() # 加个等待,避免页面没加载完就操作 Sys.sleep(2) }
方法2:先存href列表,再逐个跳转
如果需要保存链接,用getElementAttribute获取href:
link_hrefs <- c() for (elem in link_elements) { # 获取href属性,[[1]]是取出列表里的字符串 href <- elem$getElementAttribute("href")[[1]] link_hrefs <- append(link_hrefs, href) } # 循环打开每个链接 for (url in link_hrefs) { remDr$navigate(url) # 执行你的代码 Sys.sleep(2) }
三、动态拼接CSS选择器解决序号变化问题
你之前的循环变量写在字符串里没生效,得用字符串拼接把变量插进去。另外因为每个ul下的li数量不一样,不要硬写序号,先遍历所有ul,再遍历每个ul下的li。
方法1:通过子元素遍历(更可靠)
先拿到所有ul元素,再逐个取里面的a标签:
# 获取所有目标ul ul_elements <- remDr$findElements(using = "css selector", value = '#maincontent > div.pad-helper > ul') # 遍历每个ul for (ul in ul_elements) { # 获取当前ul下的所有a标签 li_a_elements <- ul$findChildElements(using = "css selector", value = "li > a") # 逐个点击 for (a_elem in li_a_elements) { a_elem$clickElement() # 执行操作 remDr$goBack() Sys.sleep(2) } }
方法2:动态拼接CSS选择器(适合必须用序号的场景)
用glue包或者paste0把变量拼进选择器字符串:
library(glue) # 先拿到ul的总数 ul_count <- length(remDr$findElements(using = "css selector", value = '#maincontent > div.pad-helper > ul')) for (ul_idx in 1:ul_count) { # 拿到当前ul下的li数量 li_count <- length(remDr$findElements(using = "css selector", value = glue('#maincontent > div.pad-helper > ul:nth-child({ul_idx}) > li'))) # 遍历每个li for (li_idx in 1:li_count) { # 拼接选择器 css_selector <- glue('#maincontent > div.pad-helper > ul:nth-child({ul_idx}) > li:nth-child({li_idx}) > a') link_elem <- remDr$findElement(using = "css selector", value = css_selector) link_elem$clickElement() # 执行操作 remDr$goBack() Sys.sleep(2) } }
内容的提问来源于stack exchange,提问作者user22757672
相关产品推荐
相关产品推荐

