프로젝트 : web_scraping_study_no1
파일명 : watch_court.py

requests 패키지 설치 및 requests.get('') 이용하여 홈페이지에서  주소 가져오기

  • 어떤 사이트의 게시판에 들어갔을 때, request url이 안뜰 수 있다.
    image

    - 이럴 때는, 게시판의 2번째 페이지를 눌러서, 다시 1페이지로 오자.

    image
    image

  • 이제 파이썬 파일을 하나 만들고, bs4를 import한 뒤, reponse에다가 requests.get()의 인자에다가
    홈페이지 url을 담아주자.
    image


  • 여기서 빨간줄이 뜨는 이유는 requests.get()함수를 사용하기 위한 패키지가 필요하기 때문이다.
    설정 > interpreter > requests 를 검색해서 패키지를 설치하자.
    *** request가 아니라 requests
    image

    image


  • requests 패키지를 import하고 url은 문자열로 담아주자.
    image

  • response에서도 .text만 받아서 html 변수에 넣어준 뒤,
    html변수에 담긴 것을 print해보면 잘 나오는 것 같다.
    image


requests로 긁어온 html(문자열)을  bs4를 이용해서 정보 빼내기

  • 이전시간과 같이, soup변수에 "lxml"parser를 사용한 beautifulsoup()를 이용해서 정보를 가져오고,
  • soup에서 body만 가져와보자
    image


  • 하지만 body의 양이 방대하게 많으므로, 우리가 필요한 정보만
    해당 사이트 [ Ctrl + u ] 를 이용해서 게시판의 첫번째 글을 검색하여 위치를 찾아보자.
    image
    image

  • 이제 저 부분의 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태그까지 포함시켜서 만들어 구조를 파악하기 쉽게해준다.
    image


  • id = 'ea_list'로 검색한 결과는 <div>태그 부터 시작한다.
    div -> table -> tbody 까지 내려가자. 그 안의 tr/td를 받아올 것이다.
    image


  • tbody속에는 여러개의 tr태그를 가지고 있기 때문에,
    .find_all('tr')을 통해 tr들을 다 가져온 뒤 : lines --> for문으로 한줄씩 받은 것을 print로 확인하자.
    image

  • 각 tr안에서도 여러개의 td들을 가지고 있다. ---> find_all('td')를 통해 td들을 개별적으로 다 받아오자.
    • for문 속 각 tr(line)들에 대해    여러개의 tr을 받아오고, 그 중 첫번째 칸만 출력해보자.
      - 날짜 정보는 우리가 원하는게 아니다.
      image

    • 2번째 칸을 출력해보고, 맞으면 .text를 붙혀서 텍스트 정보만 가져오자.
      image

      image


  • for문 안에서 원하는 정보를 각 루프마다 확인했다. 이것을 계속 쓸 수 있는 변수에 받기 위해 for문 전에 미리 리스트를 생성해야하고,
    각 루프속에서 append()로 넣어줘야할 것이다.
    image


  • 이 때, [ 날짜, 의안, 작성자 ]의 3개의 정보 한묶음으로 --> bill_list로 정보를  전달해주려면
    그러므로 위 처럼 1차원 리스트가 아니라 2차원의 리스트형태가 되도록
    미리 리스트형태로  append( [  1, 2, 3] )
    를 해줘야, bill_list는 2차원 리스트가 될 것이다.
    *** 2차원 리스트를 이쁘게 확인하려면, for문을 써서 확인한다.
    *** 2차원 리스트로 만들어야만 -->  pandas에 담을 수 있고 --> 엑셀로 저장할 수 있다!***

    image


  • 한가지 정보를 더 추가해보았다(5번째 칸, 진행상태)
    image


가져온 2차원 리스트의 정보--> pandas에 담고 --> 엑셀로 저장하기

  • pandas 패키지 설치 및 import
  • pandas.to_excel() -> .xlsx 저장을 위한 : openpyxl 패키지 설치
    image
  • pd.DataFrame()으로 bill_list를 df에 담기  *2차원 리스트여야 df에 담을 수 있다!
  • pd.to_excel('bill.xlsx')로 저장하기
    image

    image


  • 엑셀파일을 열어보니,, 칼럼명이 없다.
    my) table -> thead -> th(머리말 한칸)들에서 가져오자.
    그리고 받은 정보를 pandas의 df생성시 columns=[]인자를 이용해서 적어주자.
    *** 그냥 손으로 적어줘도.. 될 듯..
    image

    image

  • my) index(행 번호)도 옵션으로 주어 없애보자.
    image

    image



한 페이지가 아니라 여러 페이지를 다 해보자.

맨 처음 홈페이지 주소를 가져온 url 에서 page=1 ---> page2, 3, 4, ...로 바뀌어야할 것이다.

image

  • 이럴 때, 해야할 게, '문자열' 이므로    '  {} ' . format( i )을 이용하여 변수로 둔 다음, for문으로 돌리는 것!
    이 때 조심해야할 사항이 있다.
    image

    1. for문은 range(1, 100) --> 1page부터 시작할 것

    2. bill_list()는 page를 돌리는 for문보다 더 바깥으로 빼야한다. * 페이지를 돌면서 계속 append될 것
      image

    3. pandas에서 엑셀로 저장하는 부분은 for문 안에 안들어갈 것.
      image

  • 100page 모두 스크래핑 한 결과
    image


+ Recent posts