3주차-8 웹스크래핑(크롤링)기초

crawling(scraping) > 웹 페이지를 그대로 가져와서 데이터를 추출하는 것
requests > 자료를 요청하고
BeautifulSoup > 자료를 솎아낸다.

1)솎아낸 자료 나타내기

import requests
from bs4 import BeautifulSoup

//headers는 브라우저에서 엔터친 것과 같은 효과를 내는 것
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를 요청해서 갖고오기
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)

//data의 정보를 솎아내기 좋게 BeautifulSoup형태로 만들어서 나타내기
soup = BeautifulSoup(data.text, 'html.parser')

print(soup)  >>html 코드자료가 좌르륵 나옴

2)솎아낸 자료 중 원하는 값만 나타내기
**해당 제목에 커서를 둔 후 검사창켜기 > elements > 해당부분 copy selector > soup.select.one('') 괄호안에 붙여넣어주기

title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')

1-print(title) //해당 title값 가져오기
2-print(title.text) //해당 텍스트값만 가져오기
3-print(title['href']) //해당 속성값만 가져오기

결과값 >
1-<*a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북 // 그린 북
2-그린북
3-/movie/bi/mi/basic.naver?code=171539

3)전체자료 불러와서 솎아내기
해당페이지의 제목에 커서 후 elements 확인 한 줄이 어디까지인지 확인하여 copy selector 후 붙이기 >2번하기!

#old_content > table > tbody > tr:nth-child(2)
#old_content > table > tbody > tr:nth-child(3)
다른 부분은 끝에 숫자이므로 잘 보면
:nth-child(숫자) >> 이 부분은 특정한 부분으로 지워주면 전체 자료가 불러올 수 있다는 것을 의미!!!!
#old_content > table > tbody > tr 이렇게만 남겨주기!

trs를 따로 지정해주고 정보가 여러개이므로 select로 사용하기!

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

for tr in trs: //trs정보를 tr에 담는다
    print(tr) // tr정보만 다 나온다

3)솎아낸 정보 중 제목만 뽑아내기

해당 제목부분 copy selector 후 붙여넣기
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
여기서!!
 *td.title > div > a // 이 부분만 잘라내주기
 
 
 
 for tr in trs:
 	//a_tag을 한 부분으로 지정하므로selcet_one사용하여 ('')안에 붙여넣어주기
    a_tag = tr.select_one('td.title > div > a')
    print(a_tag)

결과값 >
이런식으로 해당화면의 tr중 title값만 좌르륵 뜬다!!
<a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>
<a href="/movie/bi/mi/basic.naver?code=174830" title="가버나움">가버나움</a>

BUT ! 중간에 공란값인 none이 있는 경우가 있어 값이 도출안되는 경우가 있으므로 if문을 사용한다!

유의할 것은 print(atag.text)를 하면 none값에는 text적용하지 말라는 에러메시지가 뜬다ㅠ

If문 예시를 이용하면 none값은 제외됨

for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    if a_tag is not None:
        print(a_tag)

이번엔 여기서 title의 텍스트 값만 추출하기

for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    if a_tag is not None:
        title = a_tag.text //text값 지정
        print(title)

결과값 >
그린 북
가버나움
베일리 어게인
주전장

좋은 웹페이지 즐겨찾기