course/spartacoding

[웹개발 종합반] 3주차 (3) 웹 스크래핑

hjkim0502 2021. 11. 1. 19:28
  • 웹 스크래핑(웹 크롤링) : 라이브러리를 활용해 내려받은 html 에서 내가 원하는 정보 솎아내는 것
  • 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://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)
    
    # requests로 불러온 html 정보를 soup 변수에 담기
    soup = BeautifulSoup(data.text, 'html.parser')
    
    # 태그 하나만
    # 웹에서 원하는 부분 검사 후 copy selector해서 붙혀넣기
    title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
    
    # 불러온 태그 세부정보
    print(title.text)
    print(title['href'])
    
    # 태그 여러개 -> 리스트
    # 구조 파악해서 상위 태그 붙혀넣기
    movies = soup.select('#old_content > table > tbody > tr')
    
    # movies (tr들)의 반복문 돌리기
    for movie in movies:
        # movie 안에 a 가 있으면,
        a_tag = movie.select_one('td.title > div > a')
        if a_tag is not None:
            # a의 text를 찍어본다.
            print (a_tag.text)
  • 웹페이지 마다 구조가 다르므로 전략을 그때마다 다르게 설정
  • # 선택자를 사용하는 방법 (copy selector)
    soup.select('태그명')
    soup.select('.클래스명')
    soup.select('#아이디명')
    
    soup.select('상위태그명 > 하위태그명 > 하위태그명')
    soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
    
    # 태그와 속성값으로 찾는 방법
    soup.select('태그명[속성="값"]')
    
    # 한 개만 가져오고 싶은 경우
    soup.select_one('위와 동일')
  • 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://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')
    
    movies = soup.select('#old_content > table > tbody > tr')
    print(movies)
    
    for movie in movies:
        rank = movie.select_one('td.ac > img')
        title = movie.select_one('td.title > div > a')
        point = movie.select_one('td.point')
        if title is not None:
            print (rank['alt'], title.text, point.text)
    웹 크롤링 연습 (랭킹, 제목, 별점 정보 가져오기)