본문 바로가기

취미코딩/hobby

파이썬으로 업무 자동화까지 <10> BeautifulSoup 02

코딩 초보의 정리글입니다. 0편부터 보세요.

문득

파이썬 웹 스크래핑 방법을 구글링으로 배웠다. 대부분 완성된 코드를 복사해 값을 바꿔가는 꼼수로 익혀갔는데, 목표 지향적이긴 해도 무심코 지나간 구문의 의미를 몰라서 다시 구글링을 반복했다. 시행착오 때문에 흥미를 잃지는 않았지만, 모두가 동일한 시간낭비를 할 필요는 없다. 그런 마음으로 정리하고 있다.

지금까지 짠 코드를 보면

import requests
from bs4 import BeautifulSoup

url = "https://news.naver.com/"

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"}

r = requests.get(url, headers=headers)

soup = BeautifulSoup(r.text, 'html.parser')
article = soup.select('#today_main_news > div.hdline_news > ul > li:nth-child(1) > div.hdline_article_tit > a')

이렇게 되어 있다. 한 문장으로 정리하면 스크래핑에 필요한 패키지를 설치해 불러왔고, 네이버가 설정한 호출 요건을 맞추기 위해 헤더 값을 설정했고, 기사 제목 하나를 정해 그 요소를 가져왔다.

article의 구조는

[<a class="lnk_hdline_article nclicks('mai.text1', '880000F2_000000000000000003062756', 'airsGParam', '0', 'news_qm_v2.0', 'j48nPNUqw6giJsQb')" href="/main/read.nhn?mode=LSD&amp;mid=shm&amp;sid1=101&amp;oid=025&amp;aid=0003062756">
                                         킥보드 사고 64%가 운전 미숙…"내년 4월부터 면허 없으면 못 타"
                                     </a>]

으로 나온다고 했다. 어떤 정보가 유용할까. 제목과 링크일 것이다. 제목과 링크를 추출해보....기 전에, 이 태그가 대괄호로 둘러쌓여 있다는 점을 먼저 보자. 리스트다.

즉 article은 현재 값이 1개 들어있는 리스트다. soup.select 라는 함수가 리스트를 돌려준 것이다. 무엇을 인자로 집어넣느냐에 따라 여러 개의 값이 있는 리스트가 될 수도 있다는 얘기다.

다만 지금은 BeautifulSoup의 방법을 익히는 단계이니, 무시하고 원래 하려던 걸 해보자.

art = article[0]

첫번째(유일한) 값을 다시 할당하자.

title = art.text
link = art.get('href')

title과 link의 값을 확인해보면 태그 안에 있던 텍스트와 링크가 출력되는 것을 확인할 수 있다. 여기서 링크는 상대주소이니, 실제로 브라우저에서 접근할 수 있는 기사 링크는 url+link다. 파이썬에서 문자열도 연산이 된다는 걸 기억하자.

여기까지만 하면 BeautifulSoup에 대한 이해는 거의 다 끝났다고 생각한다. HTML 소스를 읽어서, 원하는 부분을 선택해 가져오고, 가져온 부분에서 다시 원하는 값을 추출하면 된다. art.text는 해당 태그에서 실제 페이지에 나오는 텍스트만 가져오라는 얘기고, `art.get('href')는 해당 태그 속성 중 링크 값이 있는 href의 값을 가져오라는 함수다.

해당 값 자체를 조작하고 싶거나 하는 목적이 있다면 BeautifuleSoup의 공식 문서를 보면서 메소드를 익혀가면 될 것이다. 우리의 목적은 브라우저에서 웹 서핑하는 걸 스크립트로 대체하는 것이므로 따로 소개하진 않는다.

속성으로 일단 익혔으니, 다음 편에서 좀 더 응용으로.