Python, 웹스크래핑(크롤링) 기초

이선민·2021년 4월 20일
0

Python

변수

first_name = 'sunmin' # 'sunmin'을 first_name에 넣는다
last_name = 'lee'     # 'lee'을 last_name에 넣는다
print(first_name+last_name) # sunminlee 출력

# 문자와 숫자를 합칠 경우 
num = 2
print(first_name+num) # TypeError: can only concatenate str (not "int") to str

# 문자열로 형변환
num = str(2) # num = '2'와 같다
print(first_name+num) # sunmin2

자료형

  • List 형

a_list = [1,2,3]
print(a_list) # [1, 2, 3]

# 리스트에 값 추가하기
a_list.append(4) # a_list에 4를 추가한다
print(a_list) # [1, 2, 3, 4]
  • Dictionary 형

a_dict = {'name':'aaa','age':20}
print(a_dict['name']) # aaa 출력
print(a_dict['age'])  # 20 출력

# a_dict에 'height' 추가하기
a_dict['height'] = 180
print(a_dict) # {'name': 'aaa', 'age': 20, 'height': 180}

함수

def sum(num1, num2):    # sum은 이름이고 상황에 맞게 마음대로 정할 수 있다
    return num1 + num2  # num1 + num2의 값 반환
    
result = sum(2,3)       # sum함수에 2와 3을 넣어서 호출
print(result)           # 5 출력

조건문

age = 15
if age > 20:
    print('성인')
else:
    print('청소년') # 청소년 출력, age = 30이면 성인 출력

# 함수로 만들어보기
def is_adult(age):
    if age > 20:
    	print('성인')
    else:
    	print('청소년')
        
is_adult(30) # 성인 출력
is_adult(10) # 청소년

반복문

# 리스트
fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']

for ff in fruits:
    print(ff)  # 사과 배 배 감 수박 귤 딸기 사과 배 수박

# 수박의 갯수 세어보기
count = 0
for ff in fruits:
    if ff == '수박':
    	count += 1

print(count) # 2 출력


# 딕셔너리
people = [{'name': 'bob', 'age': 20},
          {'name': 'carry', 'age': 38},
          {'name': 'john', 'age': 7},
          {'name': 'smith', 'age': 17},
          {'name': 'ben', 'age': 27}]
for pp in people:
    print(pp['name'],pp['age'] 
# bob 20, carry 38, john 7, smith 17, ben 27


# age 값이 20보다 작은것만 출력하기
for p in people:
    if p['age'] < 20:
        print(p)
# {'name': 'john', 'age': 7} {'name': 'smith', 'age': 17}

파이썬 패키지

모듈

함수나 변수 또는 클래스를 모아 놓은 파일이다. 모듈은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있다. 우리는 파이썬으로 프로그래밍을 할 때 굉장히 많은 모듈을 사용한다. 다른 사람들이 이미 만들어 놓은 모듈을 사용할 수도 있고 우리가 직접 만들어서 사용할 수도 있다.

패키지

특정한 주제를 가진 모듈들을 모아놓아 따로 구성하면 유용하게 쓰일 수 있는데 이것이 패키지이다.

requests 사용해보기

import requests # requests 라이브러리 설치 필요
# 실시간 미세먼지 현황 openAPI
r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
rjson = r.json()

gus = rjson['RealtimeCityAir']['row']
# 미세먼지 수치가 100보다 큰 지역만 출력하기
for gu in gus:
    gu_name = gu['MSRSTE_NM']
    gu_mise = gu['IDEX_MVL']
    if gu_mise > 100:
        print(gu_name,gu_mise)

웹스크래핑(크롤링)

크롤링 혹은 스크래핑

웹 페이지를 그대로 가져와서 거기서 데이터를 추출해 내는 행위이다.

requests

웹사이트에 http 요청을 하기 위해 사용한다.

Beautiful soup

html 문서를 탐색해서 원하는 부분만 쉽게 뽑아낼 수 있는 파이썬 라이브러리
html, xml을 파싱 할 때 주로 많이 사용한다.

  • 크롤링을 할 때 기술적으로 중요한 두 가지
  1. 요청을 하는 것 (requests)
  2. 요청해서 가지고 온 html 중에 잘 솎아내는 것 (beautiful soup)

select, select_one

  • 크롬 개발자도구 참고
    1. 원하는 부분에서 마우스 오른쪽 클릭 -> 검사
    2. 원하는 태그에서 마우스 오른쪽 클릭
    3. Copy -> Copy selector로 선택자를 복사할 수 있다.
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')

# select를 이용해서, tr들을 불러오기
trs = soup.select('#old_content > table > tbody > tr')

# trs 반복문 돌리기
for tr in trs:
    a_tag = tr.select_one('td.title > div > a') # tr안에 a가 있으면,
    if a_tag in not None:
    	title = a_tag.text
        print(title)

# 태그 안의 텍스트를 찍고 싶을 땐 -> 태그.text
# 태그 안의 속성을 찍고 싶을 땐 -> 태그['속성']

연습 (순위,제목,별점)

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')

trs = soup.select('#old_content > table > tbody > tr')

for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    if a_tag is not None:
        rank = tr.select_one('td:nth-child(1) > img')['alt']
        title = a_tag.text
        star = tr.select_one('td.point').text
        print(rank, title, star)

파이썬 문법은 후에 문법 강의를 보면서 더 공부할 예정이므로 지금은 어떻게 쓰이는지 정도만 알면 될 것 같고, 웹스크래핑은 아직 많이 부족하지만 연습을 많이 해서 부족한 부분을 채워 나가야겠다.

0개의 댓글