티스토리 뷰
◎ 파이썬 패키지
- 크롤링을 하기 위해서는 남들이 만들어 놓은 라이브러리가 필요하다.
이러한 라이브러리를 '패키지'라고 부른다.
▶ 패키지 설치 = 외부 라이브러리 다운
만약, 내가 사용하던 패키지가 아닌 다른 패키지를 사용해야하는 상황이라면?
→ 가상환경(virtual environment)을 사용한다.
● 가상환경이란?
: 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해,
파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경이다.
파이썬 폴더를 만들때 생기는 'venv'폴더가 이 역할을 한다.
○ 패키지 설치하기
파일 → 설정창에서 프로젝트: 파일명 안의 Python인터프리터 들어가기
+ 눌러서 'requests'검색 후 패키지 설치하기
○ 패키지 사용해보기
requests패키지를 서울시 미세먼지API로 연습해보자.
import requests # requests 라이브러리 설치 필요
r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()
패키지마다 불러오는 방식이 다르기때문에 사용할 패키지의 방법은 검색을 통해 알아봐야한다.
http://spartacodingclub.shop/sparta_api/seoulair
여기서 정보를 필요에 맞게 출력해야하기 때문에 정보가 들어있는 부분을 찍어보자.
rows = rjson['RealtimeCityAir']['row']
print(rows)
한줄로 찍혀 나온다.
하나씩 찍어준 뒤 필요한 정보만 골라오자.
rows = rjson['RealtimeCityAir']['row']
for row in rows:
gu_name = row['MSRSTE_NM']
gu_mise = row['IDEX_MVL']
print(gu_name,gu_mise)
구이름과 미세먼지 수치만 출력된다.
여기서 40보다 수치가 작은 곳만 출력해보자.
if gu_mise < 40:
print(gu_name,gu_mise)
◎ 크롤링
- 네이버 영화 링크를 가져와보자.
https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829
크롤링을 하려면?
1. 요청을 통해 html가져와야함 → requests로 get방식을 통해 가져옴
2. 원하는 부분(제목)을 찾아야함 → beautiful Soup을 이용하기(bs4설치)
bs4를 설치한 뒤 시작해보자.
크롤링을 시작해보자.
크롤링 기본 세팅 코드는 코드스니펫을 사용했다.
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.naver?sel=pnt&date=20210829',headers=headers)
# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')
기본 세팅 코드에 필요한 url만 바꿔서 사용하면 편리하다.
soup을 먼저 출력해보자.
페이지의 html이 들어왔다.
이제 beautiful Soup을 사용해보자.
1위의 제목을 가져와보자.
먼저, 검사를 눌러 해당 부분을 copy selector해서 가져온다.
# 하나만 가져올 때
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
()안에 copy selector한 부분을 넣어준다.
title을 찍어보자.
가져온 부분의 태그가 뜬다.
여기서 원하는 정보를 가져오려면?
# 텍스트 가져오기
print(title.text)
# 링크 가져오기
print(title['href'])
이제 페이지의 모든 영화 제목을 가져와보자.
먼저 두 개의 copy selector를 가져와 비교해보자.
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a
tr을 기준으로 앞 뒤로 공통된 부분이 나뉜다.
중복되는 부분으로 어떻게 가져올까?
# 여러개 가져오기
movies = soup.select('#old_content > table > tbody > tr')
변수를 선언해 해당되는 부분을 모두 가져온다.
출력한 모습을 보면 리스트형태로 찍혀있다.
왜?
다시 페이지로 가서 제목의 검사창을 살펴보자.
영화 하나 하나가 <tr>로 묶여있기때문이다.
중간에 구분선도 <tr>로 묶여있다.
이를 구분해주기 위해 하나씩 찍어보자.
for movie in movies:
# 영화 하나씩 가져오기
a = movie.select_one('td.title > div > a')
print(a)
이번엔 뒷쪽의 공통부분을 가져와 영화를 하나씩 찍어준다.
중간에 있던 구분선을 해당하는 부분이 없기때문에 'None'이라고 표시된다.
이를 빼고 영화의 텍스트만 출력해보자.
if a is not None:
print(a.text)
+ 순위와 평점 가져오기
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
여기에 이어서 작성해보자.
먼저 순위에 copy selector를 가져온다.
rank = movie.select_one('#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img')
movies와 비교해보면 이미 tr까지는 가져와있기 때문에 중복되는 부분은 지워준다.
출력을 해보자.
rank = movie.select_one('td > img')
print(rank)
우리가 필요한 순위가 들어있는 부분은 alt이다.
이 부분을 가져와보자.
rank = movie.select_one('td > img')['alt']
# ['alt']을 출력시에 붙여도 상관없음
print(rank)
이제 별점을 붙여보자.
마찬가지로 먼저 copy selector를 가져온다.
star = movie.select_one('#old_content > table > tbody > tr:nth-child(2) > td.point')
중복되는 부분은 지워준 후 출력해보자.
star = movie.select_one('td.point')
print(star)
여기서 필요한건?
>텍스트부분<
star = movie.select_one('td.point').text
print(star)
이제 한번에 출력해보자.
print(rank,title,star)
'코딩 > 스파르타코딩-웹개발' 카테고리의 다른 글
웹개발 3주차 개발일지(4) - DB연습하기, 크롤링 연습하기 (0) | 2022.10.23 |
---|---|
웹개발 3주차 개발일지(3) - 데이터베이스 (0) | 2022.10.20 |
웹개발 3주차 개발일지(1) - 파이썬 기초 문법 (0) | 2022.10.17 |
웹개발 2주차 개발일지(3) - Ajax 연습하기 (0) | 2022.10.13 |
웹개발 2주차 개발일지(2) - Ajax (0) | 2022.10.13 |