LinkData 데이터 세트 다운로드
LinkData라는 오픈 데이터 공유 서비스가 있지만 그 데이터를 CSV 형식으로 다운로드할 때
계정 단위로 다 떨어지는 방법이 없어서 했어요.
계정의 ID에 가입하면 이 계정의 자료 라이브러리를 모아 전부 또는 필요한 것을 선택하여 다운로드할 수 있다.
만약 아무것도 선택하지 않는다면 아이치현 반전시의 데이터를 다운로드하세요.
linkdata-crawler.py
# encoding: utf-8
import urllib.request
import urllib.parse
import json
import os
import sys
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
import time
import re
import inquirer
def main():
print('''
This script get all datasets for a specific user at LinkData.org
you need chromedriver, if you don't have it `brew cask install chromedriver`
Press ^C at any time to quit.
''')
account_id = ""
args = sys.argv
if len(args) < 2:
account_id = input("account id: (kouhou_handacity) ")
if len(account_id) == 0:
account_id = "kouhou_handacity"
options = Options()
options.add_argument('--disable-gpu')
options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://user.linkdata.org/user/{0}/work".format(account_id))
while True:
try:
WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
driver.find_element_by_class_name("btn-more").click()
time.sleep(3)
print("click")
except Exception as e:
print(e)
break
path_list = {}
print("check all datasets")
for user_image_path in driver.find_elements_by_class_name('entity'):
dataset_name = user_image_path.find_elements_by_class_name("entity_name")[0].get_attribute("title")
dataset_path = user_image_path.find_elements_by_class_name("user_image")[0].get_attribute("src")
if 'rdf' in dataset_path:
print("{0}: {1}".format(dataset_name, dataset_path))
path_list[str(dataset_name)] = str(dataset_path)
driver.quit()
repos = path_list.keys()
while True:
check = input("Download All Project? (y/N)")
if (check == "y") or (check == ""):
break
elif (check == "N"):
questions = [
inquirer.Checkbox(
'datasets',
message="\nWhich do you want to download ?",
choices=repos
)
]
answers = inquirer.prompt(questions)
repos = answers["datasets"]
break
for i, r in enumerate(repos):
time.sleep(1)
print("\n[{0}/{1}] check {2}".format(i+1, len(repos), r))
if not os.path.exists("datasets/"+r):
print(" mkdir dastasets/{0}".format(r))
os.makedirs("datasets/" + r)
req = urllib.request.Request("http://linkdata.org/api/1/{0}/datapackage.json".format(os.path.basename(path_list[r])))
with urllib.request.urlopen(req) as response:
html = response.read().decode("utf-8")
all_data = json.loads(html)
all_project = all_data["resources"]
for j, proj in enumerate(all_project):
time.sleep(1)
csv_name = os.path.basename(proj["url"])
csv_path = proj["url"]
if not os.path.isfile("datasets/"+r+"/"+csv_name):
print(" [{0}/{1}] download... {2}".format(j+1, len(all_project), csv_name))
urllib.request.urlretrieve(csv_path, "datasets/"+r+"/"+csv_name)
else:
print(" [{0}/{1}] {2} already exists".format(j+1, len(all_project), csv_name))
print("end")
if __name__ == "__main__":
main()
그렇게 큰 것은 사용하지 않았지만 의존관계가 있는 서류는 이것을 첨부해 주십시오.requirements.txt
blessings==1.7
inquirer==2.6.3
python-editor==1.0.4
readchar==2.0.1
selenium==3.141.0
six==1.12.0
urllib3==1.25.6
누군가에게 참고하도록 제공하다.
Reference
이 문제에 관하여(LinkData 데이터 세트 다운로드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ogrium/items/7157dd32dc5d5f8e5784텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)