python/python_selenium

selenium_quiz2

몽자비루 2023. 5. 1. 15:16

- 웹스크래핑을 이용하여 나만의 비서를 만들기 -

  1. 네이버에서 오늘 서울의 날씨 정보를 가져옴.
  2. 다음 뉴스 홈에서 뉴스 3건을 가져옴 (헤드라인이 현재 사라짐)
  3. it뉴스 3건을 가져옴.
  4. 해커스 어학원 홈페이지에서 오늘의 회화 지문을 가져옴.
# 웹스크래핑을 이용하여 나만의 비서를 만들기
# 1. 네이버에서 오늘 서울의 날씨 정보를 가져옴.
# 2. 다음 뉴스 홈에서 뉴스 3건을 가져옴 (헤드라인이 현재 사라짐)
# 3. it뉴스 3건을 가져온다.
# 4. 해커스 어학원 홈페이지에서 오늘의 회화 지문을 가져온다.

from bs4 import BeautifulSoup
import requests
import random
import re

def create_soup(url):
    print("="*50)
    header = {'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"}
    res = requests.get(url, headers=header)
    res.raise_for_status()
    soup = BeautifulSoup(res.text, "lxml")
    return soup

def naver_weather():
    # 1. 네이버에서 오늘 서울의 날씨 정보를 가져옴.
    url = "<https://search.naver.com/search.naver?query=%EB%82%A0%EC%94%A8>"
    soup = create_soup(url)

    temp_up = soup.select_one("span.temperature.up").get_text()
    weather = soup.select_one("span.weather.before_slash").get_text()
    temp_today = soup.select_one("span.temperature_inner").select("span")
    low_temp_today = temp_today[0].get_text()
    hight_temp_today = temp_today[2].get_text()
    temp_now = soup.select_one("div.temperature_text").get_text()

    rain_today = soup.find("div", attrs = {"class":"cell_weather"})\\
        .find_all("span", attrs={"class":"rainfall"})
    hazy = soup.select(".item_today.level1")
    print
    print("[오늘의 날씨]")
    print(f"{weather}, 어제보다 {temp_up}")
    print(f"현재 {temp_now}(최저 {low_temp_today} / 최고 {hight_temp_today})")
    print(f"오전 강수 확률 {rain_today[0].get_text()} / 오후 강수 확률 {rain_today[1].get_text()}\\n")
    print(f"{hazy[0].find('a').get_text().strip()}")
    print(f"{hazy[1].find('a').get_text().strip()}")

def daum_headline_news():
    # 2. 다음 뉴스 홈에서 뉴스 3건을 가져옴
    url = "<https://news.daum.net/>"
    soup = create_soup(url)

    # 뉴스 리스트를 받아옴
    news_list = soup.find("ul", attrs={"class":"list_newsissue"})
    # find_all(element, limit = n) : n개까지 찾음.
    news_title_list = news_list.find_all("strong", attrs={"class":"tit_g"},limit=10)
    # 랜덤 3개의 뉴스를 가져옴.
    nums = random.sample(range(1, len(news_title_list)),3)
    print("[헤드라인 뉴스]")
    for n, num in enumerate(nums):
        print(f"{n+1}. {news_title_list[num].get_text().strip()}")
        print(f"(링크 : {news_title_list[num].a['href']})")

def naver_it_news():
    # 3. it뉴스 3건을 가져온다.
    url = "<https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=105>"
    soup = create_soup(url)

    # 뉴스 리스트를 받아옴
    news_list = soup.find_all("div", attrs={"class":"cluster_text"})
    print("[IT 뉴스]")
    # 그중 최상위 3개의 뉴스 제목 및 링크를 가져옴
    for n in range(0,3):
        print(f"{n+1}. {news_list[n].find('a').get_text().strip()}")
        print(f"(링크 : {news_list[n].a['href']})")

def hackers():
    # 4. 해커스 어학원 홈페이지에서 오늘의 회화 지문을 가져온다.
    url = "<https://www.hackers.co.kr/?c=s_eng/eng_contents/I_others_english&keywd=haceng_submain_lnb_eng_I_others_english&logger_kw=haceng_submain_lnb_eng_I_others_english#;">
    soup = create_soup(url)

    text_lines = soup.find_all("div", attrs={"id": re.compile("^conv_kor")})
    print("[오늘의 영어 회화]")
    print("(영어 지문)")
    # text_lines를 슬라이싱하여 절반이후부터 끝까지 출력
    for text_line in text_lines[len(text_lines)//2:]:
        print(text_line.get_text().replace("\\n", ""))
    print("(한글 지문)")
    for text_line in text_lines[:len(text_lines)//2]:
        print(text_line.get_text().replace("\\n", ""))
    
# 코드를 직접 실행했을 때, 동작함.
if __name__ == "__main__":
    naver_weather()
    daum_headline_news()
    naver_it_news()
    hackers()
  • 오늘 날씨 : class내에 여러 class 가 있는경우 (multiple classes) select를 사용.
  • 랜덤 3개의 뉴스 : random.saple 기능을 사용하여 랜덤 3개의 뉴스를 출력.
  • IT뉴스 : 네이버 뉴스는 user-agent없이 에러가 발생하여 user-agent를 할당함.
  • 해커스 어학원 : re.compile을 사용해 id가 conv_kor로 시작하는 element 추출.