ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Webcrawling - XML
    Python 2020. 6. 8. 17:27

    기상청 자료 크롤링 하기

    기상청 rss

    endpoint

    import urllib.request as req
    import requests
    from bs4 import BeautifulSoup
    import os.path
    import time
    url = 'http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108'
    dt = time.strftime('%Y%m%d', time.localtime(time.time()))
    xml_file = 'forecast_{}.xml'.format(dt)

    xml 파일로 저장

    if not os.path.exists(xml_file):
        req.urlretrieve(url, xml_file)
    # try-catch를 해야되지만 명백히 있는 파일이니까 바로 read
    xml = open(xml_file, 'r', encoding='utf-8').read()
    soup = BeautifulSoup(xml)
    location = soup.select_one('location')
    location.select_one('city').text
    '서울'
    locations = soup.select('location')
    info = dict()
    for location in locations:
        city = location.select_one('city').text
        weather = location.select_one('wf').text
        if not (weather in info):
            info[weather] = []
        info[weather].append(city)
    #info

    케이웨더 생활날씨-생활지수 가져오기

    url = 'https://www.kweather.co.kr/forecast/forecast_living_jisu.html'
    response = requests.get(url)
    soup = BeautifulSoup(response.text)
    #soup
    ul = soup.select_one('#jisu_navi_content')
    a_href = ul.select_one('a')['href']
    a_href
    "javascript:startRequest('../data/JISU/11B00000.xml','1');"
    address1 = a_href.split('..')[1]
    address2 = address1.split("',")[0]
    address2
    '/data/JISU/11B00000.xml'
    a_href_all = ul.select('a')
    xml_list = []
    for item in a_href_all:
        a_href = item['href']
        address1 = a_href.split('..')[1]
        address2 = address1.split("',")[0]
        xml_list.append(address2)
    xml_list
    ['/data/JISU/11B00000.xml',
     '/data/JISU/11D10000.xml',
     '/data/JISU/11D20000.xml',
     '/data/JISU/11C10000.xml',
     '/data/JISU/11C20000.xml',
     '/data/JISU/11H10000.xml',
     '/data/JISU/11H20000.xml',
     '/data/JISU/11F10000.xml',
     '/data/JISU/11F20000.xml',
     '/data/JISU/11G00000.xml']

    정규표현식 사용하여 가져오기

    import re
    xml_re_list = []
    for item in a_href_all:
        a_href = item['href']
        info = re.search('/data/JISU/.+.xml', a_href)
        xml_re_list.append(info.group())
    xml_re_list
    ['/data/JISU/11B00000.xml',
     '/data/JISU/11D10000.xml',
     '/data/JISU/11D20000.xml',
     '/data/JISU/11C10000.xml',
     '/data/JISU/11C20000.xml',
     '/data/JISU/11H10000.xml',
     '/data/JISU/11H20000.xml',
     '/data/JISU/11F10000.xml',
     '/data/JISU/11F20000.xml',
     '/data/JISU/11G00000.xml']
    # 서울/경기
    url = 'https://www.kweather.co.kr{}'.format(xml_list[0])
    response = requests.get(url)
    response.status_code
    200
    response.encoding = None
    soup = BeautifulSoup(response.text)
    soup
    <?xml version='1.0' encoding='utf-8' ?>
    <jisu>
    <areacode>11B00000</areacode>
    <areaname>서울,경기</areaname>
    <tm>2020/06/08</tm>
    <tmyyyy>2020</tmyyyy>
    <tmmm>06</tmmm>
    <tmdd>08</tmdd>
    <tmyo>월</tmyo>
    <ndate num="0">
    <jtitle>
    <name>나들이</name>
    <jfix>나들이</jfix>
    <num>01</num>
    <jnum>80</jnum>
    <jtext>더워서 걱정이네요</jtext>
    </jtitle>
    <jtitle>
    <name>빨래</name>
    <jfix>빨래</jfix>
    <num>02</num>
    <jnum>90</jnum>
    <jtext>아주 잘 말라요</jtext>
    </jtitle>
    <jtitle>
    <name>세차</name>
    <jfix>세차</jfix>
    <num>03</num>
    <jnum>90</jnum>
    <jtext>세차효과 길어요</jtext>
    </jtitle>
    <jtitle>
    <name>난방</name>
    <jfix>난방</jfix>
    <num>04</num>
    <jnum>20</jnum>
    <jtext>난방 불필요해요</jtext>
    </jtitle>
    <jtitle>
    <name>불조심</name>
    <jfix>불조심</jfix>
    <num>05</num>
    <jnum>20</jnum>
    <jtext>소화기 점검은 평소에</jtext>
    </jtitle>
    <jtitle>
    <name>운동</name>
    <jfix>운동</jfix>
    <num>06</num>
    <jnum>90</jnum>
    <jtext>컨디션이 좋습니다</jtext>
    </jtitle>
    <jtitle>
    <name>감기</name>
    <jfix>감기</jfix>
    <num>07</num>
    <jnum>60</jnum>
    <jtext>저항력을 높이세요</jtext>
    </jtitle>
    <jtitle>
    <name>공해</name>
    <jfix>공해</jfix>
    <num>08</num>
    <jnum>60</jnum>
    <jtext>대체로 좋은 편</jtext>
    </jtitle>
    <jtitle>
    <name>냉방</name>
    <jfix>냉방</jfix>
    <num>09</num>
    <jnum>60</jnum>
    <jtext>쾌적한 실내온도 유지하세요</jtext>
    </jtitle>
    <jtitle>
    <name>불쾌</name>
    <jfix>불쾌</jfix>
    <num>10</num>
    <jnum>80</jnum>
    <jtext>마음의 폭을 넓히세요</jtext>
    </jtitle>
    <jtitle>
    <name>자외선</name>
    <jfix>자외선</jfix>
    <num>11</num>
    <jnum>80</jnum>
    <jtext>장시간 야외활동은 위험해요</jtext>
    </jtitle>
    <jtitle>
    <name>모기</name>
    <jfix>모기</jfix>
    <num>12</num>
    <jnum>90</jnum>
    <jtext>모기 공격 조심</jtext>
    </jtitle>
    <jtitle>
    <name>부패</name>
    <jfix>부패</jfix>
    <num>13</num>
    <jnum>40</jnum>
    <jtext>냉장보관이 안전해요</jtext>
    </jtitle>
    <jtitle>
    <name>골프</name>
    <jfix>골프</jfix>
    <num>33</num>
    <jnum>80</jnum>
    <jtext>라운딩에 좋은 조건입니다.</jtext>
    </jtitle>
    </ndate>
    <ndate num="1">
    <jtitle>
    <name>나들이</name>
    <jfix>나들이</jfix>
    <num>01</num>
    <jnum>70</jnum>
    <jtext>더위먹지 않도록 주의</jtext>
    </jtitle>
    <jtitle>
    <name>빨래</name>
    <jfix>빨래</jfix>
    <num>02</num>
    <jnum>90</jnum>
    <jtext>아주 잘 말라요</jtext>
    </jtitle>
    <jtitle>
    <name>세차</name>
    <jfix>세차</jfix>
    <num>03</num>
    <jnum>90</jnum>
    <jtext>세차하기 좋은날</jtext>
    </jtitle>
    <jtitle>
    <name>난방</name>
    <jfix>난방</jfix>
    <num>04</num>
    <jnum>20</jnum>
    <jtext>난방 불필요해요</jtext>
    </jtitle>
    <jtitle>
    <name>불조심</name>
    <jfix>불조심</jfix>
    <num>05</num>
    <jnum>20</jnum>
    <jtext>소화기 점검은 평소에</jtext>
    </jtitle>
    <jtitle>
    <name>운동</name>
    <jfix>운동</jfix>
    <num>06</num>
    <jnum>90</jnum>
    <jtext>컨디션이 좋습니다</jtext>
    </jtitle>
    <jtitle>
    <name>감기</name>
    <jfix>감기</jfix>
    <num>07</num>
    <jnum>60</jnum>
    <jtext>저항력을 높이세요</jtext>
    </jtitle>
    <jtitle>
    <name>공해</name>
    <jfix>공해</jfix>
    <num>08</num>
    <jnum>60</jnum>
    <jtext>대체로 좋은 편</jtext>
    </jtitle>
    <jtitle>
    <name>냉방</name>
    <jfix>냉방</jfix>
    <num>09</num>
    <jnum>60</jnum>
    <jtext>적당한 냉방이 필요해요</jtext>
    </jtitle>
    <jtitle>
    <name>불쾌</name>
    <jfix>불쾌</jfix>
    <num>10</num>
    <jnum>80</jnum>
    <jtext>말다툼은 금물</jtext>
    </jtitle>
    <jtitle>
    <name>자외선</name>
    <jfix>자외선</jfix>
    <num>11</num>
    <jnum>90</jnum>
    <jtext>장시간 야외활동은 위험해요</jtext>
    </jtitle>
    <jtitle>
    <name>모기</name>
    <jfix>모기</jfix>
    <num>12</num>
    <jnum>40</jnum>
    <jtext>모기가 힘이 없어요</jtext>
    </jtitle>
    <jtitle>
    <name>부패</name>
    <jfix>부패</jfix>
    <num>13</num>
    <jnum>60</jnum>
    <jtext>냉장고에 보관하세요</jtext>
    </jtitle>
    <jtitle>
    <name>골프</name>
    <jfix>골프</jfix>
    <num>33</num>
    <jnum>80</jnum>
    <jtext>라운딩에 좋은 조건입니다.</jtext>
    </jtitle>
    </ndate>
    <ndate num="2">
    <jtitle>
    <name>나들이</name>
    <jfix>나들이</jfix>
    <num>01</num>
    <jfix></jfix>
    <jnum>70</jnum>
    <jtext>더위먹지 않도록 주의</jtext>
    </jtitle>
    <jtitle>
    <name>빨래</name>
    <jfix>빨래</jfix>
    <num>02</num>
    <jfix></jfix>
    <jnum>70</jnum>
    <jtext>마르는데 지장 없어요</jtext>
    </jtitle>
    <jtitle>
    <name>세차</name>
    <jfix>세차</jfix>
    <num>03</num>
    <jfix></jfix>
    <jnum>90</jnum>
    <jtext>광택도 내보세요</jtext>
    </jtitle>
    <jtitle>
    <name>난방</name>
    <jfix>난방</jfix>
    <num>04</num>
    <jfix></jfix>
    <jnum>20</jnum>
    <jtext>난방은 필요없어요</jtext>
    </jtitle>
    <jtitle>
    <name>불조심</name>
    <jfix>불조심</jfix>
    <num>05</num>
    <jfix></jfix>
    <jnum>20</jnum>
    <jtext>소화기 점검은 평소에</jtext>
    </jtitle>
    <jtitle>
    <name>운동</name>
    <jfix>운동</jfix>
    <num>06</num>
    <jfix></jfix>
    <jnum>70</jnum>
    <jtext>수분공급 충분히</jtext>
    </jtitle>
    <jtitle>
    <name>감기</name>
    <jfix>감기</jfix>
    <num>07</num>
    <jfix></jfix>
    <jnum>60</jnum>
    <jtext>저항력을 높이세요</jtext>
    </jtitle>
    <jtitle>
    <name>공해</name>
    <jfix>공해</jfix>
    <num>08</num>
    <jfix></jfix>
    <jnum>60</jnum>
    <jtext>대체로 좋은 편</jtext>
    </jtitle>
    <jtitle>
    <name>냉방</name>
    <jfix>냉방</jfix>
    <num>09</num>
    <jfix></jfix>
    <jnum>60</jnum>
    <jtext>활동시간에는 꼭 냉방 필요</jtext>
    </jtitle>
    <jtitle>
    <name>불쾌</name>
    <jfix>불쾌</jfix>
    <num>10</num>
    <jfix></jfix>
    <jnum>80</jnum>
    <jtext>마음을 너그럽게 가지세요</jtext>
    </jtitle>
    <jtitle>
    <name>자외선</name>
    <jfix>자외선</jfix>
    <num>11</num>
    <jfix></jfix>
    <jnum>90</jnum>
    <jtext>장시간 야외활동은 위험해요</jtext>
    </jtitle>
    <jtitle>
    <name>모기</name>
    <jfix>모기</jfix>
    <num>12</num>
    <jfix></jfix>
    <jnum>40</jnum>
    <jtext>모기가 힘이 없어요</jtext>
    </jtitle>
    <jtitle>
    <name>부패</name>
    <jfix>부패</jfix>
    <num>13</num>
    <jfix></jfix>
    <jnum>70</jnum>
    <jtext>부패 조심하세요</jtext>
    </jtitle>
    <jtitle>
    <name>골프</name>
    <jfix>골프</jfix>
    <num>33</num>
    <jfix></jfix>
    <jnum>80</jnum>
    <jtext>라운딩에 좋은 조건입니다.</jtext>
    </jtitle>
    </ndate>
    </jisu>

    데이터 한개 가져오기

    jisu_name = soup.select_one('name').text
    jisu_jnum = soup.select_one('jnum').text
    jisu_jtext = soup.select_one('jtext').text
    print(jisu_name, jisu_jnum, jisu_jtext)
    나들이 80 더워서 걱정이네요

    데이터 전체 가져오기

    jisu_name_all = soup.select('name')
    jisu_jnum_all = soup.select('jnum')
    jisu_jtext_all = soup.select('jtext')
    print(len(jisu_name_all))
    print(len(jisu_jnum_all))
    print(len(jisu_jtext_all))
    42
    42
    42
    jisu_sk_list = []
    for i in range(len(jisu_name_all)):
        jisu_i = (jisu_name_all[i].text, jisu_jnum_all[i].text, jisu_jtext_all[i].text)
        jisu_sk_list.append(jisu_i)
    jisu_sk_list
    [('나들이', '80', '더워서 걱정이네요'),
     ('빨래', '90', '아주 잘 말라요'),
     ('세차', '90', '세차효과 길어요'),
     ('난방', '20', '난방 불필요해요'),
     ('불조심', '20', '소화기 점검은 평소에'),
     ('운동', '90', '컨디션이 좋습니다'),
     ('감기', '60', '저항력을 높이세요'),
     ('공해', '60', '대체로 좋은 편'),
     ('냉방', '60', '쾌적한 실내온도 유지하세요'),
     ('불쾌', '80', '마음의 폭을 넓히세요'),
     ('자외선', '80', '장시간 야외활동은 위험해요'),
     ('모기', '90', '모기 공격 조심'),
     ('부패', '40', '냉장보관이 안전해요'),
     ('골프', '80', '라운딩에 좋은 조건입니다.'),
     ('나들이', '70', '더위먹지 않도록 주의'),
     ('빨래', '90', '아주 잘 말라요'),
     ('세차', '90', '세차하기 좋은날'),
     ('난방', '20', '난방 불필요해요'),
     ('불조심', '20', '소화기 점검은 평소에'),
     ('운동', '90', '컨디션이 좋습니다'),
     ('감기', '60', '저항력을 높이세요'),
     ('공해', '60', '대체로 좋은 편'),
     ('냉방', '60', '적당한 냉방이 필요해요'),
     ('불쾌', '80', '말다툼은 금물'),
     ('자외선', '90', '장시간 야외활동은 위험해요'),
     ('모기', '40', '모기가 힘이 없어요'),
     ('부패', '60', '냉장고에 보관하세요'),
     ('골프', '80', '라운딩에 좋은 조건입니다.'),
     ('나들이', '70', '더위먹지 않도록 주의'),
     ('빨래', '70', '마르는데 지장 없어요'),
     ('세차', '90', '광택도 내보세요'),
     ('난방', '20', '난방은 필요없어요'),
     ('불조심', '20', '소화기 점검은 평소에'),
     ('운동', '70', '수분공급 충분히'),
     ('감기', '60', '저항력을 높이세요'),
     ('공해', '60', '대체로 좋은 편'),
     ('냉방', '60', '활동시간에는 꼭 냉방 필요'),
     ('불쾌', '80', '마음을 너그럽게 가지세요'),
     ('자외선', '90', '장시간 야외활동은 위험해요'),
     ('모기', '40', '모기가 힘이 없어요'),
     ('부패', '70', '부패 조심하세요'),
     ('골프', '80', '라운딩에 좋은 조건입니다.')]

     

    'Python' 카테고리의 다른 글

    Open API_Naver  (0) 2020.06.10
    Selenium  (0) 2020.06.08
    로그인하여 데이터 크롤링하기  (0) 2020.06.08
    Web-Crawling (다음 뉴스)  (0) 2020.06.08
    Web-Crawling (네이버 영화)  (0) 2020.06.05
Designed by Tistory.