1. 검색어를 입력받아서 동아일보 신문 기사를 스크래핑해서 파일에 저장하기
1) 필요한 패키지
- urllib.parse.quote 함수: 검색어가 한글이라면 인코딩을 하기 위해서
- requests: 웹의 문자열을 읽어오기 위한 패키지, 기본 패키지가 아니라서 설치를 해야 함
- beautifulsoup: HTML 문자열에서 원하는 데이터를 추출하기 위해서 필요한 패키지, 기본 패키지가 아니라서 설치를 해야 함
!pip install requests
!pip install beautifulsoup4
2) URL 확인
=> 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 |