파이썬

[파이썬] 웹스크래핑(크롤링)

개미는내일도뚠뚠 2022. 1. 22. 15:05

네이버 영화사이트에서 영화랭킹의 '영화 제목들'을 크롤링해보겠다.

 

우선 패키지(라이브러리)를 설치해야함.

 

[requests] 설치

 

1. 좌측상단 [파일]버튼 클릭

2. [설정]버튼 클릭

3. 좌측 메뉴에서 '프로젝트:pythonprac'누르고 하단에 생기는 메뉴 중 'Python 인터프리터' 클릭

4. 우측 창에서 '+' 버튼 클릭

5.검색창에서 'requests' 입력하고 하단에 [패키지 설치] 버튼 클릭

 

이게 일종의 ajax 역할을 함.

 

기본 골격

import requests  # requests 라이브러리 설치 필요

r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()

url주소(서울시 미세먼지 지수)의 값을 일어들어서 'r'에 담고있음. print(rjson) 실행시키면 다음과 같이 나옴.

 

{

  'RealtimeCityAir' : {'RESULT' : {'CODE' : 'INFO-000','MESSAGE' : '정상 처리되었습니다'}},

  'row' : [

    {

     'ARPLT_MAIN' : 'N02',

     'IDEX_MVL' : 82.0,

     'IDEX_NM' : '보통',

     'MSRDT' : '202201221100',

     'MSRRGN_NM' : '도심권',

     'MSRSTE_NM' : '중구',

     'N02' : 0.049,

     '03' : 0.005,

     'PM10' : 50.0,

     'PM25' : 40.0,

     'S02' : 0.004

    },

     ...

  ]

}

 

import requests  # requests 라이브러리 설치 필요

r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()

rows = rjson['RealtimeCityAir']['row']

for row in rows:
    gu_name = row['MSRSTE_NM']
    gu_mise = row['IDEX_MVL']
    print(gu_name,gu_mise)

위와 같은 방법으로 지역과 미세먼지지수를 출력할 수 있음.

조건문을 넣어서 출력해보았다.

 


 

지금까지 [requests]의 사용예제를 알아보았고 본격적으로 웹스크래핑(크롤링)을 해보겠다.

이제 네이버 영화 사이트에서 영화랭킹에서 '영화제목'만을 크롤링해보겠다.

 

[requests]패키지를 설치했으면 다음에는 [BeautifulSoup]을 설치해야한다. [requests]와 같은 방식으로 진행한다.

 

[BeautifulSoup] 설치

 

1. 좌측상단 [파일]버튼 클릭

2. [설정]버튼 클릭

3. 좌측 메뉴에서 '프로젝트:pythonprac'누르고 하단에 생기는 메뉴 중 'Python 인터프리터' 클릭

4. 우측 창에서 '+' 버튼 클릭

5.검색창에서 'bs4' 입력하고 하단에 [패키지 설치] 버튼 클릭

 

기본 골격

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.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

위가 beatifulSoup의 기본 사용 방법이다. 파이썬이 아니라고한다..

위 예제에서 'requests.get( url ,headers=headers) ' 이 url은 네이버 영화사이트의 url 주소이다. headers의 역할은 강의에서는 마치 브라우저가 콜을 날리는거처럼 해주는 역할이다라는 설명을 들었는데 무슨말인지 잘 이해가 안가서 따로 찾아봤는데 대부분 너무 자세하게는 이해하려하지않고 저 형식만 익혀두고 사용하는거 같아서 나도 일단 그냥 넘어가기로했다.

그리고 soup를 print하면 해당 사이트의 html을 전부 긁어온 것을 확인할 수 있음.

 

이제 랭킹에서 영화 제목만 가져와보자.

우선 아무 영화제목에 커서를 두고(난 랭킹1위로 했음) 오른쪽 클릭을 하고 '검사'를 누르면 개발자도구 창이 나오면서 해당 영화제목의 html요소가 바로 나옴.

 

그러면 개발자도구창에 나온 해당 html요소에서 커서를 두고 오른쪽 클릭해서 Copy -> Copy selector 를 함.

 

그리고 해당 요소를 출력을 해볼건데, 여기에 'select' , 'select_one' 두가지 함수가 있음.

 

select는 요소들이 배열로 담기고, select_one은 해당요소 하나만 가져오게 되는데 보통 'href' 와같은 링크 텍스트, 주소만 가져오고 싶을때 적합하다.

일단 select_one 으로 좀전에 copy한 것을 붙여넣고 출력해보자.

해당 html요소가 출력되었다. 여기서 영화제목만 출력해보겠다. 일단 select_one의 리턴값을 title이라는 변수에 넣어주고 출력해보겠다.

만약 href 값만 불러오고 싶으면 다음과 같은 방법으로 출력할 수 있다.

href 값이 출력된 것을 확인할 수 있다.

 

 그러면 하나의 타이틀이아니라 전체의 타이틀을 가져와보자.

우선 아까와같이 영화타이틀에 마우스 커서를 두고 오른쪽 클릭해서 Copy selector 할건데 두개카피해서 파이썬에 복붙해보자.

복사한 2개를 비교해보면 '... table > tbody > tr' 까지는 일치하는 걸 확인할 수 있음. 그러면 '... table > tbody > tr' 까지만 'soup.select('여기에작성')' 안에 작성하고 변수에 담아 출력해보자. 그러면 #old_content안에 table 안에 tbody안에있는 tr들이 리스트로 저장되어 쭉 출력이 된다.

'순위,영화명,평점,변동쪽' 이 한 줄이 tr 한줄의 내용이다. 저 줄들의 html요소들이 리스트에 담겨 출력된 것이다.

그러면 이제 저 tr태그 안에 a태그의 내용들만 출력해보자. movies안에 배열이 들어있으니 for문을 이용해보았다. a라는 변수에 담고 a 를 출력하게 해주면 a태그의 내용들이 출력되었다.

 

여기서 'None'은 구분선(그냥 아무내용없는 tr 태그였음)이다.

개발자 도구로 좀더 자세히 봐보자

그냥 구분선 역할을 하는 것이기에 None으로 나온것이다.

 

그러면 if 문으로 None이 아닌 요소들의 영화제목만 출력해보겠다.

흔히 자바나 자바스크립트에서 != 또는 !==(자바스크립트) 를 사용하지만 파이썬에서는 좀 더 직관적으로 'is not' 을 쓴다. 물론 파이썬에서 !=도 되긴함.

이렇게 원하는대로 네이버 영화사이트에서 랭킹의 영화제목들만 크롤링해 보았다.