问题描述
我正在尝试从一个动态网站抓取那些黄色小车的信息:Trunk road gritter tracker
这是一个包含许多黄色汽车的动态网站,每辆车都有自己的信息,如“车辆”、“年龄(范围)”、“来源日期”等。当你点击汽车时,信息会弹出。
但是,我一次只能点击打开一辆车的信息栏,这意味着我一次只能得到一个特定的弹出数据,相应地,抓取结果也只针对该特定汽车。如何抓取所有汽车的信息栏?
在网页初始状态下,还没有点击汽车,所以我的想法是使用remdr$findelement()函数来导航汽车,然后使用 clickElement() 来模拟点击。点击后会弹出一个窗口,然后使用html_Nodes()和html_text()函数抓取信息。抓取后,模拟点击弹出的关闭按钮。至此,一辆车的抓取完成,再重复这个过程,实现对所有汽车信息的抓取。
我使用了 Rselenium 和 rvest,这是我的代码:
remDr = remoteDriver(remoteServerAddr="localhost",port=4444L,browserName="chrome")
remDr$open(silent = T)
url = "https://www.arcgis.com/apps/webappviewer/index.html?id=2de764a9303848ffb9a4cac0bd0b1aab"
remDr$navigate(url)
image_button = remDr$findElement('xpath',value = "//*[@id='TSWT_VehiclesAndTrail_2020_1393_layer']/*[name()='image']")
image_button$clickElement()
webpage <- read_html(remDr$getPageSource()[[1]])
data <- webpage %>% html_nodes(".attrValue") %>% html_text()
data
但是,有一些问题。当许多汽车在同一页面时,我不知道如何使用 findElement() 导航到汽车。汽车图像的结构如下所示。尽管每个图像都有自己特定的 xPath,但它位于嵌套的 strcutre 中,我无法通过直接搜索该图像 xpath 来成功找到元素。根据这两个答案:Finding SVG Elements using RSelenium and XPath
和 trigger all pop-ups,我使用 remDr$findElement('xpath',value = "//*[@id='TSWT_VehiclesAndTrail_2020_1393_layer']/*[name()='image']")
但这仅在我放大页面以便屏幕上只有一辆车时才有效,我可以获得信息成功,当超过一辆车出现在屏幕上时,将不会返回任何信息。我试过 remDr$findElement()[[1]]
但还是不行。
<svg>
<g id=xxx>
<image></image>
<image></image>
<image></image>
.
.
.
</g>
</svg>
如何一次从不同的弹出窗口中获取所有不同的信息?我的想法可行吗,或者还有其他更简单的方法吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)