Today I Learned (TIL)/Python

[TIL] Python 챌린지 - 1회차

신짜린 2024. 7. 17. 18:20

개인_추가_학습_파이썬_챌린지_1주차_웹크롤링.html
1.10MB

1. 웹사이트

구분 정적 웹사이트 동적 웹사이트
콘텐츠 고정된 HTML 파일로 구성되어 있어 모든 사용자에게 동일한 내용을 보여줌 사용자 요청에 따라 실시간으로 생성되어 개인화된 내용을 제공 할 수 있음
서버 처리 서버는 단순히 미리 작성된 파일을 전송함 서버에서 스크립트를 실행하여 동적으로 콘텐츠를 생성
데이터베이스 일반적으로 데이터베이스를 사용하지 않음 대부분 데이터베이스를 사용하여 정보를 저장하고 검색
상호작용 사용자와의 상호작용이 제한적 사용자와 다양한 방식으로 상호작용할 수 있음
로딩 속도 일반적으로 빠름 정적 웹사이트보다 상대적으로 느릴 수 있음

 

2. 웹 크롤링 기호: '뉴스 헤드라인 수집'

- Requests 라이브러리

 Python용 HTTP 라이브러리를 말한다. HTTP는 웹 브라우저와 서버 간 데이터 전송 프로토콜을 말한다.

!pip install requests
import requests
r = requests.get('https://www.naver.com')
print(r.text)

 

- BeautifulSoup4 라이브러리

 HTML과 XML 파일에서 데이터를 추출하는 Python 라이브러리를 말한다. 웹 스크래핑과 파싱에 유용하다.

!pip install beautifulsoup4
from bs4 import BeautifulSoup
import requests

# 웹 페이지 가져오기
r = requests.get('https://zdnet.co.kr/newskey/?lstcode=%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5')

# BeautifulSoup 객체 생성
soup = BeautifulSoup(r.text, 'html.parser')

# 단일 요소 선택
element = soup.select_one('body > div.contentWrapper > div > div.left_cont > div.news_box > div:nth-child(1) > div.assetText > a')

# 여러 요소 선택
elements = soup.select('body > div.contentWrapper > div > div.left_cont > div.news_box > div > div.assetText > a')

# 특정 속성 값 추출
href = elements[0]['href']

# 텍스트 내용 추출
text = soup.select('body > div.contentWrapper > div > div.left_cont > div.news_box > div > div.assetText > a > h3')[0].text

print(f"링크: {href}")
print(f"제목: {text}")
# 페이지 이동
# URL에 페이지 번호 파라미터 추가
<https://zdnet.co.kr/newskey/?lstcode=%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&page=2>
# XML 데이터 가지고 오기
import requests
from bs4 import BeautifulSoup
import csv

# 구글 뉴스 RSS 피드 URL
url = "https://news.google.com/rss?hl=ko&gl=KR&ceid=KR:ko"

# 웹 페이지 내용 가져오기
response = requests.get(url)

# HTML 파싱하기
soup = BeautifulSoup(response.content, 'xml')

# 뉴스 항목 찾기
items = soup.find_all('item')

headlines = []
# 처음 10개의 헤드라인만 처리
for item in items[:10]:
    headline = {
        'title': item.title.text,
        'link': item.link.text,
        'pubDate': item.pubDate.text
    }
    headlines.append(headline)

# CSV 파일로 저장하기
filename = 'headlines.csv'
with open(filename, 'w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=['title', 'link', 'pubDate'])
    writer.writeheader()
    writer.writerows(headlines)

print("Headlines saved to headlines.csv")