UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码——使用动态IP
目錄
Virtual Private Network
代理服務器
測試代理IP是否生效
上一篇博文UN Comtrade(聯合國商品貿易統計數據庫)數據爬取Python代碼講了如何使用Python爬取UN comtrade數據,適用于少量數據爬取,由于網站對訪問頻率和訪問量的限制,大量下載數據時訪問會被限制,不過訪問量限制是針對每個IP的,所以在上一篇文章也提到使用動態改變IP的方法來解決該問題,本文講述兩種改變IP的方法。
Virtual Private Network
虛擬專用網絡,不懂的保留首字母大寫,虛擬專用網絡允許你將計算機連接到遠程網絡,實現改變IP的功能,通過虛擬專用網絡切換上海和南京的IP:
? ? ? ?
(PS:百度直接輸入IP可以查看本機IP)
改變了IP就可以刷新UN comtrade網站訪問限制。虛擬專用網絡有的話可以試試,但是我更推薦使用下面要講的代理服務器方法。其實現在很多代理都是同時提供代理服務和虛擬專用網絡服務。
代理服務器
這是爬蟲常用的方法,可以理解為遠程有另一臺電腦(代理服務器)幫你訪問網站。當你需要訪問UN數據庫時,代理服務器代替你進行訪問,收集你需要的信息,隨之將其返送給你。通過不斷的切換代理服務器,就可以達到不斷使用新IP的目的,從而刷新UN comtrade網站的訪問限制。
下面基于上一篇博客代碼基礎上添加使用代理ip功能,使用時需要根據具體代理來補充Get_new_ip_port函數,這里不具體推薦代理品牌,需要推薦可以私信,也可以參考爬蟲代理哪家強?十大付費代理詳細對比評測出爐!進行選擇。
# -*- coding: utf-8 -*- # 使用代碼需自行補充Get_new_ip_port函數,否則使用本機IP訪問URLimport json import requests 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 Get_new_ip_port():"""獲取新的代理IP和端口{'http':'ip:port','https':'ip:port'}"""# 這里proxy僅僅是舉個例子,具體ip和port使用代理來動態提取,在本函數中調用代理提供的提取ip接口即可proxy = {'http':'225.225.225.225:9999','https':'225.225.225.225:9999'}return proxydef download_url(url, path, header, proxy=None):"""函數功能:通過代理IP下載url鏈接內容到path路徑下參數解釋:url: 下載鏈接path: 本地保存路徑header: 設置訪問用戶代理proxy: 代理IP和端口"""content = requests.get(url, headers=header, proxies=proxy)with open(path,'ab') as outfile:outfile.write(content.content)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 = 0count = 0 # 代理下載次數ip_update = 99 #代理更換頻率,每訪問ip_update次更換新代理# 創建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)if count%ip_update == 0:proxy = Get_new_ip_port()download_url(url,path,header,proxy)print("Done")# 暫停1秒,保證訪問頻率為每秒一次time.sleep(1)count += 1if __name__ == '__main__':main()測試代理IP是否生效
使用代理ip開始爬取數據時,如何測試是否使用了代理ip進行訪問而不是本地ip?可以訪問http://httpbin.org/ip來檢測訪問其他網站所用ip是哪個,從而達到測試代理ip是否成功的目的。
import requests # 直接使用代理提供的ip進行測試,測試時將下面ip和port修改為代理提供的ip和port proxy = {'http':'225.225.225.225:9999'} # 調用代理返回ip的函數進行測試 #proxy = Get_new_ip_port() response=requests.get("http://httpbin.org/ip") print(response.text)下圖為一次測試結果,使用了遼寧鞍山的ip進行訪問。
總結
以上是生活随笔為你收集整理的UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码——使用动态IP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java读取.mdb文件
- 下一篇: 云计算平台