[Python] 나도코딩 웹 스크래핑편 - (16) 퀴즈2

Updated:

유튜브 나도코딩 웹 스크래핑 무료 강의를 통해 학습한 내용을 정리해서 올리고 있습니다.

실습과정에서 필요에 따라 일부 강의 내용의 누락 및 추가, 수정사항이 있습니다.

퀴즈의 경우, 유튜브 풀이와 상이할 수 있습니다.


Quiz

웹 스크래핑을 이용하여 나만의 비서를 만드시오.

[조건]

  1. 네이버에서 오늘 서울의 날씨정보 가져오기

  2. 헤드라인 뉴스 3건 가져오기

  3. IT 뉴스 3건 가져오기

1. 네이버 날씨

from bs4  import BeautifulSoup
import requests

def weather_scrape():
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36",
        "Accept-Language":"ko-KR,ko"
    }

    # 네이버: 분당 날씨 링크
    url = "https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%EC%84%9C%EC%9A%B8+%EB%82%A0%EC%94%A8&oquery=%EB%B6%84%EB%8B%B9+%EB%82%A0%EC%94%A8&tqi=hKuVAwprvxsssFXannwsssssszw-158329"

    res = requests.get(url, headers=headers)
    res.raise_for_status()

    soup = BeautifulSoup(res.text, "lxml")

    weather = soup.find("div", attrs={"class":"weather_area _mainArea"})


    # 날씨 정보
    w1 = weather.find("div", attrs={"class":"main_info"})

    today_text = w1.find("p", attrs={"class":"cast_txt"}).get_text()
    today_temp = w1.find("p", attrs={"class":"info_temperature"}).get_text().strip().replace("도씨","")
    min_temp = w1.find("span", attrs={"class":"min"}).get_text()
    max_temp = w1.find("span", attrs={"class":"max"}).get_text()

    # 미세먼지 정보
    w2 = weather.find("div", attrs={"class":"sub_info"})

    dust_1 = w2.find_all("dd")[0].find("span", attrs={"class":"num"}).get_text()
    dust_2 = w2.find_all("dd")[1].find("span", attrs={"class":"num"}).get_text()

    # 강수 정보
    w3 = weather.find("div", attrs={"class":"table_info weekly _weeklyWeather"})

    rain_morning = w3.find_all("span", attrs={"class":"rain_rate"})[0].get_text().strip()
    rain_afternoon = w3.find_all("span", attrs={"class":"rain_rate"})[1].get_text().strip()


    print("[오늘의 날씨]\n")
    print(f"{today_text}")
    print(f"현재 {today_temp} (최저 {min_temp} / 최고 {max_temp})")
    print(f"오전 {rain_morning} / 오후 {rain_afternoon}\n")
    print(f"미세먼지 {dust_1}\n초미세먼지 {dust_2}")
weather_scrape()
[오늘의 날씨]

구름많음, 어제보다 3˚ 높아요
현재 26℃ (최저 20˚ / 최고 32˚)
오전 강수확률 10% / 오후 강수확률 0%

미세먼지 54㎍/㎥
초미세먼지 34㎍/㎥
  • 원하는 형식으로 출력이 잘 된다.

  • 나는 서울 날씨를 기준으로 작성하였는데 url을 다른 지역 날씨로 해도 당연하지만 잘 작동 된다.

2. 헤드라인 뉴스

def head_news():
    headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36",
            "Accept-Language":"ko-KR,ko"
        }

    # 네이버 뉴스
    url = "https://news.naver.com"

    res = requests.get(url, headers=headers)
    res.raise_for_status()

    soup = BeautifulSoup(res.text, "lxml")

    head_news = soup.find("ul", attrs={"class":"hdline_article_list"}).find_all("li", limit=3)

    print("[헤드라인 뉴스]")
    for i, news in enumerate(head_news):
        news_info = news.find("a")
        print(str(i+1) + ".",  news_info.get_text().strip())
        
        link = url + news_info["href"]
        print(f"링크: {link}")
head_news()
[헤드라인 뉴스]
1. "男알몸 촬영·유포자는 29세 김영준"…피해자 1천300명
링크: https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=102&oid=016&aid=0001846449
2. 감사원 "국회의원은 감찰 대상 아냐…투기 조사 못한다"
링크: https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=214&aid=0001124050
3. 송영길 “내 친구 우상호…한열이 추도식 못 와 마음 찢어져”
링크: https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=020&aid=0003362913
  • 네이버 헤드라인 뉴스를 3가지 출력하였다.

  • 다만 네이버 뉴스 홈페이지에 접속하면 새로고침 할 때 마다 헤드라인 뉴스가 계속 바뀐다.

  • 따라서 코드를 다시 실행할 때마다 출력 결과 역시 같이 바뀐다.

3. IT 뉴스

def it_news():
    headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36",
            "Accept-Language":"ko-KR,ko"
        }

    # 네이버 IT 뉴스
    url = "https://news.naver.com/main/list.nhn?mode=LS2D&mid=shm&sid1=105&sid2=230"

    res = requests.get(url, headers=headers)
    res.raise_for_status()

    soup = BeautifulSoup(res.text, "lxml")

    head_news = soup.find("ul", attrs={"class":"type06_headline"}).find_all("li", limit=3)

    print("[IT 뉴스]")
    for i, news in enumerate(head_news):
        news_info = news.find_all("dt")[1].find("a")
        print(str(i+1) + ".",  news_info.get_text().strip())
                
        link = news_info["href"]
        print(f"링크: {link}")
it_news()
[IT 뉴스]
1. 넥슨 노조 "임금 삭감은 생활 공격…게임업계 사내면접 문화 바꿔야"
링크: https://news.naver.com/main/read.nhn?mode=LS2D&mid=shm&sid1=105&sid2=230&oid=421&aid=0005405102
2. 클라우드의 배반… 업체 한 곳 오류에 주요 언론·정부 사이트 마비
링크: https://news.naver.com/main/read.nhn?mode=LS2D&mid=shm&sid1=105&sid2=230&oid=023&aid=0003619158
3. “LG폰보다 훨씬 낫다?”…LG 무선이어폰 신작 미리보니
링크: https://news.naver.com/main/read.nhn?mode=LS2D&mid=shm&sid1=105&sid2=230&oid=016&aid=0001846499
  • 네이버 IT 뉴스를 3가지 출력하였다.

  • 헤드라인 뉴스 코드와 거의 똑같다.

Leave a comment