1. 검색어를 입력받아서 동아일보 신문 기사를 스크래핑해서 파일에 저장하기

1) 필요한 패키지

- urllib.parse.quote 함수: 검색어가 한글이라면 인코딩을 하기 위해서

- requests: 웹의 문자열을 읽어오기 위한 패키지, 기본 패키지가 아니라서 설치를 해야 함

- beautifulsoup: HTML 문자열에서 원하는 데이터를 추출하기 위해서 필요한 패키지, 기본 패키지가 아니라서 설치를 해야 함

!pip install requests
!pip install beautifulsoup4

 

2) URL 확인

https://www.donga.com/news/search?sorting=1&check_news=91&search_date=1&v1=&v2=&more=1&query=%EB%8B%B9%EA%B7%BC%20%ED%9B%84%EA%B8%B0

=> query: 검색어

 

3) 검색어 입력받아 URL 만들기

from urllib.parse import quote

#검색어를 입력받아서 인코딩
string = input("검색어를 입력하세요:")
keyword = quote(string)
#print(keyword)

target_URL = "https://www.donga.com/news/search?query=" + keyword
print(target_URL)

=> 검색어를 입력하세요: 당근 후기
https://www.donga.com/news/search?sorting=1&check_news=91&search_date=1&v1=&v2=&more=1&query=%EB%8B%B9%EA%B7%BC%20%ED%9B%84%EA%B8%B0

 

 

4) 첫 화면의 HTML 가져오기

# 정적인 웹의 데이터를 가져올 때 사용하는 패키지
import requests
html = requests.get(target_URL).text
print(html)

 

 

5) 기사 개수 가져오기

#HTML, XML 파싱에 사용하는 패키지
from bs4 import BeautifulSoup

#HTML 텍스트는 메모리에 트리 형태로 펼치기
bs = BeautifulSoup(html, 'html.parser')

#선택자는 동일한 데이터가 있을 수 있으므로 list
cnt = bs.select('div.cntPage > span')

#데이터가 1건이라서 반복문을 돌리지 않고 첫번재 데이터에서 바로 추출
'''
for x in cnt:
    print(x.getText())
'''
cnt = cnt[0].getText()
#print(cnt)
cnt = int(cnt[0:-1].replace(",", ""))
print(cnt)

=> 73

 

6) 기사 링크 가져오기

#페이지 개수 만들기
pageno = int(cnt / 15 + 0.99)

#기사의 링크를 저장할 list
links = []
#페이지 개수 만큼 순회하면서 html을 읽어서 파싱해서 저장
for i in range(0, pageno):
    #기사 링크와 제목이 나오는 페이지를 읽기
    url = "https://www.donga.com/news/search?p=" + str(i*15+1) + "&query=" + keyword + "&check_news=91&more=1&sorting=1&search_date=1&v1=&v2="
    html = requests.get(url).text
    soup = BeautifulSoup(html, "html.parser")
    linktag = bs.select('span.tit > a')
    for tag in linktag:
        #a 태그의 href 속성의 값을 가져오기
        links.append(tag['href'])
        
print(links)

 

 

7) 기사 링크에 가서 기사를 읽어서 텍스트 파일에 저장

#기록할 텍스트 파일을 생성
output_file = open(string + ".txt", 'w', encoding='utf8')

for link in links:
    html = requests.get(link).text
    bs = BeautifulSoup(html, "html.parser")
    articles = bs.select('#article_txt')
    for article in articles:
        #파일에 기록
        output_file.write(article.getText())

output_file.close()

 

 

 

 

 

 

 

 

 

 

 

'Python' 카테고리의 다른 글

[Python] MySQL 데이터로 DataFrame 만들기  (0) 2024.02.14
[Python] 크롤링 - Selenium  (0) 2024.02.14
[Python] Pandas  (1) 2024.02.08
[Python] Numpy  (0) 2024.02.06
Day10. REST API  (0) 2024.01.26