[Python] 使用 UN Comtrade API 高效获取数据-程序员宅基地

技术标签: python  Python Projects  

本文最初写成于 2021 年 7 月,由于作者的拖延问题以致今天才得以和各位同学(即便大概率是自说自话了)见面,因此文中具体细节可能已经发生变化。

Cover Photo by Maksym Kaharlytskyi on Unsplash

写在前面

谨以本文记录我与 UN Comtrade Database 的初次交手,四天时间里的爬虫初体验着实让我感到精疲力竭。今天我把这经验分享在这里,抛砖引玉,也许能给后来的同学一些启发。

背景知识

这一部分将向你介绍什么是 UN Comtrade Database,其 API 的使用方法,和所需的 Python 知识

什么是 UN Comtrade DB

UN COMTRADE is the pseudonym for United Nations International Trade Statistics Database. Over 170 reporter countries/areas provide the United Nations Statistics Division (UNSD) with their annual and monthly l international trade statistics data detailed by commodities/service categories and partner countries.

根据联合国统计司 knowledge base 的上述说明,你可以在 Comtrade Database 中查询170+国家报告的各品类商品/服务的年度/月度贸易数据。数据的具体类型将会在 Hands-on 部分详细分析,在此之前你可以通过官网的在线预览粗略感知,在这里你可以在这一页面指定时间、产品类型、产品种类、报告国和合作国等特征。
你可以在这一页面指定产品类型、产品种类、报告国、合作国等等特征

The UN Comtrade data extraction API

我们可以通过这一 API 来提取数据库中的特定数据,以 CSV 或 JSON 格式下载,或利用 AJAX call 来将数据融入进你的网页。

统计司鼓励用户把自己的可视化作品分享给他们,优秀的作品有可能被引用在 UN Comtrade Labs 中。我在这里发现了很多有意思的项目,非常有启发性(aka 我实在是太菜自己根本搞不出来)

Python 知识

只需了解基本语法即可!如果你对 Python 感到陌生,可以跟着廖雪峰的官方网站的 Python 教程学习,只需要学到高级特性部分就足够理解下面涉及的所有内容了。

Hands-on

我的工作是根据博主王蛋糕cake的这两篇慷慨的博文的完善,针对中断处理 (刚刚考完计组,写到这里不由得心头一颤) 和下载速度和下载内容有效性的判断等方面进行了优化。此外,还补充了下载后的清理过程,清理下载失败的文件。

  1. UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码
  2. UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码——使用动态IP

Understanding the Data Request Form

通过阅读 API文档 ,我们能在 UN Comtrade data request format 部分了解到发送请求的基本格式:

http://comtrade.un.org/api/get?parameters

其中,parameters 允许的参数在文档中有完整的说明,我就不再在此处赘述了,但其中值得强调的一点是:如果 freq 参数赋值为 M (代表以月份为单位获取数据)时,px (classification) 参数不要选择 SITC 那一套 (ST, S1, S2, … , S4) 因为没有这样的数据,你获得的都将是空表。

假设,我们现在想要查询 csv 格式下,美国2020年9月的AG4精度的进出口商品数据,该如何写这个请求 url 呢?

其中一种答案是:

https://comtrade.un.org/api/get?max=100000&type=C&freq=M&px=HS&ps=202006&r=all&p=842&rg=all&cc=AG4&fmt=csv

也许和你的答案有些出入,请注意API 对参数的前后顺序并不敏感;r 参数和 p 参数任意分别设置为 842 (code for USA) 和 all 即可;如果仔细的阅读过 Knowledgebase 文档,你就会清楚:对于同一条贸易数据,站在 importer 和 exporter 的视角(指选择 importer/exporter 为 reporter),trade value 是不同的,通常 import value 会高于 export value 因为:

Imports is generally reported on the basis of Cost, Insurance and Freight, (CIF) while exports is reported on a Free on Board (FOB) basis. For this reason, import values tend to be higher than export values.

另,根据 Worldbank 的提示,通常来讲,import data 更加准确,出于关税计算的原因。

但回到现实,这样的请求很难获得目标数据;因为美国的进出口贸易量较大,4 digits HS Code (AG4) 描述下的进口和出口数据条数实在是太大了,很可能超过 guest 用户的下载条数限额。
面对这样的问题,如果我们不愿意在精度上做出妥协,那么就需要将这条请求拆分为多条,这里可以有很多种逻辑,例如:

  1. 分别下载进口和出口数据(by altering the rg parameter)
  2. 遍历国家代码,每次请求指定 reporter 的国家代码 (by specifying the r parameter)

这也就引出了参数设置的迷思,由于下面介绍的,对于 guest 用户的访问频率和总量的限制的存在,成为了下载条数和下载次数之间的博弈(每次下载拆分的越细,需要下载的次数就越多、由于频率的限制,下载的次数越多,耗费的时间就越长)我们要尽可能地保持平衡。

你会在 Usage limits 部分了解到:

  1. 对于 guest 用户,每秒不能发送多于 1 条请求(rate),且每小时不能发送超过 100 条请求 。
  2. 对于 ps, rp 参数,输入的限制条件 (code) 不能超过五条,上述三个参数只能出现一次 ALL;

我将在下面的例子中展示,如何通过混合 动态IP 和 简易的多线程 技术实现效率更高的数据获取。

Dynamic IP

选择 TB 买家提供的最廉价的 (15 rmb/d 至少在 07/2021 是这样的行情) 动态 IP 服务即可。我遇到的买家很贴心的提供了一些语言的不同包的 Proxy 设置语法,但对于我们的例子,只需要了解 IP 端口 用户名 和 密码,填写到下面代码的对应部分即可。

Coding

  1. Requirement: 获取2019-2021,各国家月度 AG2 精度的进出口数据;
  2. Analysis: 由于数据条数的限制,采取以下下载策略:分月度分别下载每个国家为 partner 的进口和出口数据;
  • Part 1 Download specific URL to target location

import requests
import os
import json
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46615954/article/details/119146119

智能推荐

Linux-centos7_64位静默安装Oracle 11g并增加表空间及用户_oracle静默安装后如何设置用户-程序员宅基地

文章浏览阅读349次。一、安装环境1.系统环境CentOS7.6操作系统,64位2.Oracle安装包linux.x64_11gR2_database_1of2.zip 和 linux.x64_11gR2_database_2of2.zip。截至目前,Oracle官网已经将此版本下架,因此需要找其他资源获取安装包。二、安装过程1.配置yum源cd /etc/yum.repos.dmv CentOS-Base.repo CentOS-Base.repo.bakwget -O /etc/yum.re_oracle静默安装后如何设置用户

Android事件分发机制详解_android 事件分发机制-程序员宅基地

文章浏览阅读6.8k次。目录1. 基础认知1.1 事件分发的对象是谁?答:点击事件(Touch事件)定义 当用户触摸屏幕时(View 或 ViewGroup派生的控件),将产生点击事件(Touch事件)Touch事件的相关细节(发生触摸的位置、时间等)被封装成MotionEvent对象事件类型(4种)事件类型具体动作MotionEvent.ACTION_DOWN按下View(所有事件的开始)MotionEvent.ACT..._android 事件分发机制

Altium Designer-打开丝印层、位号,不显示器件位号问题_ad软件怎么只显示参数不显示位号-程序员宅基地

文章浏览阅读9.5k次,点赞2次,收藏3次。背景收到一个PCB雏形,打开后只显示丝印层的器件轮廓,不显示位号,而位号并没有隐藏。Hidden是隐藏,大家都知道。Draft是草图。(布线选这个的效果就是,下面附了一张图方便理解)于是也就不难理解Final,可以解释为定稿、成品,也就是显示的丝印的意思了。解决双击左下角的打开"Show/Hide"选项卡,把Strings从"Hidden"改为"Final",然后OK...._ad软件怎么只显示参数不显示位号

【剑指Offer-Java】机器人的运动范围_机器人的运动范围 剑指offer acm java-程序员宅基地

文章浏览阅读130次。机器人的运动范围题目描述思路实现题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路设置..._机器人的运动范围 剑指offer acm java

js自动引入js,css_js中的css调查-程序员宅基地

文章浏览阅读272次。js自动引入js,css Expedia Group Technology —软件 (EXPEDIA GROUP TECHNOLOGY — SOFTWARE)TLDR: Using a Gatsby starter setup I investigated four CSS-in-JS libraries, Emotion, styled-components, Treat and JSS. I..._createusestyles写事件

python3中实现tar_python-3.x – 如何在Python3中将字符串添加到tarfile-程序员宅基地

文章浏览阅读105次。我有问题在python中添加str到tar arhive.在python 2中我使用了这样的方法:fname = "archive_name"params_src = "some arbitrarty string to be added to the archive"params_sio = io.StringIO(params_src)archive = tarfile.open(fname+..._python3.x tarfile.member

随便推点

CVPR 2019|手写签名认证的逆鉴别网络-程序员宅基地

文章浏览阅读3k次。点击我爱计算机视觉标星,更快获取CVML新技术本文简要介绍CVPR2019论文“Inverse Discriminative Networks for Handwritten Signa..._inverse discriminative networks for handwritten signature verification

大数据学习笔记(五)_YARN资源调度框架_yran application -kill-程序员宅基地

文章浏览阅读171次。一:YARN 产生背景MapReduce1.x 的特点master/slave 架构:JobTracker/TaskTrackerJobTracker: 单点、压力大仅仅只能够支持mapreduce作业正因为有这样的问题,催生出 YARN二:YARN 概述官网介绍:http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.15.1/hadoop-yarn/hadoop-yarn-site/YARN.htmlMapReduce ha_yran application -kill

http和https工具类简单封装-程序员宅基地

文章浏览阅读2.8k次。package com.yuxing.common.util.http;import org.apache.commons.io.IOUtils;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache

React Native - Keyboard API使用详解(监听处理键盘事件)_keyboarddidshow-程序员宅基地

文章浏览阅读3.5k次。参考:React Native - Keyboard API使用详解(监听处理键盘事件)当我们点击输入框时,手机的软键盘会自动弹出,以便用户进行输入。但有时我们想在键盘弹出时对页面布局做个调整,或者在程序中使用代码收起这个软键盘,这些借助 React Native 框架提供的 Keyboard API 就可以实现。一、Keyboard API 提供的方法Keyboard API 提供如下的静态函数供开发者使用。1,addListener(eventName, callback)(1)这个函数_keyboarddidshow

特征点匹配——使用基础矩阵、单应性矩阵的RANSAC算法去除误匹配点对_ransac algorithm didn't find enough point correspo-程序员宅基地

文章浏览阅读1k次。参考:https://blog.csdn.net/lhanchao/article/details/52849446_ransac algorithm didn't find enough point correspondences