全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
1691 10
2021-01-29
我需要爬取砂土车这个网页上那些车的信息。网页初始状态下时有很多小黄车车,鼠标点击某一个车时就会出现一个小弹窗,里面有这个车的一些信息(Vehicle、Age Range、source date等等)。请问怎样才能爬取所有小黄车的信息呢?

我最开始的思路是用rseleniumrvest包,然后:
1. remDr$findelement()定位到单个小黄车的图片上面
2. 然后clickelement()模拟左键点击
3. 利用小车的xpathhtml_nodes()html_text()函数来实现爬取并获得该车信息
4. 再用findelement和clickelement模拟点击关闭弹窗的按钮
5. 循环以上操作直到所有车都被爬到


这是我写的部分代码:
#打开网页
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



这是我的
但是实际操作起来发现有一些问题。首先没有点弹窗的初始状态下,每个小车的image的结构如下所示:
<svg>
    <g id = xxx>
        <image></image>
        <image></image>
        <image></image>
                     .
                     .
    </g>
</svg>


虽然每个小车的image有各自独有的xPath,但是由于某些原因,可能是因为处在一个多层结构里,直接在findElement()放image的xPath会报错,查询了一些资料后发现可以改变xpath写法,先定位到<g>,再在后面加/*[name()='image']来实现。但是这种方法只能适用于缩放到屏幕上只有一个车,如果有多个车,就定位不了。我试过
remDr$findElement('xpath', value = "//*[@id='TSWT_VehiclesAndTrail_2020_1393_layer']/*[name()='image']")[[1]]

但这样写,会报错,说明在最后加[[1]]这种做法并不能实现从多个小车image中定位到某特定小车image的效果。




所以我想请教一下如何我这种方法是否可行?或者说有没有其他比较简单的做法可以直接获得所有小车弹窗内的内容,而不用不停地模拟点击打开,爬信息,模拟点击关闭这种比较麻烦的触发弹窗?
附件列表
4d3e3fea313735fda048db84a53a125.png

原图尺寸 717.42 KB

4d3e3fea313735fda048db84a53a125.png

71ba6fc63b9e43df8112422f40c2bdd.png

原图尺寸 680.14 KB

71ba6fc63b9e43df8112422f40c2bdd.png

二维码

扫码加我 拉你入群

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

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

全部回复
2021-1-29 12:34:41
https://www.arcgis.com/apps/webappviewer/index.html?id=2de764a9303848ffb9a4cac0bd0b1aab
忘记放网站网址了
二维码

扫码加我 拉你入群

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

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

2021-1-31 18:38:35
你在console输入
document.querySelector("#TSWT_VehiclesAndTrail_2020_1393_layer > image:nth-child(02)").e_graphic
看看出来的是不是你要的信息,如果是的话,你只要改nth-child(02)这里02这个数字,遍历数字,就可以得到你要的信息(你可以用Rselenium来运行js,rvest里好像也行,你试一下)
二维码

扫码加我 拉你入群

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

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

2021-2-1 15:29:59
szxship 发表于 2021-1-31 18:38
你在console输入
document.querySelector("#TSWT_VehiclesAndTrail_2020_1393_layer > image:nth-child(02 ...
非常感谢您!现在又有个问题,就是这个网页上最下面有一个按钮,点击后会出现一个包含各种属性信息的弹窗。由于信息很多,这个弹窗是做成自上而下可滚动的滚动栏形式,现在我要爬取滚动栏里所有的信息,但我发现如果在html_nodes ()函数里直接用整个滚动栏的xpath进行搜索,最后反馈的结果只有滚动栏最上面的一小部分,下面大部分的都无法被搜索到。我查了下说的是动态网页滚动栏存在懒显示问题,会导致爬取滚动栏的信息不全,请问您知道有没有什么好的解决方法呢?
二维码

扫码加我 拉你入群

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

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

2021-2-1 21:18:04
derekzzy 发表于 2021-2-1 15:29
非常感谢您!现在又有个问题,就是这个网页上最下面有一个按钮,点击后会出现一个包含各种属性信息的弹窗 ...
你要的元素是在我截图标示的网址里,你双击打开就可以看到,这些网址是你点击激活后才出现 scrap.png
二维码

扫码加我 拉你入群

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

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

2021-2-2 11:00:52
szxship 发表于 2021-2-1 21:18
你要的元素是在我截图标示的网址里,你双击打开就可以看到,这些网址是你点击激活后才出现
感谢!请问有什么函数可以获得GET请求的返回值吗?是用remDr$queryRD 吗?
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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