도쿄 공공 데이터 크롤링

지은·2023년 11월 19일
0
post-thumbnail

🔍 Logic

일본 도쿄 공공 데이터

  1. 검색어에 범죄 관련 키워드에 해당하는 단어를 입력 하여 검색

치안('治安'), 범죄('犯罪'), 경찰('警察'), 범죄 예방('犯罪予防'), CCTV('監視'), 범죄자('犯罪者'), 안전('安全'), 교통 안전('交通安全'), 경비원('警備員'), 범죄 통계('犯罪統計')

  1. 검색 결과에 해당하는 링크에 모두 접속하여, 확장자가 csv인 파일 모두 다운로드


📌 Process

✏️ Check 1 : 키워드 검색

범죄 관련 키워드에서 유용한 데이터는 범죄('犯罪') 키워드 뿐, 다른 키워드는 범죄 및 치안과 무관하거나,
범죄 키워드와 중복되므로 범죄('犯罪') 키워드만 크롤링 진행하였다.

✏️ Check 2 : HTTP 요청 에러 해결

HTTP requests error가 반복적으로 발생했고, header 로도 해결이 되지 않아 찾아보니, 연결 재사용(keep-alive)문제가 있었다. session을 사용하면 연결 재사용 및 상태 유지가 가능하다.

#* 어댑터 사용 설정
adapter = requests.adapters.HTTPAdapter() # HTTP 어댑터
session = requests.Session() # Session 
session.mount("http://", adapter) # 어댑터를 세션에 부착
session.mount("https://", adapter) # 어댑터를 세션에 부착
get_csv_url = []

try:
    url = get_connect_url(keyword)
    for idx in tqdm_notebook(range(len(url))):
        response = session.get(url[idx])
        soup = BeautifulSoup(response.text, 'lxml')
        tmp = soup.select('ul.resource-list > li > a')
        baseurl = 'https://catalog.data.metro.tokyo.lg.jp'
        for link in tmp:
            get_csv_url.append(baseurl + link.get('href'))
        
except requests.exceptions.RequestException as e:
    print("오류 발생:", e)

✏️ Check 3 : 여러 CSV 파일을 다운로드 및 저장 시 발생하는 에러

urllib and "SSL: CERTIFICATE_VERIFY_FAILED" Error 가 발생하여, SSL 인증 모듈을 사용하였다.
하지만, SSL 인증서 검증을 해제하는 부분은 보안 문제로 주의가 필요하므로 조심해야 한다.

import ssl
import socket
from urllib.error import URLError
import pandas as pd

ssl._create_default_https_context = ssl._create_unverified_context
#*  SSL 인증서 검증을 비활성화, 이는 SSL 인증서가 검증되지 않아도 요청을 계속할 수 있게함
for url in tqdm_notebook(final_csv_url):
    try:
        if url.endswith('.csv'):
            file_name = url.split("/")[-1]
            pd.read_csv(url, encoding='SHIFT_JIS').to_csv('tokyo/' + file_name, encoding='SHIFT_JIS')
    except URLError as e: #* URLError 예외가 발생한 경우, 연결 시간 초과(socket.timeout)인지 확인
        if isinstance(e.reason, socket.timeout): #* isinstance(e.reason, socket.timeout)를 사용하여 예외의 reason이 socket.timeout인지 확인
            print(f"{file_name} 다운로드 중 연결 시간 초과가 발생했습니다.")
        else:
            print(f"{file_name} 다운로드 및 저장 중 오류가 발생했습니다: {e}")
    except Exception as e:
        print(f"{file_name} 다운로드 및 저장 중 오류가 발생했습니다: {e}")

📌 Result

수집한 데이터는 총 132320개로, 다운로드 한 모든 csv 파일을 병합하였다.

'罪名' (Zaimē): 범죄 종류 또는 혐의<br>
'手口' (Teguchi): 범행 방법 또는 도구<br>
'管轄警察署(発生地)' (Kankatsu Keisatsusho / Hasseichi): 사건이 발생한 지역의 관할 경찰서<br>
'管轄交番・駐在所(発生地)' (Kankatsu Koban / Chuzaijo / Hasseichi): 사건이 발생한 지역의 관할 파출소 또는 출장소<br>
'市区町村コード(発生地)' (Shi-Ku-Choson Code / Hasseichi): 사건이 발생한 지역의 시·구·읍면의 코드<br>
'都道府県(発生地)' (To-Dō-Fu-Ken / Hasseichi): 사건이 발생한 지역의 도, 도도부, 혹은 혜상도<br>
'市区町村(発生地)' (Shi-Ku-Choson / Hasseichi): 사건이 발생한 지역의 시, 구, 읍면<br>
'町丁目(発生地)' (Chō-Chō-Moku / Hasseichi): 사건이 발생한 지역의 동네 혹은 지번<br>
'発生年月日(始期)' (Hassei Nengetsuhi / Shiki): 사건이 발생한 년월일의 시작일<br>
'発生時(始期)' (Hassei Toki / Shiki): 사건이 발생한 시간의 시작 시간<br>
'発生場所の属性' (Hassei Basho no Zokusei): 사건 발생 장소의 속성<br>
'現金以外の主な被害品' (Genkin Igai no Omo na Higaihin): 금전 이외의 주요 피해품<br>
'被害者の性別' (Higaisha no Seibetsu): 피해자의 성별<br>
'被害者の年齢' (Higaisha no Nenrei): 피해자의 나이<br>
'現金被害の有無' (Genkin Higai no Umu): 현금 피해 여부<br>
'施錠関係' (Sejō Kankei): 잠금 관련 사항<br>
'盗難防止装置の有無' (Tōnan Bōshi Sōchi no Umu): 도난 방지 장치의 유무<br>
'被害者の職業' (Higaisha no Shokugyō): 피해자의 직업<br>
'発生場所' (Hassei Basho): 사건 발생 장소<br>
'発生場所の詳細' (Hassei Basho no Shōsai): 사건 발생 장소의 상세한 내용

profile
꾸준한 개발자를 꿈꿈

0개의 댓글