brute force screp을 사용하여 ICF 데이터베이스 만들기

개시하다
ICF는 WHO가 제작한 국제적 기능 분류로 사람의 건강 상태를 코드로 표현할 수 있는 도구로, 예를 들어'b280 통증의 느낌'은 신체 부위의 손상과 가능성을 나타내는 불쾌한 느낌으로,'b2804'처럼 코드 뒤에 등급을 붙이면이 ICF 프로젝트는 얼마나 문제가 있는 상태를 나타낼 수 있는지를 보여준다. 그나저나 레벨 4는 중병이기 때문에 통증을 나타내는 코드가 없다. (필자는 의료 관계자가 아니기 때문에 미세한 오류가 많다.)
이 ICF 코드는 연구에 활용하려면 조사만 하면 공개되지 않기 때문에 자체적으로 데이터베이스화하려고 하기 때문에 웹페이지에서 ICF를 검색할 수 있다.이것은 이 사이트를 덮어쓰는 방법을 시도한 보도이다.
차리다
BeautifulSoup 설치!
$ pip install beautifulsoup4
방침.
ICF는'b280'처럼'자모'+'000'으로 구성되어 있으며, 0에는 0~9개의 숫자가 있다. 즉'자모 한 글자와 최대 5자리 숫자의 십진법 조합'이다. 이번에는 brute force(평균) 방법으로 코드의 전체 모드를 생성한다.ICF 코드 검색 데이터베이스에서 생성된 각 코드를 질의로 지정하고 검색 결과에서 데이터를 가져옵니다.
부호화
전체 중,"brute force로 지정한 검색의 ICF 코드 생성"→ "ICF 코드를 screping의 URL에 삽입하여 요청을 보내고 결과를 수신"→ "beautifulsoup을 통해 받은 응답을 해석하고 필요한 데이터를 추출"→ "얻은 데이터를 csv로 출력"등 절차로 코드를 작성합니다.
brute force를 질의로 지정하는 ICF 코드 생성
모든 모드에서'한 글자와 최대 5자리 숫자의 10진수 조합'을 생성합니다!비록 쓰지는 않았지만 자모는 예시 중의'b'뿐만 아니라'b','s','d','e'네 개도 있다.

BSDE = ['b', 's', 'd', 'e']

def icf(n):
  if (int(n/10)):
    return icf(int(n/9)) + str(n%9)
  return str(n%9)

for head in BSDE:
  for N in [1, 2, 3, 4, 5]:
    for i in range(9**N):
      num = icf(i).zfill(N)
      code = head + num
나는 zfill을 사용하는 것이 약간의 기술이 있다고 생각한다.
계산량이 많지만 이번에는 검색에 사용하기 위해 1~5자리 전체 모드를 만들어야 한다. 예를 들어'b00280'을 검색해도'b280 아픈 느낌'의 검색 결과가 나오지 않기 때문에 이렇게 편성했다.
ICF 코드를 롤업 URL에 삽입하여 요청을 보내고 결과를 받습니다.
실제'ICF 코드 검색 데이터베이스'의'ICF 코드 검색'에서 조회'b280'을 지정하면 이동 목적지의 URL은 다음과 같다.
http://www.icfcy-jpn.org/e-angel/icfdb/icfdb_all.cgi?IDv001=&IDn001=AND&keys1=b280&keys2=&keys3=&keys4=&keys5=&keys6=&print=10)
"keys1=b280"과 같이 중간에서 검색을 확인할 수 있습니다. 따라서 brute force로 생성된 ICF 코드를 바꿀 때마다 생성된 ICF 코드를 검색으로 하는 검색 결과를 받을 수 있습니다.
import requests
from urllib.request import urlopen

pre_url = 'http://www.icfcy-jpn.org/e-angel/icfdb/icfdb_all.cgi?IDv001=&IDn001=AND&keys1='
post_url = '&keys2=&keys3=&keys4=&keys5=&keys6=&print=1'

url = pre_url + code + post_url #codeは先に生成したICFコード
html = urlopen(url)
beautifulsoup을 통해 받은 응답을 분석하여 필요한 데이터를 추출합니다
from bs4 import BeautifulSoup
write_list=[]

soup = BeautifulSoup(html, "html.parser") #htmlは先の検索結果を格納したもの
try:
  table = soup.findAll("table")[0]
  rows = table.findAll("td", {"width":"85%"})
  write_list.append([rows[0].get_text(), rows[1].get_text(), rows[3].get_text(), rows[4].get_text()])
except:
        pass
'ICF 코드 검색 데이터베이스'의 검색 결과를 HTML로 표시하면 테이블로 되돌아오기 때문에 beautifulsoup을 사용하여 테이블 요소만 추출하고, 또 테이블 요소에 필요한 데이터도 추출한다(이번에는'ICF 코드','제목','분류','해설'만 추출한다).
여기에서 'b00280' 을 검색해도 0 을 통해 'b280' 을 칠 수 없기 때문에 0 개를 칠 수 있습니다. 만약 이런 경우를 가정하면try &except로 오류 처리를 기술합니다.
얻은 데이터를 csv로 출력하다
import csv

with open('icf_database.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerows(write_list) #write_listには抽出した必要なデータが二次元配列で格納されている
"ICF 코드 검색 데이터베이스"
그림에서 보듯이 csv를 excel에 가져오면 ICF 데이터베이스를 얻을 수 있는지 확인할 수 있습니다. 코드를 어지럽히려면 문자 코드가 [UTF-8]인지 확인하십시오.

좋은 웹페이지 즐겨찾기