본문 바로가기
부트캠프(LIKELION AIS7)/수업

[AI스쿨 7기, 3주차] 서울특별시 다산콜센터의 자주 묻는 질문 데이터 스크래핑

by aimaimee 2023. 4. 14.

221004 0205, 0206 실습파일 / 06번 강의파일 / 서울특별시 다산콜센터의 주요 민원(자주 묻는 질문) 내용 스크래핑/ 수도코드 / try-except / 반복문으로 여러 페이지 수집/ set_index.T / get_desc함수정의 (Status Code, Fetch/XHR, JS, BeautifulSoup, 파싱, xml, Json, tqdm, 저작권, HTML, 404에러, get_one_page함수, try-except 등)

멋쟁이 사자처럼 AI스쿨 7기, 박조은 강사님 강의

✅ 0205 실습파일, 06번 강의파일

오늘 데이터 수집의 목표 : 목록만 수집하는 것이 아니라 내용까지 수집

1. 들어가기 전

1.1 Insert-Network

  • GET / POST 방식을 알아볼 수 있다. Payload에서 GET은 Query String이 뜨고, POST는 Form Data가 뜬다.
  • Status Code : 200 OK 정상응답
  • Fetch/XHR : 비동기통신을 통해 전송 ex) 누군가가 메시지를 남기고 있습니다. 와 같은 문구
  • JS : 자바스크립트나 JSON ex) getGnbJson 파일에서 Preview로 보면 jQuery~(callback)로 시작하는 부분을 제외하고 데이터 수집

1.2 BeautifulSoup

  • 읽어온 웹 사이트의 HTML 문서를 해석하는 목적
  • 데이터 수집 도구가 아니다!! : 파싱 도구. HTML을 보기 좋게 편집해준다.
  • with 구문 : 사용이 끝나면 메모리를 해제해줘라. 파일 오픈할 때 사용
  • response에서 BeautifulSoup으로 해석해준다.
  • xml을 hierarchy로 접근해서 불러오자 할 때는 xml 파서를 사용
  • Json은 BeautifulSoup 말고 Json 모듈을 사용하면 된다.

1.3 tqdm

반복되는 오래 걸리는 작업을 할 때 진행 상태 확인

1.4 저작권

Q. 네이버 증권 게시판에 글을 쓰면 글의 저작권은 어디에? 데이터베이스권은 네이버에 있으며, 저작권은 나에게 있다.

1.5 HTML

  • 특정 태그의 텍스트를 찾을 때 BeautifulSoup을 통해 가져온다.
  • id속성, class속성
  • id 값 앞에서는 #이 붙고, class 앞에서는 . 이 붙는다.
  • id는 하나의 요소에만 적용할 수 있다.

1.6 데이터 수집 시작 전, 과정 목록을 스스로 짜보기

  • Q. 목록을 수집할 때는 tqdm을 못 쓸수도 있다. while로 수집할 경우 범위가 정해져 있지 않아서
  • Q. 한꺼번에 가져가는 것을 보통 막아두는 이유는? 서버부담

2. 0205 실습파일

2.1 데이터 수집

  • 페이지를 바꿔보면 network 탭에서 따로 찾을 필요 없이 주소창에서 그냥 보인다.
  • pd.read_html : cp949 인코딩 에러 -> utf-8
  • Q. 왜 table이 잘 불러와졌는데, request를 통해서 사이트를 받아와야 할까? 상세정보(링크) 수집을 위해서
  • 찾으려는 페이지 주소가 없을 때 : 404 에러 ex) 번호를 주소창에 치면 뜬다.
  • tr의 몇 번째 것이냐. tr:nth-child(1) : ()안의 숫자가 바뀐다.

2.2 과정

  1. 라이브러리 불러오기
  2. url 설정
  3. requests.get(), status_code
  4. pd.read_html로 테이블 정보 읽어오기
  5. html 태그로 파싱 : html = bs(response.text)
  6. 태그 찾기
    • a_list = html.select("#content > div > div.view-content > div > table > tbody > tr > td.data-title.aLeft > a"))
    • a_list = html.select("td.data-title.aLeft > a")
  7. 빈 리스트를 만들어서, 찾은 정보를 담기 : 컬럼 생성해서 table에 추가
  8. get_one_page(page_no) 함수 만들기

2.3 없는 페이지 확인

  • Q. get_one_page(page_no=500)일 때, 어디에서 오류가 났을까? 3번 테이블[0]에서 오류
  • try: except: 를 통해 오류가 발생한 부분 찾아본다.
  • Q. 예외 상황에서 꼭 고쳐야 하는 심각한 것? 보안이슈
  • 반복문 종료 조건
  • df_temp.shape[0] == 0 은 str이 아니라는 오류가 난다.
  • 타입이 str일 때

3. 0206번 실습 파일

  • div > div > div.line-all 헷갈린다면 inspect 창 맨 밑에 경로가 보이니 참고
  • .get_text() 하면 \xa0 - \xa0과 같은 아스키 코드가 같이 나오기 때문에 전처리 과정이 필요하다.
  • T == transpose() : 0번 1번 칼럼만 가져오고, 0번을 인덱스로 만들어줌. .set_index(0).T
  • 인덱스로 만들어주지 않고 전치행렬을 하면 컬럼 이름이 되지 않는다. ex) table[[2,3]].T는 전치만 된다.
    +) 221006. 전치만 되면
    | | 제공부서 | 생산일 | 분류 |
    |1 | 서울산업진흥원 | 2021-06-29 | 경제 |
    이 나오는게 아니라
    | | 0 | 1 | 2 |
    | 1 | 제공부서 | 생산일 | 분류 |
    | 2 | 서울산업진흥원 | 2021-06-29 | 경제 |
    이렇게 나온다.

퀴즈

10 / 10문제

  • 맞았지만 헷갈렸던 것
  1. 한국어판 엑셀에서 csv 파일을 읽을 때 별도의 설정 없이 한글 인코딩이 깨지지 않기 위해 설정하는 인코딩으로 적당한 것은? cp949 (utf-8 아닌 것을 기억하자!)

해결과제

  • 0206번 실습파일 get_desc(response) 함수 이해하기
  • 나는 왜 inspect-network에서도 이 형식의 url이 안찾아지지?!!
    https://opengov.seoul.go.kr/civilappeal/view/?nid=23194045

    해결 : 으쌰팀 동기님이 도와주셨다! 딱 원하는 '문서본문' 란에서 inspect 해야지 저 링크가 network에 뜬다.

댓글