코딩 초보의 정리글입니다. 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('a.lnk_hdline_article')
여기까지 고쳐봤고, 헤드라인 제목기사 5개를 가져온 시점에서 동일하게 제목과 링크를 출력해보자.
앞선 글에서 5개 글을 하나씩 찾아가는 게 아니라고 했다. 리스트는 순회할 수 있다(딕셔러니, 튜플, 세트 모두 마찬가지. 나중엔 순회할 목적으로 함수를 짤 일도 생긴다).
for item in article:
title = item.text
link = item.get('href')
print(title, link)
아래에 추가하고 실행하자. 예전에 1개 기사에 대해 추출했던것 제목과 링크가 나올 것이다. 화면 자체는 상당히 지저분한데 하나씩 정리하자.
반복문
우선 코드부터. 지금까지와 달리 형태가 다르다. 지금까진 한줄씩 변수를 할당하거나 메소드를 실행했다. 이건 article이라는 리스트를 순회(처음부터 마지막까지 각각 값을 한번씩 끄집어낸다는 의미로 알자)하면서 정해진 코드를 실행하라는 코드다. 5개이니 title, link 변수를 할당해서 출력하는 코드가 5번 반복된다.
앞서 얘기했지만 파이썬에는 들여쓰기가 있다. 첫줄을 보면 :
로 끝나는데, 이는 for 문으로 발동된 순회가 끝날 때까지 실행되는 코드는 들여쓰기로 써야 한다. 들여쓰기를 끝내면 for 문을 벗어나 기존과 같이 코드를 실행한다.
for item in article
이라는 타언어 대비 상당히 문과적인 명령어는 그리 어렵지 않을 것이다. for ~ in 리스트
는 고정으로 쓰이니 그냥 외우면 된다. item은 리스트가 순회하면서 호출되는 각각의 값을 할당한 이름이다.
여기까지 반복문이 잘 이해되지 않으면, 다음과 같이 간단한 반복문을 만들어보면서 연습해보는 걸 추천한다. 아직도 헛갈리는 게 있을 때, 머리가 따라주지 않을 때 한다. 나중엔 복잡한 리스트를 만들어서 무슨 순서로 어떻게 도는지 익혀보면 좋다.
mylist = ['first', 'second', 'third', 'fourth', 'fifth']
for myvalue in mylist:
print(myvalue)
문자열 다루기
제목 나오는 게 상당히 이상하다. 소스코드에 적인 글자를 그대로 가져오기 때문에 줄바꿈 문자(\n
)과 공백이 모두 들어가 있기 때문이다.
문자열을 다루는 방법은 꽤 많지만 실전형으로 당장 나온 문자열을 처리하는 방법만 생각하자. 나중에 더 좋은 방법을 찾아내서 대체하는 일은 수없이 일어날 것이다.
줄바꿈 문자와 제목 앞 뒤의 공백을 줄이면 좋을 것 같다. 각각 방법이 다르다.
줄바꿈 문자 \n
는 없애야 한다. 즉 빈 문자열인 ""로 대체하는 명령어를 쓴다.
문자열 앞 뒤 공백을 자르는 전용 메소드도 있다.
title = item.text
newtitle = title.replace("\n", "")
newtitle2 = newtitle.strip()
인터랙티브 윈도에서 위 코드를 한 줄씩 쳐도 된다. 왜냐하면 반복문을 실행하면서 title 변수를 할당했기 때문에 반복문이 끝난 후 마지막 5번째로 할당된 title 변수가 남아있기 때문이다. 당연하다고 생각할 수 있지만 나중에 글로벌 변수와 로컬 변수에 대해 알아둬야 하기 때문이 기억하고 넘어가자.
앞서 한줄에 메소드를 이어서 쓸 수 있다고 했었다. 일부러 하나씩 확인해보라고 newtitle, newtitle2와 같은 못생긴 변수명을 추가했다. 나중에 봤을 때 무슨 소리인지 알아듣지 못할 정도가 아니라면 가급적 코드는 줄이는 게 좋다.
title = item.text.replace("\n", "").strip()
결과는 동일하다. 다만, 너무 성급하게 줄이기만 하다보면 나중에 곤란한 순간이 온다. 가령 해당 줄에서 에러가 발생할 경우, 3가지 중 어느 단계에서 오류가 있는지 정확히 알기 힘들수도 있다. 나의 경우엔 정석적인 방법은 잘 몰라서, 보통은 깨져가며 깨우쳤다.
하는 김에 링크도 수정하자. 앞선 글에서 설명한 대로 상대경로이므로 앞에 도메인을 추가하자.
여기까지 수정한 코드는
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('a.lnk_hdline_article')
for item in article:
title = item.text.replace("\n", "").strip()
link = url + item.get('href')
print(title, link)
그 뒤에는?
잘 모르겠다. 처음부터 얘기했지만 무엇을 하고 싶은 가에 따라 지금까지 했던 코드를 기반으로 명령어를 추가하고, 처리할 코드를 늘려나가는 작업의 연속일 것이다. 근본없는 코딩의 원동력은 필요성이다. 흥미와 의지가 있다면 자신이 원하는 결과를 위해 수시간동안 문서를 읽고 구글링을 할 것이다. 딱히 피할 수는 없을 거 같다.
대량의 스크래핑이 필요하다면 개념만 대충 익히고 Scrapy와 같은 전문 라이브러리를 설치할 수도 있겠다. 내 경우 Scrapy를 써보기는 했어도 업무에 활용할 일은 없었다. 자신의 업무가 대량의 스크래핑을 빠르게 진행하고 대량의 데이터를 처리해야 한다면 파이썬의 기본 개념을 빠르게 익히고 바로 전문 라이브러리를 써야 할지도 모른다.
하지만 여기까지 생소하게 읽은 이들은 앞으로도 갈 길이 멀다. 다음 편에는 함수를 잠깐 보고, requests 이외의 스크래핑 방식으로 이어가보자.
'취미코딩 > hobby' 카테고리의 다른 글
파이썬으로 업무 자동화까지 <14> API_1 (0) | 2021.01.24 |
---|---|
파이썬으로 업무 자동화까지 <13> 함수 (0) | 2021.01.13 |
파이썬으로 업무 자동화까지 <11> BeautifulSoup 03 (0) | 2020.12.20 |
파이썬으로 업무 자동화까지 <10> BeautifulSoup 02 (0) | 2020.12.20 |
파이썬으로 업무 자동화까지 <9> BeautifulSoup 01 (0) | 2020.12.20 |
파이썬으로 업무 자동화까지 <8> requests 3 (2) | 2020.12.19 |
파이썬으로 업무 자동화까지 <7> requests 2 (0) | 2020.12.14 |
파이썬으로 업무 자동화까지 <6> requests 1 (0) | 2020.12.14 |