웹 개발 종합 클래스 3주간_크롤링

  • by

오늘은 파이썬을 사용하여 웹을 크롤링하는 방법을 공부했습니다.

혼란도 했지만, 방법에 그리 어렵지 않기 때문에 익숙해지면 곧바로 활용할 수 있다고 생각한다🤔

목차

    크롤링 기본 설정

    import requests
    from bs4 import BeautifulSoup
    
    # 타겟 URL을 읽어서 HTML를 받아오고,
    headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
    
    # HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
    # soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
    # 이제 코딩을 통해 필요한 부분을 추출하면 된다.

    soup = BeautifulSoup(data.text, 'html.parser') ############################# # (입맛에 맞게 코딩) #############################

    BeautifulSoup 내 선택에서 미리 정의 된 방법

    # 선택자를 사용하는 방법 (copy selector)
    soup.select('태그명')
    soup.select('.클래스명')
    soup.select('#아이디명')
    
    soup.select('상위태그명 > 하위태그명 > 하위태그명')
    soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
    
    # 태그와 속성값으로 찾는 방법
    soup.select('태그명(속성="값")')
    
    # 한 개만 가져오고 싶은 경우
    soup.select_one('위와 동일')

    Quiz – 지니 1위~50위 곡을 스크레이핑 해 본다

    나가야 할 결과


    더 보기


    0) 출력할 때는 print(rank, title, artist) 한다!

    1) 전부터 2문자만 자른다!
    text(0:2) 쓰기

    2) 여백이나 다른 문자가 나오면 파이썬의 내장 함수 인 strip을 사용합니다.

    내 코딩 결과


    15위 Peaches를 제외한 값은 올바르게 출력되었다.

    Peache 여백이 발생한 이유를 확인해 보면,19라는 코드를 가졌다

    더 보기

    <15位 Peaches titleコード>


    19

    ✔️
    Peaches (Feat. Daniel Caesar & Giveon)

    <14位 Rollin titleコード>

    롤린(롤린’)

    해결 방법 ⭐

    19삭제하는 코드가 무엇인지 보았습니다.

    “BeautifulSoup에서 하위 태그를 제외한 상위 태그의 텍스트만 추출” 라는 문장이 있고, 대표적인 방법이다 decompose()그리고 extract()를 찾을 수 있었다.

    decompose() 코드 사용

    soup.find('span', class_='icon icon-19').decompose()
    1. soup에서 find 메소드를 사용하여 span 및 class_=’icon icon-19′ 찾기
      (은 하위 부모 span에 포함되어 있습니다)
    2. decompse() 메서드를 사용하여 find 값 삭제

    최종 코드

    import requests
    from bs4 import BeautifulSoup
    
    headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    data = requests.get('https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701',headers=headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')
    soup.find('span', class_='icon icon-19').decompose()
    
    
    
    trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
    
    
    for tr in trs:
        title = tr.select_one('td.info > a.title.ellipsis').text.strip()
        rank = tr.select_one('td.number').text(0:2).strip()
        name = tr.select_one('td.info > a.artist.ellipsis').text
        print(rank, title, name)