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 과정
- 라이브러리 불러오기
- url 설정
- requests.get(), status_code
- pd.read_html로 테이블 정보 읽어오기
- html 태그로 파싱 : html = bs(response.text)
- 태그 찾기
- 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")
- 빈 리스트를 만들어서, 찾은 정보를 담기 : 컬럼 생성해서 table에 추가
- 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문제
- 맞았지만 헷갈렸던 것
- 한국어판 엑셀에서 csv 파일을 읽을 때 별도의 설정 없이 한글 인코딩이 깨지지 않기 위해 설정하는 인코딩으로 적당한 것은? cp949 (utf-8 아닌 것을 기억하자!)
해결과제
- 0206번 실습파일 get_desc(response) 함수 이해하기
나는 왜 inspect-network에서도 이 형식의 url이 안찾아지지?!!
https://opengov.seoul.go.kr/civilappeal/view/?nid=23194045
해결 : 으쌰팀 동기님이 도와주셨다! 딱 원하는 '문서본문' 란에서 inspect 해야지 저 링크가 network에 뜬다.
댓글