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

BBOrong_22·2022년 4월 14일

스파르타 원정

목록 보기
34/52

📢준비

📢저번에 이어서 이번엔 크롤링 패키지를 이용해보겠다.

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)
찍어준것이다.

📢BS4의 사용 방법은 크게 두 가지 있다.

select_one /select
select_one은 하나 나오는것이고 select는 리스트로 여러개 나온다.

🎈select_one 하나 가져오는 방법

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의 속성이 나온다.
이 방법들은 하나를 가져오는 방법 이었고,

🎈select 여러개의 리스트를 가져오는 방법

그린북이 어디있나 봤을 때,오른쪽 버튼 검사해서 위아래로 훑어본다.
그러면 가로로 길게 줄이 표시되는데
우리가 전략을 짤 때 한 줄을 가져와서 거기서 순위,이름,평점을 가지고 오고 또 그 아랫줄 가져와서 통으로 가져오는게 편할거 같다.

한 줄을 가져와서 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 내용물로
타이틀들만 하나씩 나온다.

profile
아 스파르타 복습해야한다..

0개의 댓글