-
21.09.14. 3-4~9강 (파이썬, 패키지(requests, bt4) 크롤링)일기 2021. 9. 15. 00:41
[파이썬을 설치한다?]
- 컴퓨터는 10100011 같은 언어만 알아 들음
- 그래서 파이썬 문법으로 된 걸 10100011로 변환해줄 수 있도록
번역 패키지를 설치하는 것
[파이참에서 파이썬 만들기]
- venv(virtual environment ;가상환경) 폴더 절대 건드리지 말기!
- File -> New -> Python File
print('hello sparta')
- 마우스 우클릭, "run"
- 다른 초록색 화살표 누르지 말고 무조건 마우스 우클릭 후 런하기!
'print' => 개발자가 보고싶을 때 쓰는 명령어
- ' : ' => 파이썬은 중괄호를 쓰지 않음! 콜론 아래 적힌 것들이 내용물이 되는 것. 그래서 탭이 중요. (굉장히 직관적)
ex)
age = 25
if age > 20:
print('성인입니다')
else:
print('청소년입니다')=>성인입니다
*반복문
- 리스트의 원소를 하나씩 빼서 쓰는 방식
fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']
count = 0
for ff in fruits:
if ff == '수박':
count += 1 =>'count = count + 1' 과 같은 내용
print(count)=>2
[파이썬 패키지]
*venv(virtual environment ;가상환경)
- 공구함
*설치(pip ;python install package)
File -> Settings -> Project pythonprac -> Python Interpreter -> (+) -> 검색해서 설치
- (+)를 누를 수 없다면 세팅 눌러서 Python을 데려오면 됨
[Requests]
https://www.daleseo.com/python-requests/
[파이썬] requests 라이브러리 사용법
Engineering Blog by Dale Seo
www.daleseo.com
import requests # requests 라이브러리 설치 필요
r = requests.get('url주소를 입력하세요')
rjson = r.json()
print(rjson)[크롤링]
- 구글의 검색 엔진이나 내 사이트를 퍼가는 행위
- 스크래핑과 크롤링을 혼용해서 왕왕 사용함 (같은 개념이라 생각하면 됨)
- 내가 이미 받아온 데이터를 가지고 내가 솎아내는 것
- 기술적으로 중요한 두가지 1. 코드 단에서 브라우저를 켜지 않고 요청을 하는 것 (requests 사용)
2. 요청해서 가지고 온 html들 중 내가 원하는 정보를 잘 솎아내는 것 (bt4 사용)
*크롤링 기본 세팅
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('url을 입력해주세요',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
# 코딩 시작*네이버 영화 페이지
- 패키지 추가 설치하기(beautifulsoup4 ;bs4)
- 사용 방법은 크게 두가지 1. select_one : 하나 나옴
2. select : 리스트처럼 나옴
*soup.select_one : 해당 정보를 하나 불러옴
: 브라우저에서 정보를 원하는 부분 마우스 우클릭 -> 검사 -> elements에서 해당 태그 마우스 우클릭
-> Copy -> Copy selector
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')
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(title)=>
C:\Users\user\Desktop\sparta\pythonprac\venv\Scripts\python.exe C:/Users/user/Desktop/sparta/pythonprac/hello.py
<a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>
Process finished with exit code 0*태그 안에 있는 특정 텍스트를 가져오고 싶다!
ex) 그린 북
=> print(title.text)
=>
C:\Users\user\Desktop\sparta\pythonprac\venv\Scripts\python.exe C:/Users/user/Desktop/sparta/pythonprac/hello.py
그린 북
Process finished with exit code 0*태그의 속성을 가져오고 싶다!
ex) /movie/bi/mi/basic.naver?code=171539
=> print(title['href'])
=>
C:\Users\user\Desktop\sparta\pythonprac\venv\Scripts\python.exe C:/Users/user/Desktop/sparta/pythonprac/hello.py
/movie/bi/mi/basic.naver?code=171539
Process finished with exit code 0*soup.select : 해당 정보를 리스트 형태로 여러개 가져옴
- 해당 부분 마우스 우클릭 -> Copy -> Copy selector
#old_content > table > tbody > tr:nth-child(3)
#old_content > table > tbody > tr:nth-child(4)내가 원하는 정보는?
#old_content > table > tbody > tr
<tr>태그들이 다 나옴
trs = soup.select('#old_content > table > tbody > tr')
for tr in trs:
print(tr)이제 tr 안에서 타이틀을 찾든, 하면 됨 타이틀 부분은?
타이틀 항목 copy selector
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
여기서
#old_content > table > tbody > tr:nth-child(2) >
여기까진 위에서 찾았으니
타이틀 부분은
td.title > div > a
이 부분인 것
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') => : tr중에서 하나를 찾아요
print(a_tag)*None
- 중간중간 있는 None은 단락을 나누는 실선의 데이터
- 이건 사이트마다 다름. 특정 언어는 아님
for tr in trs:
a_tag = tr.select_one('td.title > div > a')
print(a_tag.text)=>
C:\Users\user\Desktop\sparta\pythonprac\venv\Scripts\python.exe C:/Users/user/Desktop/sparta/pythonprac/hello.py
Traceback (most recent call last):
File "C:/Users/user/Desktop/sparta/pythonprac/hello.py", line 13, in <module>
print(a_tag.text)
AttributeError: 'NoneType' object has no attribute 'text'
Process finished with exit code 1=> ?None타입의 text는 데려올 수 없다!
=>if문을 사용해서 None이 아닌 항목만 데려오기
for tr in trs:
a_tag = tr.select_one('td.title > div > a')
if a_tag is not None:
title = a_tag.text
print(title)*연습
순위, 제목, 평점 순으로 도출되게 하기
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'] =>랭크 copy selector 런 해보면 alt 항목이 필요한 걸 알 수 있음
title = a_tag.text
star = tr.select_one('td.point').text =>point의 텍스트가 필요함
print(rank,title,star)=>print(rank['alt'])로 찍어보고 잘 나오면 ['alt']는 프린트 안에 있을 필요 없으니 해당 열로 옮겨준다
'일기' 카테고리의 다른 글
21.09.17. 4-1~5강 (Flask 서버 만들기) (0) 2021.09.17 21.09.15. 3-10~15강 (MongoDB, pymongo 코드) (0) 2021.09.16 21.09.14. 3-1~3강 (복습) (0) 2021.09.14 21.09.11~14. 2-7~12강 (JSON, Ajax) (0) 2021.09.12 21.09.09. 2-2~6강 (jQuery) (0) 2021.09.09