구청의 PDF를 반나절에 웹 앱화 (Part 2. PDF 데이터 캡처)

7231 단어 Python3PDFtabula

소개



코로나 대책의 일환으로 테이크 아웃 영업으로 전환하여 영업하는 지역의 가게가 많이 있습니다. 다만, 어디에서 테이크아웃 영업을 하고 있는지, 주지가 과제입니다. 분쿄구에서도 테이크아웃 영업을 모색하고 있는 가게가 많아 구도 이를 지원하는 활동을 시작했습니다. ( 출전·반입 가능점을 일람에 분쿄구 등 리스트 작성 닛케이 신문 4월 3일 )
하지만 현재 이 목록는 PDF 형식이었습니다. 스마트폰에서 볼 수 있듯이 그래야만 가치가 있어야합니다. 그래서 PDF의 데이터를 엑셀로 추출해 보기로 했습니다.

PDF 데이터를 엑셀로 추출



tabula-py를 시도한 결과 충분한 데이터를 추출할 수 있었습니다. 성공 사례를 간단히 정리해 둡니다.
물론, 원래가 되는 PDF의 만드는 방법이나 구조 등에 크게 좌우되기 때문에, 개별의 정보원에 대해서 시행착오는 필요하게 된다고 생각합니다.

환경


  • Windows10 Pro ver 1909
  • Anaconda python 3.7
  • Java 1.8.0_241

  • 라이브러리 도입



    pandas와 openpyxl (도입 어려웠습니다), 그리고 tabula-py를 anaconda로 도입했습니다.conda install -c conda-forge tabula-pytabula-py 개발자는 windows에서의 동작을 직접 확인하지 않은 것 같습니다. 이번에는 Java8을 설치하면 tabula가 작동합니다.했습니다.

    테이블 캡처




    PDF 테이블은 11개 컬럼, 처음에는 13페이지의 파일이었습니다. 갱신되어 향후는 길어져 가는 것이 상정됩니다. 여러 번 tabula에서 로드를 시도하여 이런 사실을 발견했습니다.
  • 각 페이지 4개씩 있는 테이블의 마지막을 원하는 데이터(그렇다고 tabular는 인식한다)
  • 뒷면에서는 에러 메시지도 뱉고 있지만 실용적인 데이터를 얻을 수 있습니다

  • 각 페이지의 테이블에 관한 헤더는, 최초의 1 개(살)만을 카피해 전부 연결해 DataFrame 를 조립하기로 했습니다.
    셀내 개행은, 분명히 불필요한 칼럼(점명, 주소)과, 메뉴 등, 통일이 잡히지 않은 셀이 있었습니다. 통일되지 않은 칼럼에 대해서는, 손을 넣지 말고, 필요하다면 엑셀상에서 대처하기로 합니다. (혹은, 대응하지 않는다, 라고 나누는다)
    다음은 tabula가 table이라고 인식하는 것이 각 페이지에 4개씩 있을 때 동작하는 코드 예입니다. (상기 스크린샷일 때는 각 페이지 3개였습니다. 포맷 변경에 유연하게 대응하는 것이 중요합니다.)

    TakeOutPDF_read.py
    import tabula
    import pandas as pd
    
    b_df_a = tabula.read_pdf('Bunkyo_list_0409.pdf', multiple_tables=True, lattice=True, pages='all')
    
    BoxPerPage = 4  # table と認識するものが各ページに 4 個ずつあった。 
    tindex = range(BoxPerPage - 1, len(b_df_a))  # [3, 7, 11, ...]
    btakeout_df = pd.concat([b_df_a[i] for i in tindex])
    btakeout_df = btakeout_df.drop(index=0)
    btakeout_df[4] = btakeout_df[4].str.replace('\r', '')  # 店舗名 
    btakeout_df[6] = btakeout_df[6].str.replace('\r', '')  # 住所
    hd = b_df_a[BoxPerPage - 1].iloc[0]
    btakeout_df.columns = hd.values
    
    btakeout_df.to_excel('Bunkyo_takeout_list_0409b.xlsx', index=False)
    

    이제 .xlsx 파일을 만들 수 있습니다.
    btakeout_df.head(3) 로서 DataFrame 를 확인하면, 개행이 `\r' 가 되어 있습니다만, 데이터는 읽고 있을 것 같습니다. 데이터 건수 등도 확인했습니다.



    그 후의 프로세스


  • Excel 파일에서 줄 바꿈 조정 등.
  • Google 드라이브에 업로드하여 스프레드 시트로 변환
  • Glide을 사용하여 PWA 사이트를 만들었습니다.
    분쿄 테이크 아웃 : 쿵캬타케오 ts.ぃ이고 p. 이오/
    작업 노트 Part 1. 구청 PDF를 반나절에 웹 앱화을 Note에 썼습니다. 무료 플랜이라면 500 레코드가 상한입니다.
  • 나중에 눈치챘습니다만, 코로나 대책의 지역 정보 사이트등을 Glide 로 만들고 있는 사람이 전세계에 많이 같습니다.
  • PDF 데이터 캡처부터 GlideApp 작동까지 처음으로 3-4시간이 지났습니다. 삼키기를 누르면, 작은 사이트는 1-2 시간으로 만들 수 있을 것 같습니다.
  • 좋은 웹페이지 즐겨찾기