[TIL]스파르타 코딩클럽 사전시험 준비 - 4!

안치영·2022년 8월 26일
0

TIL

목록 보기
4/15
post-thumbnail

파이썬 간단한 문법 / requests 라이브러리 활용하기 / 네이버영화 크롤링하기

파이썬의 함수 형식

def sum(a,b):
    print('더하자!')
    return a+b
    
result = sum(1,2)
print(result)

자바와는 다르게 함수 앞에 "def" 라는 것이 들어가고 {}중괄호 대신 " : "로 쓴다는 것을 알 수 있었다.
sum()에는 동일하게 매개변수가 들어간다.


리스트(List) for문 출력하기

fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']

for fruit in fruits:
    print(fruit)

원래 자바에서는
for(int i=0; i<fruits.length; i++){}

이렇게 for문을 사용했는데 파이썬은 굉장히 직관적이고 알아보기도 쉽다.
출력문도 그냥 print() 하나로 너무 간단하다


딕셔너리 활용해서 나이20세 이상인 사람 이름 출력하기

people = [{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27}]

for person in people:
    if person['age'] > 20:
        print(person['name'])

if문에 딕셔너리의 키값을 이용해서 조건식을 만들 때
딕셔너리명['키명'] 으로 사용한다는 점을 알게 되었다.


라이브러리 활용해서 서울시 미세먼지농도 40미만인 지역 출력하기

라이브러리를 사용하려면 먼저 설치를 해주어야 한다.

설치 방법 ▼

저는 Pycharm을 사용했습니다.

좌측상단에 파일버튼 → 설정 → 프로젝트에 python인터프리터 → +버튼 눌러서 라이브러리명 검색 후 설치

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

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

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

print(rjson)

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

먼저 라이브러리 import를 해주고 저 형식에서 원하는 데이터 url을 붙여넣기 후 사용하면 된다.

rows = rjson[][] 에는 전 시간에 jquery에서 할때 했듯이 똑같이 해주면 된다.


네이버영화 크롤링 하기(BeautifulSoup의 bs4 라이브러리 활용) ▼

네이버영화 사이트에서 크롤링 해온것을 바탕으로 영화순위,영화제목,평점 출력해보는 것을 해봤습니다.

하기전에 bs4라는 라이브러리를 먼저 import 해줬습니다.

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')
print(soup)

먼저 네이버영화 사이트에서 크롤링해온 것을 라이브러리를 사용해서 출력을 해보니 사이트의 html문이 전부 출력되었습니다.

title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(title)
print(title.text)
print(title['href'])

다음으로는 하나의 영화만 가져왔는데, 하나만 가져올때는
soup.select_one()으로 가져옵니다.
one() 안에는 가져오고싶은 html문을 가져오는건데, 저는 영화제목을 개발자도구로 봐서 복사해왔습니다.(copy selector로 가져오기)

그러고 title만 찍어봤을때

<a href="/movie/bi/mi/basic.naver?code=186114" title="밥정">밥정</a>

이렇게 찍혔고

title.text를 찍었을때는

밥정

이라고 찍혔고,

title['href']를 찍었을때는

/movie/bi/mi/basic.naver?code=186114

이렇게 경로를 가져오는 모습을 볼 수 있었습니다.

이것을 활용해서 영화순위,영화제목,평점 가져오기를 해봤습니다.

movies = soup.select('#old_content > table > tbody > tr')
for movie in movies:
    a = movie.select_one('td.title > div > a')
    if a is not None:
        title = a.text
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        star = movie.select_one('td.point').text
        print(rank,title,star)

영화순위,제목,평점을 복사해서 보니
soup.select()안에있는 '#old_content > table > tbody > tr' 까지 모두 같음을 확인했고 이것을 movies라는 변수에 저장해주었습니다.

그러고 영화가 여러개 있었기때문에 for문을 사용했습니다.

처음에는 제목만 출력해보기 위해 a라는 곳에 제목정보를 넣어놓고 출력해보니

위와같이 None이라고 반복적으로 나오는것이 있어서
if a is not None이라는 조건식을 걸어주었습니다.

나머지 rank와 star도 위에와 똑같은 방식으로 출력을했는데
rank같은 경우에는 alt값을 가져와야했는데,

어떻게 가져와볼까 생각해봤더니 ['alt']로 가져오는 방법이 생각이나서 해봤더니 잘 나왔다.

출력결과


이렇게 원하는 데이터를 크롤링해와서 원하는 값만 출력해보고 사용해보니 꽤 재밌었고 데이터를 어떤식으로 활용해야하는지 감이 잡히기 시작했습니다!

0개의 댓글