UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码
目錄
Python代碼
根據需求改寫url
報錯應對辦法
UN Comtrade數據庫關于中國臺灣的數據
2021/9/28更新:最近有用戶反饋下載會出現錯誤內容如下圖,感謝用戶@三眼皮138幫忙找出錯誤。官方應該是更新API的使用了,在爬取數據是將url中的關鍵詞max放到最前面即可避免錯誤,以下代碼都已經更新。
以下為原文:
最近需要從UN Comtrade數據庫下載一批數據,2003-2019年各國進口產品金額,產品類別使用SITC3分類標準,打算按年份分17次下載,結果提示普通用戶單次最大下載量為10000,所以只能將Reporters分別選中每個國家下載,這樣一共要下載256*17次,并不現實。借助UN Comtrade提供的API,寫了一份代碼自動下載數據。
(該數據已經下載好了,需要可以留下郵箱。如果急需其他數據或者代碼使用困難,也可私信我幫忙代下、對數據篩選處理等。)
Python代碼
具體代碼如下。經過測試,windows系統和linux系統都可以拷貝到本地直接用python3.x運行。如果需要下載其他數據,更換代碼里的url鏈接的參數即可,url的格式參考官方說明Data API (v2) | UN Comtrade: International Trade Statistics,下一段也進行了簡單說明。
# -*- coding: utf-8 -*-import json import urllib.request from random import randint import time import osUSER_AGENTS = ["Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)","Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)","Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)","Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)","Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)","Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0","Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5","Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20","Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",]def download_url(url, path, header):"""函數功能:下載url鏈接內容到path路徑下參數解釋:url: 下載鏈接path: 本地保存路徑header: 設置訪問用戶代理"""content = urllib.request.Request(url, headers=header)with urllib.request.urlopen(content) as file:with open(path,'wb') as outfile:outfile.write(file.read())def main():random_agent = USER_AGENTS[randint(0, len(USER_AGENTS)-1)]header = {'User-Agent':random_agent}#-----------------獲取所有國家的名單和國家對應編碼號-----------------if not os.path.exists("./reporterAreas.json"):download_url("https://comtrade.un.org/Data/cache/reporterAreas.json","./reporterAreas.json",header)with open('reporterAreas.json', 'r',encoding='utf_8_sig') as f:data = json.load(f)results = data.get("results")id = [] #存放國家編碼號text = [] #存放國家名稱for i in results:id.append(i.get("id"))text.append(i.get("text"))# 刪除第一個元素,第一個元素是allnew_id = id[1:]new_text = text[1:]#------------------------------------------------------------------# 若運行中斷,繼續下載僅需要更改下面三個參數start_year = 2003stop_year = 2019begin_id = 0 #當前年份已下載文件數目# 創建data文件夾存放下載數據if not os.path.exists("./data"):os.makedirs("./data")for year in range(start_year, stop_year+1):# 創建年份文件夾將數據按年份分開存放if not os.path.exists("./data/" + str(year)):os.makedirs("./data/" + str(year))for i in range(begin_id, len(new_id)):random_agent = USER_AGENTS[randint(0, len(USER_AGENTS)-1)]print(random_agent)header = {'User-Agent':random_agent}url = "http://comtrade.un.org/api/get?max=100000&r=" + str(new_id[i]) + "&freq=A&ps=" + str(year) + "&px=S3&p=0&rg=1&cc=AG3&fmt=csv&type=C"path = "./data/" + str(year) + "/" + new_text[i] + ".csv"print("Downing from " + url + " to " + path)download_url(url,path,header)print("Done")# 暫停36秒,保證一小時訪問100次time.sleep(36)if __name__ == '__main__':main()根據需求改寫url
url的格式為http://comtrade.un.org/api/get?parameters,其中parameters每個變量含義:
r:reportering area,選擇所需要的目標國家;
freq:選擇數據為年度或月度;
ps:選擇所需要的年份;
px:選擇分類標準,如常用的SITC Revision 3為S3;
p:partner area,選擇所需要的對象國家,如需要中國與俄羅斯的出口額,則目標為中國,對象為俄羅斯;
rg:選擇進口或出口;
cc:選擇產品代碼;
fmt:選擇輸出文件格式,csv或json;
max:最大返回數據量;
type:選擇貿易類型,產品或服務。
舉例:“中國2015年與其他國家或地區在SITC Rev.3標準下所有3位編碼產品進口總額”
對應的url為“http://comtrade.un.org/api/get?max=100000&r=156&freq=A&ps=2015&px=S3&p=0&rg=1&cc=AG3&fmt=csv&type=C”。(直接點擊跳轉就可以下載)
報錯應對辦法
運行過程中會遇到“RemoteDisconnected: Remote end closed connection without response”,“409 Conflict”等錯誤,參考【Python】py3.6請求網站時報錯:http.client.RemoteDisconnected: Remote end closed connection without response使用更換User Agent的方法來避免同一用戶頻繁訪問被限制,有一些作用但并不能避免錯誤繼續產生。問題根源在UN Comtrade API使用的限制,網站明確說明了普通用戶每小時只能發送100次請求,否則就會報409的錯。所以將請求速度通過sleep函數限制到36秒一次,1小時100次,但依然會報409的錯誤。因此想要避免這個錯誤,就必須使用一些動態改變IP的方法,可以自行去搜索或參考本人另一篇博文UN Comtrade(聯合國商品貿易統計數據庫)數據爬取Python代碼——使用動態IP。如果數據量不是特別大,一千次下載量以內,斷斷續續也是很快就可以下載完的,代碼也有中斷后繼續下載的功能(修改起始年份和當前年份已下載文件數即可)。
UN Comtrade數據庫關于中國臺灣的數據
如果下載完數據仔細觀察,會發現找不到臺灣的數據,而香港(編號344,China,Hong Kong SAR)和澳門(編號446,China,Macao SAR)的數據是很容易找到的,SAR就是Special Administration Region 特別行政區的意思。其實臺灣的數據就是編號490,Other Asia,nes(not elsewhere specified,他處未列的,不另詳述)的數據。以2012,2013年UN Comtrade數據庫內中國與Other Asia,nes進出口總額和中國統計年鑒數據庫內中國與中國臺灣進出口總額對比來說明。
UN Comtrade:
中國統計年鑒:
對比完應該就可以確定Other Asia,nes就是中國臺灣,希望大家使用的時候能夠注意這個問題。當然也便于解決和其他數據一起使用時的名稱匹配問題,如UNCTAD(聯合國貿易和發展會議)數據庫就明確標出了中國臺灣省(China,Taiwan Province)。
總結
以上是生活随笔為你收集整理的UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 衬线字体和无衬线字体区别_字体,字体和字
- 下一篇: 系统备份恢复 Acronis True