코드들은 github에 업로드되어있습니다.
https://github.com/JaeYeongSong/Blog/tree/main/Crawling
저번 시간에 이어서 크롤링 하는 방법에 대해 알아보도록 합시다.
오늘은 원하는 태그만 데이터를 가져오는 방법에 대해 알아봅시다.
음 근데 처음 보는 단어가 있을 겁니다.
태그(Tag)가 무엇일까요?
일단 우리가 알려고하는 태그가 무엇인지 알아야 하겠죠.
그럼 HTML에 대해 알아야 할 것 같습니다.
HTML은 Hypertext Markup Language의 줄임말 입니다.
HTML은 웹 페이지를 구현하기 위해 만들어진 언어입니다.
그럼 태그에 대해 알아볼까요?
태그는 HTML에서 무엇을 꾸며주거나, 강조하는 역할 또는 그 글이 무엇을 표현해야되는지 알려주는 규칙들을 태그라고 합니다. 태그는
<Tag>글</Tag>
위와 같은 형식으로 태그는 이루어져 있습니다.
<Tag>와 같은 형식으로 태그를 열고 그 중간에 글을 작성한 다음
</Tag>와 같은 형식으로 태그명 앞에 /를 붙여있습니다.
그럼 한 번 웹 사이트를 구경하면서 태그가 무엇인지 한 번 알아볼까요?
그럼 이 티스토리 블로그에 어떠한 태그가 있는지 한 번 실제로 찾아봅시다.
메인 웹 페이지에 왼쪽 상단에 Xsop는
<a href="/" title="Xsop" class="link_logo">Xsop</a>
▲ 메인 웹 페이지 왼쪽 상단 Xsop 태그 내용
a 태그가 있습니다.
<a>Xsop</a>
이것과 같이 a로 열리고 /a로 문법을 닫는 구조이죠.
하지만 웹 사이트에서는 태그 사이에 다양한 코드를 넣습니다.
메인 웹 페이지에 Xsop는 href, title, class 등 다양한 코드가 있습니다.
이렇게 태그가 모든 웹 페이지에 있습니다.
우리는 원하는 태그값만 크롤링 하는 것이죠
위에 태그처럼 a 태그에 여러개가 둘러쌓인것도, a 태그를 크롤링 하면 그 안에있는 내용들도 같이 크롤링됩니다.
오늘은 서론이 길었네요. 그럼 우리가 원하는 태그를 크롤링 하는 방법에 대해 알아보도록 하겠습니다.
from bs4 import BeautifulSoup
import requests
import sys
# 홈페이지 주소 가져오기
url = "https://search.naver.com/search.naver?where=news&sm=tab_jum&query=뉴스"
html = requests.get(url)
bs_html = BeautifulSoup(html.content, "html.parser")
bsObject = bs_html.find_all(attrs={"class":"news_tit"})
sys.stdout = open('Tag_Crawling.txt', 'w', encoding='UTF-8')
print(bsObject) # 웹 페이지 txt 파일로 출력
▲ Tag_Crawling.py
위 코드가 원하는 태그만을 크롤링 하는 코드입니다.
여기서 가장 중요한 부분이 있습니다.
원하는 태그를 정해주는 코드를 가져와보겠습니다.
bsObject = bs_html.find_all(attrs={"class":"news_tit"})
▲ Tag_Crawling.py 중 크롤링 할 태그 정하기
여기서는 태그가 아니라 class 라는걸로 해주었는데요.
class라는 것은 같은 태그가 아니라도 class라는 걸로 묶어주는 역할을 하는겁니다.
만약에 h1, h2, h3, p 태그가 각각 10개씩 있다고 합시다.
근데 h1, h2, h3, p 태그를 전부다 글 색깔을 빨간색깔로 바꿀겁니다.
그럼 h1 태그에 색깔을 빨갛게 하고, 또 따로 h2 태그에 색깔을 빨갛게 하고 이렇게 반복하면 여러작업을 해야겠죠.
뭐 어찌어찌 태그가 각각 10개씩 밖에 없다면 어찌어찌 할 수 있지만, 만약에 웹 페이지가 큰 구글이나, 네이버라면 굉장한 노가다를 해야겠죠. 그걸 묶어주는 겁니다.
h1, h2, h3, p 태그에 class를 color-write로 지정을 해주면 color-write 클래스에서 한번에 다 바꿀수 있기 때문에
웬만한 사이트에서는 class를 사용합니다.
위에 있는 코드에서 class는 news_tit 이라고 되어있는데, 저는 지금 네이버 뉴스를 크롤링 하려고 합니다.
네이버 뉴스에 있는 뉴스들의 제목은 news_tit라는 class로 이루어져 있기 때문에
저는 class로 해주었습니다. 그리고 class와 비슷한 id도 있습니다. 참고만 해주시기 바랍니다.
자세한 내용은 다음에 강좌로 만들어보도록 하겠습니다.
크롤링 할 태그 정하는 것은
bs_html.find_all()
여러가지가 있지만 그 중 3가지만 방법에 대해 알아보겠습니다.
Tag(태그) | '미정값' |
class | attrs={"class":"미정값"} |
id | id='미정값' |
미정값 : 태그, class, id 이름
bs_html.find_all() 괄호 안에 작성해주시면 됩니다.
이렇게 넣어주시면 됩니다.
한 번 작동시켜 볼까요?
정상적으로 작동하여 class가 news_tit인 태그와 그 값을 다 txt 파일에 잘 저장된 것을 확인할 수 있습니다.
지금까지 읽어주셔서 감사합니다.
지금까지 웹 페이지 원하는 태그만 크롤링 하는 방법이었습니다.