파이썬을 사용한 크롤링(BeautifulSoup4)
3개의 파이썬 코드를 사용해서 네이버 기사 100개를 긁어서 키워드, 제목, 날짜, 링크를 가져와 csv파일 형태로 저장합니다. 라이브러리는 BeautifulSoup4를 사용해야 합니다. HTML링크를 훑어서 원하는 텍스트를 가져와주는 기능을 담당합니다. 아래 코드는 클래스로 묶어야 하는데 첨이라 나중에 묶을 생각입니다.
main.py
from naver import search as naver_news_search
from save import save_to_file
search = input("키워드를 입력하세요 : ")
result = naver_news_search(search)
save_to_file(result)
별다른 기능은 없고 naver.py와 save.py를 임포트하고 네이버는 naver_news_search로 이름을 바꿔줬습니다. 키워드를 사용자로부터 입력받고 naver.py안에 search함수에게 값을 넘겨줍니다. result는 네이버에서 긁어온 값의 결과로서 CSV 형식으로 저장하는 함수인 save_to_file()에 넣어줍니다.
naver.py
import requests
from bs4 import BeautifulSoup
#네이버 기사 URL입니다. &query=옆에 검색하고싶은거 쓰면 기사가 모아져있는곳으로 갑니다.
#{URL}{원하는검색어}&start={페이지숫자*10 + 1} 은 검색한 키워드의 다른 페이지 URL입니다.
URL = "https://search.naver.com/search.naver?where=news&sm=tab_jum&query="
#마지막페이지 얼마인지 구하기
def get_last_page(input_search):
result = requests.get(f"{URL}{input_search}")
soup = BeautifulSoup(result.text, "html.parser")
pagination = soup.find("div", {"class":"sc_page_inner"})
links = pagination.find_all("a")
max_page = int(links[-1].string)
print("Last Page is : ", max_page)
return max_page
#제목
def news_titles(html):
titles = []
for news_block in html:
title = news_block.find("div", {"class" : "news_area"}).find("a", {"class" : "news_tit"})["title"]
titles.append(title)
return titles
#언론사
def news_presses(html):
presses = []
for news_block in html:
press = news_block.find("div", {"class" : "news_area"}).find("a", {"class":"info"}).get_text(strip=True)
presses.append(press)
return presses
#날짜
def news_dates(html):
dates = []
for news_block in html:
date = news_block.find("div").find("span", {"class" : "info"}).get_text(strip=True)
dates.append(date)
return dates
#링크
def news_links(html):
links = []
for news_block in html:
link = news_block.find("div", {"class" : "news_area"}).find("a", {"class":"news_tit"})["href"]
links.append(link)
return links
#스크래핑한 정보를 하나의 리스트로 묶어줍니다.
def make_one_list_dic(first, second, third, fourth, fifth):
into_list = []
for i in range(0, len(second)):
make_into_one_dic = {"keyword":first, "title":second[i], "press":third[i], "date":fourth[i], "link":fifth[i]}
into_list.append(make_into_one_dic)
return into_list
#스크래핑함수
def extract(last_page, input_search):
wanted_things = []
for page in range(last_page):
print(f"Scrapping naver page : {page+1}")
result = requests.get(f"{URL}{input_search}&start={((page+1)-1)*10 + 1}")
html = BeautifulSoup(result.text, "html.parser")
news_blocks = html.find_all("div", {"class" : "news_wrap api_ani_send"})
titles = news_titles(news_blocks)
presses = news_presses(news_blocks)
dates= news_dates(news_blocks)
links = news_links(news_blocks)
#wanted_thing의 []안에는 요소가{} 이므로 이걸 하나씩 꺼내서 wanted_things 리스트에 옮겨줘야합니다.
wanted_thing = make_one_list_dic(input_search, titles, presses, dates, links)
for i in range(0, len(wanted_thing)):
wanted_things.append(wanted_thing[i])
#원하던 정보값을 [ {}, {}, {}, ....] 이런형식으로 넘깁니다.
return wanted_things
#메인에게 주는 처음시작하는 함수입니다. 검색하고싶은 값을 사용자로부터 받아옵니다.
def search(input_search):
last_page = get_last_page(input_search)
result = extract(last_page, input_search)
return result
naver.py는 4가지 부분으로 나눌 수 있는데 처음 사용자로부터 입력값을 받아오는 search함수가 있습니다. 유일한 기능은 사용자에게 다시 값을 리턴하는 일입니다. 두번째는 pagination의 마지막 페이지를 얻어오는 함수입니다. get_last_page함수에 검색어를 넣으면 integer형식으로 값을 리턴해줍니다. 세번째로는 extract함수로 뉴스기사를 추출해오는 함수입니다. 여기에는 사용자가 검색한 검색어랑 마지막 페이지를값을 넣어줘야합니다. extract함수는 [ {}, {}, {}, ....] 이런 형식의 리스트안에 요소는 딕셔너리형태인 값을 리턴하게 됩니다. 네번째로는 제목, 언론사, 날짜, 링크 이런것들은, 검색어와 pagination을 받은 html soup를 가지고 리스트형식의 데이터로 만들어준뒤 리턴해줍니다. 물론 이렇게 스크래핑한 정보를 하나로 묶어주느 함수도 있어야겠죠. make_one_list_dic 가 정보를 하나로 모아주고 extract함수에게 돌려줍니다.
save.py
import csv
def save_to_file(searched_contents):
file = open("searched_news.csv", mode="w", encoding="UTF-8-SIG")
#라이터 를 만들어서 writer변수에 넣어주자
writer = csv.writer(file)
#리스트형태로 넣어줘야 됩니다.
writer.writerow(["키워드", "제목", "언론사", "날짜", "링크"])
for content in searched_contents:
#job은 리스트인데 안에 요소는 딕셔너리다
#딕셔너리의 좋은점은 안에 키를 알면 value값을 가져올수 있다는것이다. 또는 Value값만 가져올 수도 있다.
#list()로 감싸줘야하는데 이유는 데이터타입이 이상한걸 줘서 그렇다
writer.writerow(list(content.values()))
return
naver.py에서 취합한 데이터를 csv형식으로 전환하고 저장해주는 코드입니다. w모드로 저장하겠금 했습니다. 키워드를 입력할때마다 새로이 데이터가 쌓이는것이 아니고 계속 새로 쓸 수 있습니다.