ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 복습일지 03.5
    개발일지 2021. 9. 5. 03:28

    복습일지 03.5  .5 가 붙은 이유는 스파르톤 진행 중 복습한 내용이기 때문에 양이 너무 많아서 ㅋㅋ

     

    이번 복습은 크롤링에 대한 내용이었다.

     

    확실히 배운지 오래되면 다 까먹는다. 열공 필수!

     

    빈 화면에 멍해지지말고 copy selector을 기억하자 xpath도 사용해본적이 있지만 그건 확실하게 아는게 아니니까 일단 잊기로 했다.

    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.nhn?sel=pnt&date=20200303',headers=headers)
    
    # HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
    # soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
    # 이제 코딩을 통해 필요한 부분을 추출하면 된다.
    soup = BeautifulSoup(data.text, 'html.parser')
    
    #############################
    movie = soup.select('#old_content > table > tbody > tr')
    #개발자도구 > copy selector를 이용한다.
    #헷갈릴땐 같은 맥락 두개를 가져와서 비교해서 쓴다
    #old_content > table > tbody > tr:nth-child(2) > td.title > div > a 1위 영화이름
    #old_content > table > tbody > tr:nth-child(3) > td.title > div > a 2위 영화이름
    
    #old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img 1위 숫자
    #old_content > table > tbody > tr:nth-child(3) > td:nth-child(1) > img 2위 숫자 alt에 순위가 들어있음
    #(<img src="https://ssl.pstatic.net/imgmovie/2007/img/common/bullet_r_r01.gif" alt="01" width="14" height="13">)
    
    #old_content > table > tbody > tr:nth-child(2) > td.point 1위 평점
    #old_content > table > tbody > tr:nth-child(3) > td.point 2위 평점

    모르겠다면 일단 필요한 부분을 copy selector 해와서 비교해보고 시작하면된다.

    for movie_name in movie:
        # a태그 까지 찾아 들어가는 경로를 준다.
        a_tag = movie_name.select_one('td.title > div > a')
        #text를 붙이면 에러가 발생하기 때문에 none이 필요
        #비어있는 항목이 존재하기 때문이다.
        if a_tag is not None:
            a_name = a_tag.text
            #alt는 img 태그속 속성이기 때문에!(이미지 파일이 깨졌을 때 표시할 텍스트를 말한다)
            a_rank = movie_name.select_one('td:nth-child(1) > img')['alt']
            a_score = movie_name.select_one('td.point').text
            print(a_rank, a_name, a_score)

    1위부터 2위~ 쭉 가져오기 위해선 for문을 돌려야한다.

    그렇다면 동일한 부분을 하나의 변수에 때려넣고, 나머지 부분을 for문으로 돌려버린다. 아마도 그런것 같다?

     

    아래의 if문은 text로 출력할때 에러가 뜨거나, 빈공간이 있을때 사용하면 좋다. None값인 태그는 제외해주는 것

    다른 예로 지니뮤직을 크롤링 할 땐 None값이 없었기 때문에 if 문을 만들 필요가 없었다.

     

    지니뮤직은 복습으로 하니까 간단했다규~

    music_list = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
    
    #노래제목
    #body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.title.ellipsis 1위
    #body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.info > a.title.ellipsis 2위
    #순위
    #body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number
    #가수
    #body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis
    for music in music_list:
        title = music.select_one('td.info > a.title.ellipsis').text.strip()
        rank = music.select_one('td.number').text[0:2].strip()
        artist = music.select_one('td.info > a.artist.ellipsis').text
        print(rank,'위',title,'-',artist)

    출력도 완벽했다 ^^

     

    이제 실전 나홀로메모장에 적용시키는 일만 남았다. 그거 하고나면 6시 될것같으니 복습일지 04로 찾아오겠음!

    댓글

Designed by Tistory.