https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303
여기서 순위나 영화제목,평점 이런것들을 내가 갖고오는 것
크롤링이라는 단어 자체는 구글의 검색 엔진이나 네이버의 검색 엔진이
내 사이트를 퍼가는 그 행위를 크롤링이라고 한다.
그 전 행위는 스크래핑이라고 하긴 하는데, 둘 다 혼용해서 많이 쓴다.
하지만,지금 할 것을 크롤링이라 부르겠다.
그 전에 크롤링에 필요한 beautifulsoup4(bs4)라는 패키지를 다운받아보겠다.
File>Settings>pythonprac>interpreter>+>BS4>Install
크롤링 기본세팅:
(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') # 코딩 시작)
기본적인 이유는 인터넷과 상관이 없는데,내가 받아온 페이지에서 솎아내는게 크롤링이다.
크롤링을 할 때는 기술적으로 딱 두가지가 중요하다.
첫번째는 코드 단에서 브라우저를 켜지 않고,요청을 하는것.
🌠requests가지고 한다.🌠
두번째는 요청돼서 가져 온 것(예를 들면 검사를 눌러서 이렇게 보면 Elements에 있는 html들 중에) 내가 원하는 정보를 잘 솎아내는 것
🌠BS4가지고 한다.🌠
잘 솎아내는게 beautifulsoup4의 역할이다.
예를들면 페이지에서 '그린 북'의 코드를 전체코드에서 솎아내려고 하면
매우 힘들기 때문에 BS4가 필요하다.
제일 처음 할 일은
print(soup)
▶프린트 해보면 페이지의 html 전체가 그대로 나온다.

🎈기본 코드 뜻
첫째줄은 import하는 것이고
headers는 왜 붙이는 것이냐면 코드 단에서 이렇게 요청을 했을 때
그런 기본적인 요청은 막아둔 사이트들이 많다.
그래서 내가 브라우저에서 엔터 친 것 마냥 효과를 내어주는 거다.
headers= 그다음에 url 들어가고
data로 요청을 받아오면
soup = BeautifulSoup(data.text, 'html.parser')
그거를 가지고 솎아내기 좋은 BeautifulSoup 형태로 만들어서
print(soup)
찍어준것이다.
select_one /select
select_one은 하나 나오는것이고 select는 리스트로 여러개 나온다.
title = soup.select_one('')
페이지의 '그린 북' 오른쪽 클릭 > copy > copy selector
그리고 ('')여기에 붙여 넣는다.
selector는 선택자이다.
얘가 타고타고 들어가서 얘가 정확히 어디 있는지 알려준다.
print(title)
<a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>
이 출력된다.
이것도 사용법인데 두 가지이다.
태그와 태그 안에 있는 그린북 텍스트를 가지고 오고 싶다면 .text하면 된다
print(title.text)
▶그린북
print(title)했을때 찍혀나온
<a href="/movie/bi/mi/basic.naver?code=171539"title="그린북">그린북
즉,
<a>태그의 속성을 가져오고 싶다.
print(title['href'])
▶/movie/bi/mi/basic.naver?code=171539
a href의 속성이 나온다.
이 방법들은 하나를 가져오는 방법 이었고,
그린북이 어디있나 봤을 때,오른쪽 버튼 검사해서 위아래로 훑어본다.
그러면 가로로 길게 줄이 표시되는데
우리가 전략을 짤 때 한 줄을 가져와서 거기서 순위,이름,평점을 가지고 오고 또 그 아랫줄 가져와서 통으로 가져오는게 편할거 같다.

한 줄을 가져와서 copy selector로 붙여넣는다.
그리고 그 밑에줄도 가져와서 붙여넣는다.

나머지는 같고 :nth-child(4)이 부분이 다르다.제거한다.
그러면 #old_content > table > tbody > tr
이것에 해당하는 애들이 다 나온다.
한줄이었던<tr>..</tr>들이 다 나온다.
보아하니 :nth-child(3) 얘는 3번째만 딱 특정한 거고 하니
그전 겹치는 코드만 가져온다.
tr들을 가져올거니까 trs로 하고
trs = soup.select('#old_content > table > tbody > tr')
💡select는 여러개 가져오는거라서 결과가 리스트로 나온다.
for문을 돌려준다.
for tr in trs:
print(tr)
▶tr들이 하나씩 나온다.
for문이니까 print(tr)에서 여러가지 찾으면 된다.
그린북에서 copy selector를 해온다.
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
tr:nth-child(2) 까지는 찾았었다.
나머지 td.title > div > a 를
a_tag = tr.select_one('td.title > div > a')
👉a_tag = tr중에서 하나를 찾는데 내용물은 'td.title > div > a'
print(a_tag)
기존 tr까지 찾은 데서 추가한 것까지 찾는다.
이번엔 여러개 가져와서 솎아낼 필요 없다 title은 하나밖에 없으니까.
▶title들이 나온다.
그런데,중간에 None이라는것이 찍혀 나온다.

"줄"들이다.
크롤링이라는 거는 사이트의 모양새마다 다 다르기 때문에
사이트마다 전략을 다 다르게 가져가야 한다.
👉이런 줄 안에서 얘를 가지고 오려면 에러가 나겠구나.
🧪에러가 나는지 확인해보자.
print(a_tag.text)
▶AttributeError: 'NoneType' object has no attribute 'text'
에러가 난다.
👉None에다가 .text 하지마라
if a_tag is not None:
print(a_tag)
▶None이 사라졌다.
if a_tag is not None:
title = a_tag.text
print(title)
각 text가 title에들어가서
print 내용물로
타이틀들만 하나씩 나온다.