Crawler 실습 - 2

  • Crawler(크롤러) : 인터넷에 있는 데이터를 자동으로 수집하는 프로그램
    -> 웹 브라우저를 흉내내는 프로그램

1) requests : 웹 사이트에 접속, 데이터를 받아오는 역할
2) BeautifulSoup : 데이터를 HTML로 해석하는 역할
-> 선행지식 : HTML에 대한 이해, CSS Selector를 만드는 방법

  • 요소 검사를 통해 확인할 수 있는 소스 코드 or 업데이트되는 환경일 때
    -> request는 정적 페이지만 가져오기 때문
    1) selenium : 웹 브라우저 자체를 컨트롤해서 크롤링
    1-1) 요소를 선택해서 사용자의 동작을 흉내냄 ex) 클릭, 키보드 입력
    선택자) xpath, css
    2) BeautifulSoup : 얻은 데이터를 HTML로 해석

  • daum 페이지의 증권 탭에서 국내 조회 급등 순위 및 현재가 가져오기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    # 조회 급등 항목 10개 찾기
    # 항목에 1개에 대한 1페이지 주가 데이터를 찾아 출력
    # 총 10개 항목에 대한 데이터를 찾아 출력
    import requests
    import json # html, xml, json처럼 포맷 방식

    from bs4 import BeautifulSoup

    url = "http://finance.daum.net/api/quote/A048410/days?symbolCode=A048410&page=1&perPage=10&"

    custom_headers = {
    'referer':'http://finance.daum.net/quotes/A048410',
    'user-agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0'
    }

    req = requests.get(url, headers=custom_headers)

    if req.status_code == requests.codes.ok:
    print("접속 성공")
    # print(req.text)
    stock_data = json.loads(req.text)
    # print(stock_data['data'][0])

    for daily_data in stock_data['data'][:5]:
    print(daily_data['date'], daily_data['tradePrice'])

    else:
    print("접속 실패")
  • 조회 급등 항목 10개의 이름과 현재가 출력하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import requests

    import json

    def get_stock_price(stock_code):
    url = "http://finance.daum.net/api/quote/"+stock_code+"/days?symbolCode="+stock_code+"&page=1&perPage=10&pagination=true"
    custom_headers = {
    'referer': 'ttp://finance.daum.net/domestic',
    'user-agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0'
    }
    req = requests.get(url, headers=custom_headers)
    data = json.loads(req.text)
    current_data = data['data'][0]['tradePrice']
    return current_data

    url = "http://finance.daum.net/api/search/ranks?limit=10"

    custom_headers = {
    'referer':'http://finance.daum.net/domestic',
    'user-agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0'
    }

    req = requests.get(url, headers=custom_headers)

    if req.status_code == requests.codes.ok:
    print("접속 성공")
    # print(req.text)
    rank_data = json.loads(req.text)
    # print(rank_data)

    for rank in rank_data['data']:
    current_price = get_stock_price(rank['symbolCode'])
    print(rank['rank'], rank['name'], rank['symbolCode'], current_price)

    else:
    print("접속 실패")
  • 원하는 종목 코드를 입력받아 해당 종목의 1페이지 주가 출력하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    # 아무 항목이나 1페이지 주가 출력
    # 사용자에게 종목 코드를 받아서 출력
    import requests

    import json

    from openpyxl import Workbook

    wb = Workbook()

    ws = wb.active

    def get_stock_data(stock_code):
    url = "http://finance.daum.net/api/quote/A"+stock_code+"/days?symbolCode=A"+stock_code+"&page=1&perPage=10&pagination=true"

    custom_headers = {
    'referer':'http://finance.daum.net/domestic',
    'user-agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0'
    }
    req = requests.get(url, headers=custom_headers)

    if req.status_code == requests.codes.ok:
    print("접속 성공")

    total_date_data = json.loads(req.text)
    print(total_date_data)
    ws.cell(row=1, column=1, value='날짜')
    ws.cell(row=1, column=2, value='시가')
    ws.cell(row=1, column=3, value='고가')
    ws.cell(row=1, column=4, value='저가')
    ws.cell(row=1, column=5, value='종가')
    for idx,date_data in enumerate(total_date_data['data']):
    ws.cell(row=idx+2, column=1, value=date_data['date'])
    ws.cell(row=idx+2, column=2, value=date_data['openingPrice'])
    ws.cell(row=idx+2, column=3, value=date_data['highPrice'])
    ws.cell(row=idx+2, column=4, value=date_data['lowPrice'])
    ws.cell(row=idx+2, column=5, value=date_data['prevClosingPrice'])
    print(date_data['date'], date_data['openingPrice'], date_data['highPrice'], date_data['lowPrice'], date_data['prevClosingPrice'])

    wb.save('stock_list.xlsx')

    else:
    print("접속 실패")

    if __name__ == "__main__":
    sb_code = input("코드 입력: ")

    get_stock_data(sb_code)
  • NAVER 개발자센터 API 사용 - papago

  1. 개발자센터 사이트에서 Application 탭으로 간다.
  2. 로그인 후, 애플리케이션 등록에서 이름과 papago API를 선택한다.(papago NMT 번역)
  3. 환경은 WEB 설정으로 한다.
  4. URL은 “http://127.0.0.1" 로 한다.
  5. 등록을 마친 후, Clinet ID와 Client Secret를 확인한다.
  6. Documents - 파파고 탭에서 구현 예제를 사용한다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import requests
    import json
    client_id = "xxxxxx" # 개발자센터에서 발급받은 Client ID
    client_secret = "xxxxx" # 개발자센터에서 발급받은 Client Secret

    custom_header = {
    "X-Naver-Client-Id":client_id,
    "X-Naver-Client-Secret":client_secret
    }

    encText = "안녕하세요." # input("번역할 문장을 입력하세요.")
    # data = "source=ko&target=en&text=" + encText
    data = {
    "source":"ko",
    "target":"en",
    "text":encText
    } # dictionary 형태

    url = "https://openapi.naver.com/v1/papago/n2mt"
    req = requests.post(url, headers=custom_header, data=data)

    if req.status_code == requests.codes.ok:
    print("접속 성공")
    trans_data = json.loads(req.text)
    print(trans_data) # 데이터 형태 파악
    print(trans_data['message']['result']['translatedText']) # 원하는 데이터 출력
  • NAVER 개발자센터 API 사용 - 단축 URL
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import requests
    import json
    client_id = "xxxxx" # 개발자센터에서 발급받은 Client ID
    client_secret = "xxxxx" # 개발자센터에서 발급받은 Client Secret

    custom_header = {
    "X-Naver-Client-Id":client_id,
    "X-Naver-Client-Secret":client_secret
    }
    encText = "https://developers.naver.com/docs/utils/shortenurl"
    data = {
    "url":encText
    }

    url = "https://openapi.naver.com/v1/util/shorturl"
    req = requests.post(url, headers=custom_header, data=data)

    if req.status_code == requests.codes.ok:
    print("접속 성공")
    trans_data = json.loads(req.text)
    print(trans_data) # 데이터 형태 파악
    print(trans_data['result']['url']) # 원하는 데이터 출력
Share