技术标签: python Python Projects
本文最初写成于 2021 年 7 月,由于作者的拖延问题以致今天才得以和各位同学(即便大概率是自说自话了)见面,因此文中具体细节可能已经发生变化。
Cover Photo by Maksym Kaharlytskyi on Unsplash
谨以本文记录我与 UN Comtrade Database 的初次交手,四天时间里的爬虫初体验着实让我感到精疲力竭。今天我把这经验分享在这里,抛砖引玉,也许能给后来的同学一些启发。
这一部分将向你介绍什么是 UN Comtrade Database,其 API 的使用方法,和所需的 Python 知识。
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 部分详细分析,在此之前你可以通过官网的在线预览粗略感知,在这里你可以在这一页面指定时间、产品类型、产品种类、报告国和合作国等特征。
我们可以通过这一 API 来提取数据库中的特定数据,以 CSV 或 JSON 格式下载,或利用 AJAX call 来将数据融入进你的网页。
统计司鼓励用户把自己的可视化作品分享给他们,优秀的作品有可能被引用在 UN Comtrade Labs 中。我在这里发现了很多有意思的项目,非常有启发性(aka 我实在是太菜自己根本搞不出来)
只需了解基本语法即可!如果你对 Python 感到陌生,可以跟着廖雪峰的官方网站的 Python 教程学习,只需要学到高级特性部分就足够理解下面涉及的所有内容了。
我的工作是根据博主王蛋糕cake的这两篇慷慨的博文的完善,针对中断处理 (刚刚考完计组,写到这里不由得心头一颤) 和下载速度和下载内容有效性的判断等方面进行了优化。此外,还补充了下载后的清理过程,清理下载失败的文件。
通过阅读 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 用户的下载条数限额。
面对这样的问题,如果我们不愿意在精度上做出妥协,那么就需要将这条请求拆分为多条,这里可以有很多种逻辑,例如:
rg
parameter)r
parameter)这也就引出了参数设置的迷思,由于下面介绍的,对于 guest 用户的访问频率和总量的限制的存在,成为了下载条数和下载次数之间的博弈(每次下载拆分的越细,需要下载的次数就越多、由于频率的限制,下载的次数越多,耗费的时间就越长)我们要尽可能地保持平衡。
你会在 Usage limits 部分了解到:
ps
, r
和 p
参数,输入的限制条件 (code) 不能超过五条,上述三个参数只能出现一次 ALL;我将在下面的例子中展示,如何通过混合 动态IP 和 简易的多线程 技术实现效率更高的数据获取。
选择 TB 买家提供的最廉价的 (15 rmb/d 至少在 07/2021 是这样的行情) 动态 IP 服务即可。我遇到的买家很贴心的提供了一些语言的不同包的 Proxy 设置语法,但对于我们的例子,只需要了解 IP 端口 用户名 和 密码,填写到下面代码的对应部分即可。
import requests
import os
import json
文章浏览阅读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静默安装后如何设置用户
文章浏览阅读6.8k次。目录1. 基础认知1.1 事件分发的对象是谁?答:点击事件(Touch事件)定义 当用户触摸屏幕时(View 或 ViewGroup派生的控件),将产生点击事件(Touch事件)Touch事件的相关细节(发生触摸的位置、时间等)被封装成MotionEvent对象事件类型(4种)事件类型具体动作MotionEvent.ACTION_DOWN按下View(所有事件的开始)MotionEvent.ACT..._android 事件分发机制
文章浏览阅读9.5k次,点赞2次,收藏3次。背景收到一个PCB雏形,打开后只显示丝印层的器件轮廓,不显示位号,而位号并没有隐藏。Hidden是隐藏,大家都知道。Draft是草图。(布线选这个的效果就是,下面附了一张图方便理解)于是也就不难理解Final,可以解释为定稿、成品,也就是显示的丝印的意思了。解决双击左下角的打开"Show/Hide"选项卡,把Strings从"Hidden"改为"Final",然后OK...._ad软件怎么只显示参数不显示位号
文章浏览阅读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
文章浏览阅读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写事件
文章浏览阅读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
文章浏览阅读3k次。点击我爱计算机视觉标星,更快获取CVML新技术本文简要介绍CVPR2019论文“Inverse Discriminative Networks for Handwritten Signa..._inverse discriminative networks for handwritten signature verification
文章浏览阅读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
文章浏览阅读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
文章浏览阅读3.5k次。参考:React Native - Keyboard API使用详解(监听处理键盘事件)当我们点击输入框时,手机的软键盘会自动弹出,以便用户进行输入。但有时我们想在键盘弹出时对页面布局做个调整,或者在程序中使用代码收起这个软键盘,这些借助 React Native 框架提供的 Keyboard API 就可以实现。一、Keyboard API 提供的方法Keyboard API 提供如下的静态函数供开发者使用。1,addListener(eventName, callback)(1)这个函数_keyboarddidshow
文章浏览阅读630次。123_用户登录模块spring整合myvatis案例
文章浏览阅读1k次。参考:https://blog.csdn.net/lhanchao/article/details/52849446_ransac algorithm didn't find enough point correspondences