19. requests.get('')으로 url속 html 받아온 뒤 -> bs4를 이용한 < 해당페이지 scrapping >
2019. 1. 1. 20:48
프로젝트 : web_scraping_study_no1
파일명 : watch_court.py
requests 패키지 설치 및 requests.get('') 이용하여 홈페이지에서 주소 가져오기
- 어떤 사이트의 게시판에 들어갔을 때, request url이 안뜰 수 있다.
- 이럴 때는, 게시판의 2번째 페이지를 눌러서, 다시 1페이지로 오자. - 이제 파이썬 파일을 하나 만들고, bs4를 import한 뒤, reponse에다가 requests.get()의 인자에다가
홈페이지 url을 담아주자.
- 여기서 빨간줄이 뜨는 이유는 requests.get()함수를 사용하기 위한 패키지가 필요하기 때문이다.
설정 > interpreter > requests 를 검색해서 패키지를 설치하자.
*** request가 아니라 requests - requests 패키지를 import하고 url은 문자열로 담아주자.
- response에서도 .text만 받아서 html 변수에 넣어준 뒤,
html변수에 담긴 것을 print해보면 잘 나오는 것 같다.
requests로 긁어온 html(문자열)을 bs4를 이용해서 정보 빼내기
- 이전시간과 같이, soup변수에 "lxml"parser를 사용한 beautifulsoup()를 이용해서 정보를 가져오고,
- soup에서 body만 가져와보자
- 하지만 body의 양이 방대하게 많으므로, 우리가 필요한 정보만
해당 사이트 [ Ctrl + u ] 를 이용해서 게시판의 첫번째 글을 검색하여 위치를 찾아보자. - 이제 저 부분의 html코드 구조를 파악해야한다.
- <td>는 한칸이다. -> 한줄을 의미하는 <tr>이 있을 것이다.
- <tr> = 한줄 상위에는 table이 있을 것이다. 머리말이 있는 게시판이면 -> <thead>와 <tbody>가 있을 것이다.
- <thead>바깥에 <table>이 있을 것이다.
- <table>바깥은 봤더니 -> 구획을 나누어주는 <div>태그 + id속성이 같이 있다.
- id = 속성은 한 페이지당 단 1개를 특정짓는 것이므로 id = "ea_list"를 가진 <div> 집중공략할 준비를 한다.
table(게시판)은 한 페이지에 여러개가 있을 수 있기 때문에,
==> ea_list라는 id를 가진 <div>태그를 먼저 찾자! - body.find(id=) 함수를 이용해, div태그를 적어주는 것 없이 바로 그 위치를 찾아, 그 아래구조들을 다 찾아준다.
변수명은 div태그까지 포함시켜서 만들어 구조를 파악하기 쉽게해준다. - id = 'ea_list'로 검색한 결과는 <div>태그 부터 시작한다.
div -> table -> tbody 까지 내려가자. 그 안의 tr/td를 받아올 것이다. - tbody속에는 여러개의 tr태그를 가지고 있기 때문에,
.find_all('tr')을 통해 tr들을 다 가져온 뒤 : lines --> for문으로 한줄씩 받은 것을 print로 확인하자. - 각 tr안에서도 여러개의 td들을 가지고 있다. ---> find_all('td')를 통해 td들을 개별적으로 다 받아오자.
- for문 속 각 tr(line)들에 대해 여러개의 tr을 받아오고, 그 중 첫번째 칸만 출력해보자.
- 날짜 정보는 우리가 원하는게 아니다. - 2번째 칸을 출력해보고, 맞으면 .text를 붙혀서 텍스트 정보만 가져오자.
- for문 안에서 원하는 정보를 각 루프마다 확인했다. 이것을 계속 쓸 수 있는 변수에 받기 위해 for문 전에 미리 리스트를 생성해야하고,
각 루프속에서 append()로 넣어줘야할 것이다. - 이 때, [ 날짜, 의안, 작성자 ]의 3개의 정보 한묶음으로 --> bill_list로 정보를 전달해주려면
그러므로 위 처럼 1차원 리스트가 아니라 2차원의 리스트형태가 되도록
미리 리스트형태로 append( [ 1, 2, 3] ) 를 해줘야, bill_list는 2차원 리스트가 될 것이다.
*** 2차원 리스트를 이쁘게 확인하려면, for문을 써서 확인한다.
*** 2차원 리스트로 만들어야만 --> pandas에 담을 수 있고 --> 엑셀로 저장할 수 있다!*** - 한가지 정보를 더 추가해보았다(5번째 칸, 진행상태)
가져온 2차원 리스트의 정보--> pandas에 담고 --> 엑셀로 저장하기
- pandas 패키지 설치 및 import
- pandas.to_excel() -> .xlsx 저장을 위한 : openpyxl 패키지 설치
- pd.DataFrame()으로 bill_list를 df에 담기 *2차원 리스트여야 df에 담을 수 있다!
- pd.to_excel('bill.xlsx')로 저장하기
- 엑셀파일을 열어보니,, 칼럼명이 없다.
my) table -> thead -> th(머리말 한칸)들에서 가져오자.
그리고 받은 정보를 pandas의 df생성시 columns=[]인자를 이용해서 적어주자.
*** 그냥 손으로 적어줘도.. 될 듯.. - my) index(행 번호)도 옵션으로 주어 없애보자.
한 페이지가 아니라 여러 페이지를 다 해보자.
맨 처음 홈페이지 주소를 가져온 url 에서 page=1 ---> page2, 3, 4, ...로 바뀌어야할 것이다.
- 이럴 때, 해야할 게, '문자열' 이므로 ' {} ' . format( i )을 이용하여 변수로 둔 다음, for문으로 돌리는 것!
이 때 조심해야할 사항이 있다. - for문은 range(1, 100) --> 1page부터 시작할 것
- bill_list()는 page를 돌리는 for문보다 더 바깥으로 빼야한다. * 페이지를 돌면서 계속 append될 것
- pandas에서 엑셀로 저장하는 부분은 for문 안에 안들어갈 것.
- 100page 모두 스크래핑 한 결과
'빅데이터 관련 프로그래밍 > Python3 기초 및 업무자동화' 카테고리의 다른 글
20. [ selenium의 webdriver() / implicitly_wait() / WebDriverWait() + EC + By ==> bs4 ]를 이용한 연결된 페이지를 타고가서/기다렸다가 ==> 추가정보를 scrapping하는 crawling (0) | 2019.01.03 |
---|---|
18. BeuatifulSoup4 설치 및 예제 홈페이지 스크래핑 해보기 (0) | 2018.12.30 |
17. 웹스크래핑 시작하기 - HTML 이해 / CSS from bootstrap (0) | 2018.12.30 |
16. pandas를 이용해 차트그리기 (1) | 2018.07.11 |
15. pandas로 excel파일 읽고 / 쓰기 (0) | 2018.07.09 |