如何用Python从Flickr XML图像数据中提取图像地理数据?
我正在研究电子废物的问题,并且我在使用flickrapi这个Python模块的代码来获取带有#e-waste标签的Flickr图片的xml数据。
import flickrapi
import xml
api_key='myAPI key'
api_secret ='myAPI secret'
flickr = flickrapi.FlickrAPI(api_key,secret=api_secret)
r = flickr.photos_search(tags='e-waste', has_geo="1", per_page='100')
xml.etree.ElementTree.dump(r)
运行这段代码后,我得到了结果:
<rsp stat="ok">
<photos page="1" pages="58" perpage="100" total="5785">
<photo farm="3" id="13982876982" isfamily="0" isfriend="0" ispublic="1" owner="100231432@N02" secret="2d33e5efb1" server="2903" title="Sean Gallagher, Pulitzer Photojournalist visits MSA" />
<photo farm="8" id="13962977066" isfamily="0" isfriend="0" ispublic="1" owner="100231432@N02" secret="aeb6bc1454" server="7139" title="Sean Gallagher, Pulitzer Photojournalist visits MSA" />
</photos>
</rsp>
现在,我还想获取这些图片应该包含的地理元数据。我该怎么做呢?我最终想把这些地理数据提取到一个csv文件中,然后可以进行地图展示。
谢谢!
2 个回答
1
另一种方法是使用REST API。你可以看看这个链接:https://www.flickr.com/services/api/flickr.photos.search.html
你可以通过很多参数来缩小搜索范围。如果你想进行地理查询,可以使用一个叫做bbox的参数,并在搜索中包含经纬度,同时可以通过添加标签(比如#e-waste)来进一步缩小搜索结果。你可以用url.open来调用每个网址,然后把它传给BeautifulSoup(http://www.crummy.com/software/BeautifulSoup/),这是一个用来解析XML的工具。这样做比上面提到的方法少了一步:
它可能看起来像这样:
from bs4 import BeautifulSoup
url = "https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=5....b&per_page=250&has_geo=1&extras=geo,tags,views,description"
soup = BeautifulSoup(urlopen(url)) #pass it to Beautiful Soup
for data in soup.find_all('photo'): #iterate through the XML Document
scraping = (
data.get("id"), #find the data you want and write it into a tuple which you then can write to a csv
data.get("title"),
data.get("tags"),
data.get("longitude"),
data.get("latitude"),
)
1
从<photo>
元素中提取id
属性,然后把这个id
传给flickr.photos.getInfo,接着从<location>
元素中提取数据。文档页面上的示例没有展示这个过程,但你可以使用API Explorer来查看一个示例。以下是我其中一张照片的示例:
<location latitude="38.829786" longitude="-77.52202" accuracy="14" context="0" place_id="ioKEzZ1TV7oQ55R_" woeid="2501239">
<locality place_id="ioKEzZ1TV7oQ55R_" woeid="2501239">Sudley Springs</locality>
<county place_id="hF2V0rlQUL9MlAlEkA" woeid="12590406">Prince William</county>
<region place_id="pPrhG7VTUb6SbYO." woeid="2347605">Virginia</region>
<country place_id="nz.gsghTUb4c2WAecA" woeid="23424977">United States</country>
</location>