是否可以打开某个div中的每个链接并在一个文件或至少终端输出中收集已打开字段的值?
我正在尝试获取google map上可见的所有标记的坐标列表。
all_links = b.div(:id, "kmlfolders").links
all_links.each do |link|
b.link.click
b.link(:text, "Norādījumi").click
puts b.text_field(:title, "Galapunkta_adrese").value
end
是否有更简单或更有效的方法来自动收集所有标记的坐标?
答案 0 :(得分:0)
除非你已经可以通过的HTML中有其他数据(alt标签?通过onhover调用的元素?),这似乎是迭代链接的最实用的方法,但是我可以看到你是实际上并没有在循环中使用'link'对象。你需要更多像这样的东西
all_links = b.div(:id, "kmlfolders").links
all_links.each do |thelink|
b.link(:href => thelink.href).click
b.link(:text, "Norādījumi").click
puts b.text_field(:title, "Galapunkta_adrese").value
end
可能使用他们的API是获得你想要的更有效的方法然而,这就是人们毕竟制作API的原因,如果一个可用,那么使用它几乎总是最好的。从长远来看,使用测试工具作为屏幕抓取器来收集信息比学习如何进行api调用并以这种方式获取数据要困难得多。
对于基于Web的api和Ruby我发现REST-CLIENT gem很有用,其他人如HTTP-Party
答案 1 :(得分:0)
由于我还不熟悉Google API,因此我发现很难根据某个特定需求深入了解API。因此,我制作了简短的watir-webdriver脚本,用于收集受保护的谷歌地图上的标记坐标。生成的文件用于python脚本,为导航设备创建speedcam文件。
在这种情况下,它的speedcam地图由拉脱维亚警方维护和更新,但这个脚本可以通过替换网址与任何谷歌地图一起使用。
# encoding: utf-8
require "rubygems"
require "watir-webdriver"
@b = Watir::Browser.new :ff
#--------------------------------
@b.goto "http://maps.google.com/maps?source=s_q&f=q&hl=lv&geocode=&q=htt%2F%2Fmaps.google.com%2Fmaps%2Fms%3Fmsid%3D207561992958290099079.0004b731f1c645294488e%26msa%3D0%26output%3Dkml&aq=&sll=56.799934,24.5753&sspn=3.85093,8.64624&ie=UTF8&ll=56.799934,24.5753&spn=3.610137,9.887695&z=7&vpsrc=0&oi=map_misc&ct=api_logo"
@b.div(:id, "kmlfolders").wait_until_present
all_markers = @b.div(:id, "kmlfolders").divs(:class, "fdrlt")
@prev_coordinates = 1
puts "#{all_markers.length} speedcam markers detected"
File.open("list_of_coordinates.txt","w") do |outfile|
all_markers.each do |marker|
sleep 1
marker.click
sleep 1
description = @b.div(:id => "iw_kml").text
@b.span(:class, "actbar-text").click
sleep 2
coordinates = @b.text_field(:name, "daddr").value
redo if coordinates == @prev_coordinates
puts coordinates
outfile.puts coordinates
@prev_coordinates = coordinates
end
end
puts "Coordinates saved in file!"
@b.close
适用于Mac OSX 10.7和Windows7。