<jupyter_start><jupyter_text>requests 패키지- 브라우저가 아닌 code로 server에 request를 보냄- 1. request를 이용        - 1) API를 이용하는 방법 : json포맷으로 데이터를 받음.(string타입으로 받아서 json object로 parsing)        - 2) HTML코드를 이용하는 방법 : HTML코드를 string으로 가져와서 특정패턴의 문자열을 가져옴.css 셀렉터로 데이터를 select!!            (bs4로 parsing)        - 2. Selenium을 이용하는 방법 : 브라우저의 자동화된 testing tool인 selenium을 활용하여 직접 브라우저를 띄워서 css 셀렉터로 가져옴.<jupyter_code>import requests
from bs4 import BeautifulSoup
import forecastio<jupyter_output><empty_output><jupyter_text>- api json을 사용 : 네이버 주식 데이터 크롤링- api json을 사용, forecastio: dark sky api로 날씨 데이터를 수집- bs4 : 네이버 실시간 키워드, 다음 실시간 키워드 크롤링- web file url로 파일을 다운로드 받는 방법  1번째 방법  네이버 주식데이터 가져오기- pc 버전보다 모바일 버전이 좀더 단순하게 되어있음<jupyter_code>from pandas.io.json import json_normalize
def make_url(pageSize=10, page=1):
    return "http://m.stock.naver.com/api/json/sise/siseListJson.nhn?\
    menu=market_sum&sosok=0&pageSize=" + str(pageSize) + "&page=" + str(page)
make_url()
# 데이터를 가져와서 pandas의 dataframe으로 만드는 함수
def get_data(url):
    response = requests.get(url) # get방식 데이터 요청
    # json object로 parsing
    json_info = response.json()
    # json의 dict타입 데이터에서 데이터 가져오기
    companys = json_info['result']['itemList']
    return json_normalize(companys)
    
#     df = pd.DataFrame(columns=["종목","시세","전일비","등락율","시가총액","거래량"])
    
#     for company in companys:
#         df.loc[len(df)] = {
#             "종목": company["nm"],
#             "시세": company["nv"],
#             "전일비": company["cv"],
#             "등락율": company["cr"],
#             "시가총액": company["mks"],
#             "거래량": company["aq"],
#         }
#     return df
# url = make_url(1500,1)
# df = get_data(url)
# df.tail()
get_data(url)
# 데이터를 가져와서 pandas의 dataframe으로 만드는 함수
def get_data(url):
    response = requests.get(url) # get방식 데이터 요청
    # json object로 parsing
    json_info = response.json()
    # json의 dict타입 데이터에서 데이터 가져오기
    companys = json_info['result']['itemList']
    
    df = pd.DataFrame(columns=["종목","시세","전일비","등락율","시가총액","거래량"])
    
    for company in companys:
        df.loc[len(df)] = {
            "종목": company["nm"],
            "시세": company["nv"],
            "전일비": company["cv"],
            "등락율": company["cr"],
            "시가총액": company["mks"],
            "거래량": company["aq"],
        }
    return df<jupyter_output><empty_output><jupyter_text>dark sky api- 위도와 경도를 입력하면 날씨정보를 보내주는 api<jupyter_code>FORECAST_TOKEN = "1da567ab436e650c7af58441bd4bdbae"
# last API
def forecast(lat, lng):
    url = "https://api.darksky.net/forecast/{}/{},{}".format(FORECAST_TOKEN, lat, lng)
    response = requests.get(url)
    json_info = response.json()
    return json_info['timezone'], json_info['hourly']['summary']

lat = 37.512
lng = 126.954
forecast(lat, lng)<jupyter_output><empty_output><jupyter_text>forecastio를 이용하여 날씨 데이터 가져오기<jupyter_code>def forecast2(lat, lng):
    forecast = forecastio.load_forecast(FORECAST_TOKEN, lat, lng) # forecastio.load_forecast의 객체 생성
    byHourly = forecast.hourly()
    return byHourly.summary
lat = 37.512
lng = 126.954
forecast2(lat, lng)<jupyter_output><empty_output><jupyter_text>2번째 방법  bs4- 네이버 키워드 랭킹 데이터 크롤링- 다음 키워드 랭킹 데이터 크롤링<jupyter_code>def naver():
    df = pd.DataFrame(columns=["rank","keyword"])
    
    response = requests.get("https://www.naver.com/")
    
    dom = BeautifulSoup(response.content, "html.parser") #encoding값이 utf8이 아니면 BeautifulSoup의 encoding argument 설정해줘야 한다. 
    # select : 여러개의 html 엘리먼트를 셀렉팅할때 사용. 결과로 리스트 데이터를 리턴
    # select_one: 하나의 html 엘리먼트를 셀렉팅할때 사용. 결과로 문자열 데이터를 리턴
    keywords = dom.select(".ah_roll_area > .ah_l > .ah_item")
    
    for keyword in keywords:
        df.loc[len(df)] = {
            "rank" : keyword.select_one(".ah_r").text, #해당 엘리먼트 안의 text 데이터를 뽑는다.
            "keyword" : keyword.select_one(".ah_k").text,
        }
    return df
    
naver_df = naver()
naver_df["keyword"]
import time
ls = []
for idx in range(3):
    print(idx)
    ls.append(naver())
    time.sleep(5)
# 다음 실시간 이슈 검색어 10개 수집
# 네이버 20개의 데이터와 다음 10개 데이터에서 중복되는 데이터 출력
def daum2():
    df = pd.DataFrame()
    rank = []
    keywords = []
    response = requests.get("https://www.daum.net")
    dom = BeautifulSoup(response.content, "html.parser")
    
    keywords = dom.select(".realtime_part > .list_hotissue.issue_row > li")
    rank = [keyword.select_one(".ir_wa").text[:-1] for keyword in keywords]
    keywords = [keyword.select_one(".link_issue").text for keyword in keywords]
        
    df["rank"] = rank
    df["keywords"] = keywords
    return df

daum_df = daum2()
daum_df["keywords"]
# naver vs daum 비교

result = [keyword for keyword in naver_df["keyword"] if daum_df["keywords"].str.contains(keyword).any()]
result<jupyter_output><empty_output><jupyter_text>file download : requests- file의 url을 받아서 해당 url의 file을 다운로드하는 방법입니다.<jupyter_code># youtube 영상 다운로드 - bitly로 url길이 단출
url = "https://bit.ly/2JKy2nD"
title = "apple.mp4"
def download(title, download_link):
    response = requests.get(download_link, stream=True) # stream = True를 해야 영상(file 등)을 다운받을 수 있음.
    file_size = 0
    with open(title, "wb") as f:
        for chunk in response.iter_content(chunk_size=1024): # byte
            if chunk:
                file_size += 1024
                f.write(chunk)
    return file_size
# youtube 영상 다운로드 - bitly로 url길이 단출
url = "https://bit.ly/2JKy2nD"
title = "apple.mp4"
file_size = download(title, url)
str(round(file_size/1024/1024,2)) + "Mb"<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13530810020113365, 'fraction_numerical': 0.01755348326933626, 'mean_word_length': 3.2304717710750195, 'pattern_counts': {'":': 12, '<': 25, '<?xml version=': 0, '>': 29, 'https://': 5, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 5, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '580308', 'license': 'MIT', 'n_tokens_mistral': 2541, 'n_tokens_neox': 2923, 'n_words': 485, 'path': 'web_programming/crawling_requests.ipynb', 'repo_name': 'Junhojuno/TIL', 'size': '5469'}