如何用Python从Flickr XML图像数据中提取图像地理数据?

2 投票
2 回答
1550 浏览
提问于 2025-04-18 13:59

我正在研究电子废物的问题,并且我在使用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>

撰写回答