치안('治安'), 범죄('犯罪'), 경찰('警察'), 범죄 예방('犯罪予防'), CCTV('監視'), 범죄자('犯罪者'), 안전('安全'), 교통 안전('交通安全'), 경비원('警備員'), 범죄 통계('犯罪統計')
✏️ 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}")
수집한 데이터는 총 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): 사건 발생 장소의 상세한 내용