用于从各种服务收集Met/Ocean元数据的Python库
项目描述
metadown
========
使用Python编写的IOOS-like 19115-2元数据的程序化收集器/下载器。
支持的服务
* [THREDDS](http://www.unidata.ucar.edu/projects/THREDDS/) (必须启用ISO服务)
* [GeoNetwork](http://geonetwork-opensource.org/)
## 安装
metadown可在PyPI上找到,并可通过`pip`安装。
```bash
pip install metadown
```
`lxml`, `requests`, 和 `thredds_crawler` 将自动安装
## 使用方法
### THREDDS
ThreddsCollector 可以接受三个可选参数。两者都强烈建议,这样你就不会爬取整个 THREDDS 服务器(除非你真的想这么做)。
。
* `debug` (布尔值) - 将正在发生的事情打印到控制台。对于调试 `selects` 和 `skips` 中要放入的内容很有用。
* `selects` (列表) - 根据其 THREDDS ID 选择数据集。支持 Python 正则表达式。
* `skips` (列表) - 根据其名称和基于其 xlink:title 的 catalogRefs 跳过数据集。默认情况下,爬虫使用一些常见的正则表达式来跳过成千上万的文件列表,这些文件是聚合或 FMRC 的一部分(如下所示)。将 `skip` 参数设置为默认值以外的任何内容都会冒被一些愤怒的系统管理员追的风险。
* `.*files.*`
* `.*Individual Files.*`
* `.*File_Access.*`
* `.*Forecast Model Run.*`
* `.*Constant Forecast Offset.*`
* `.*Constant Forecast Date.*`
您可以通过 ThreddsCollector.SKIPS 类变量访问默认的 `skip` 列表
```python
> from metadown.collectors.thredds import ThreddsCollector
> print ThreddsCollector.SKIPS
[
'.*files.*',
'.*Individual Files.*',
'.*File_Access.*',
'.*Forecast Model Run.*',
'.*Constant Forecast Offset.*',
'.*Constant Forecast Date.*'
]
```
如果您需要删除或添加新的 `skip`,强烈建议您从 `SKIPS` 类变量作为起点使用!
```python
> from metadown.collectors.thredds import ThreddsCollector
> skips = ThreddsCollector.SKIPS + [".*-Day-Aggregation"]
> metadata_urls = ThreddsCollector("http://tds.maracoos.org/thredds/MODIS.xml", selects=[".*-Agg"], skips=skips).run()
> print metadata_urls
[
'http://tds.maracoos.org/thredds/iso/MODIS-Agg.nc?dataset=MODIS-Agg&catalog=http://tds.maracoos.org/thredds/MODIS.xml',
'http://tds.maracoos.org/thredds/iso/MODIS-2009-Agg.nc?dataset=MODIS-2009-Agg&catalog=http://tds.maracoos.org/thredds/MODIS.xml',
'http://tds.maracoos.org/thredds/iso/MODIS-2010-Agg.nc?dataset=MODIS-2010-Agg&catalog=http://tds.maracoos.org/thredds/MODIS.xml',
'http://tds.maracoos.org/thredds/iso/MODIS-2011-Agg.nc?dataset=MODIS-2011-Agg&catalog=http://tds.maracoos.org/thredds/MODIS.xml',
'http://tds.maracoos.org/thredds/iso/MODIS-2012-Agg.nc?dataset=MODIS-2012-Agg&catalog=http://tds.maracoos.org/thredds/MODIS.xml',
'http://tds.maracoos.org/thredds/iso/MODIS-2013-Agg.nc?dataset=MODIS-2013-Agg&catalog=http://tds.maracoos.org/thredds/MODIS.xml'
]
```
### GeoNetwork
```python
from metadown.collectors.geonetwork import GeoNetworkCollector
gnc = GeoNetworkCollector("http://data.glos.us/metadata")
metadata_urls = gnc.run()
print metadata_urls
[
...
'http://data.glos.us/metadata/srv/en/iso19139.xml?id=39848',
'http://data.glos.us/metadata/srv/en/iso19139.xml?id=39846',
'http://data.glos.us/metadata/srv/en/iso19139.xml?id=39845'
]
```
### 下载生成的 ISO 文件
一旦您有了所需数据的元数据 URL,您想做什么就做什么!
如果您想重命名或修改元数据文件,有一个名为 `XmlDownloader` 的辅助类。
XmlDownloader 接受三个参数
* `url_list` (必需) - URL 列表
* `download_path` (必需) - 在本地机器上下载文件的文件夹
* `namer` (可选) - 一个 Python 函数,用于在将文件保存到本地机器之前重命名元数据文件。它应接受单个 URL 并返回要保存为的 URL 的字符串文件名。
重命名 GeoNetwork URL 的示例 `namer` 函数
```python
from urlparse import urlsplit
def geonetwork_renamer(url, **kwargs)
uid = urlsplit(url).query
uid = uid[uid.index("=")+1:]
return "GeoNetwork-" + uid + ".xml"
```
* `modifier` (可选) - 一个 Python 函数,用于完全控制元数据内容。它应接受单个 URL 并返回 ISO19115-2 的 `str` 表示形式。
将 GeoNetwork 的 ISO19139 转换为 ISO19115-2 的示例 `modifier` 函数
```python
from metadown.utils.etree import etree
def geonetwork_modifier(url, **kwargs)
gmi_ns = "http://www.isotc211.org/2005/gmi"
etree.register_namespace("gmi", gmi_ns)
new_root = etree.Element("{%s}MI_Metadata" % gmi_ns)
old_root = etree.parse(url).getroot()
# 携带所需属性
[new_root.set(k, v) for k, v in old_root.attrib.items()]
# 携带子元素
[new_root.append(e) for e in old_root]
返回 etree.tostring(new_root, encoding="UTF-8", pretty_print=True, xml_declaration=True)
```
```python
from metadown.downloader import XmlDownloader
XmlDownloader.run(metadata_urls, download_directory, namer=geonetwork_renamer, modifier=geonetwork_modifier)
```
========
使用Python编写的IOOS-like 19115-2元数据的程序化收集器/下载器。
支持的服务
* [THREDDS](http://www.unidata.ucar.edu/projects/THREDDS/) (必须启用ISO服务)
* [GeoNetwork](http://geonetwork-opensource.org/)
## 安装
metadown可在PyPI上找到,并可通过`pip`安装。
```bash
pip install metadown
```
`lxml`, `requests`, 和 `thredds_crawler` 将自动安装
## 使用方法
### THREDDS
ThreddsCollector 可以接受三个可选参数。两者都强烈建议,这样你就不会爬取整个 THREDDS 服务器(除非你真的想这么做)。
。
* `debug` (布尔值) - 将正在发生的事情打印到控制台。对于调试 `selects` 和 `skips` 中要放入的内容很有用。
* `selects` (列表) - 根据其 THREDDS ID 选择数据集。支持 Python 正则表达式。
* `skips` (列表) - 根据其名称和基于其 xlink:title 的 catalogRefs 跳过数据集。默认情况下,爬虫使用一些常见的正则表达式来跳过成千上万的文件列表,这些文件是聚合或 FMRC 的一部分(如下所示)。将 `skip` 参数设置为默认值以外的任何内容都会冒被一些愤怒的系统管理员追的风险。
* `.*files.*`
* `.*Individual Files.*`
* `.*File_Access.*`
* `.*Forecast Model Run.*`
* `.*Constant Forecast Offset.*`
* `.*Constant Forecast Date.*`
您可以通过 ThreddsCollector.SKIPS 类变量访问默认的 `skip` 列表
```python
> from metadown.collectors.thredds import ThreddsCollector
> print ThreddsCollector.SKIPS
[
'.*files.*',
'.*Individual Files.*',
'.*File_Access.*',
'.*Forecast Model Run.*',
'.*Constant Forecast Offset.*',
'.*Constant Forecast Date.*'
]
```
如果您需要删除或添加新的 `skip`,强烈建议您从 `SKIPS` 类变量作为起点使用!
```python
> from metadown.collectors.thredds import ThreddsCollector
> skips = ThreddsCollector.SKIPS + [".*-Day-Aggregation"]
> metadata_urls = ThreddsCollector("http://tds.maracoos.org/thredds/MODIS.xml", selects=[".*-Agg"], skips=skips).run()
> print metadata_urls
[
'http://tds.maracoos.org/thredds/iso/MODIS-Agg.nc?dataset=MODIS-Agg&catalog=http://tds.maracoos.org/thredds/MODIS.xml',
'http://tds.maracoos.org/thredds/iso/MODIS-2009-Agg.nc?dataset=MODIS-2009-Agg&catalog=http://tds.maracoos.org/thredds/MODIS.xml',
'http://tds.maracoos.org/thredds/iso/MODIS-2010-Agg.nc?dataset=MODIS-2010-Agg&catalog=http://tds.maracoos.org/thredds/MODIS.xml',
'http://tds.maracoos.org/thredds/iso/MODIS-2011-Agg.nc?dataset=MODIS-2011-Agg&catalog=http://tds.maracoos.org/thredds/MODIS.xml',
'http://tds.maracoos.org/thredds/iso/MODIS-2012-Agg.nc?dataset=MODIS-2012-Agg&catalog=http://tds.maracoos.org/thredds/MODIS.xml',
'http://tds.maracoos.org/thredds/iso/MODIS-2013-Agg.nc?dataset=MODIS-2013-Agg&catalog=http://tds.maracoos.org/thredds/MODIS.xml'
]
```
### GeoNetwork
```python
from metadown.collectors.geonetwork import GeoNetworkCollector
gnc = GeoNetworkCollector("http://data.glos.us/metadata")
metadata_urls = gnc.run()
print metadata_urls
[
...
'http://data.glos.us/metadata/srv/en/iso19139.xml?id=39848',
'http://data.glos.us/metadata/srv/en/iso19139.xml?id=39846',
'http://data.glos.us/metadata/srv/en/iso19139.xml?id=39845'
]
```
### 下载生成的 ISO 文件
一旦您有了所需数据的元数据 URL,您想做什么就做什么!
如果您想重命名或修改元数据文件,有一个名为 `XmlDownloader` 的辅助类。
XmlDownloader 接受三个参数
* `url_list` (必需) - URL 列表
* `download_path` (必需) - 在本地机器上下载文件的文件夹
* `namer` (可选) - 一个 Python 函数,用于在将文件保存到本地机器之前重命名元数据文件。它应接受单个 URL 并返回要保存为的 URL 的字符串文件名。
重命名 GeoNetwork URL 的示例 `namer` 函数
```python
from urlparse import urlsplit
def geonetwork_renamer(url, **kwargs)
uid = urlsplit(url).query
uid = uid[uid.index("=")+1:]
return "GeoNetwork-" + uid + ".xml"
```
* `modifier` (可选) - 一个 Python 函数,用于完全控制元数据内容。它应接受单个 URL 并返回 ISO19115-2 的 `str` 表示形式。
将 GeoNetwork 的 ISO19139 转换为 ISO19115-2 的示例 `modifier` 函数
```python
from metadown.utils.etree import etree
def geonetwork_modifier(url, **kwargs)
gmi_ns = "http://www.isotc211.org/2005/gmi"
etree.register_namespace("gmi", gmi_ns)
new_root = etree.Element("{%s}MI_Metadata" % gmi_ns)
old_root = etree.parse(url).getroot()
# 携带所需属性
[new_root.set(k, v) for k, v in old_root.attrib.items()]
# 携带子元素
[new_root.append(e) for e in old_root]
返回 etree.tostring(new_root, encoding="UTF-8", pretty_print=True, xml_declaration=True)
```
```python
from metadown.downloader import XmlDownloader
XmlDownloader.run(metadata_urls, download_directory, namer=geonetwork_renamer, modifier=geonetwork_modifier)
```