活用する

42668 ワード

##################################################################
私もコードの授業を聞いて整理した内容です.
出典:私もhttps://www.youtube.com/channel/UC7iAOLiALt2rtMVAWWl4pnwをコードします
##################################################################

CSV基本(NAVER金融)


登録
  • Naver Cospy時価総額ランキング獲得後
  • import csv
    import requests
    from bs4 import BeautifulSoup
    
    filename = "시가총액1-200.csv"
    f = open(filename, "w", encoding="utf-8-sig", newline="")  
    # newline=""로 공백 없애기
    writer = csv.writer(f)
    
    # 탭으로 구분된 것을 split으로 구분하여 리스트로 만들기
    title = "N	종목명	현재가	전일비	등락률	\
    액면가	시가총액	상장주식수	외국인비율\
    거래량	PER	ROE	토론실".split("\t")
    writer.writerow(title)
    
    for i in range(1, 5):
        url = f"https://finance.naver.com/\
        sise/sise_market_sum.nhn?\
        sosok=0&page={i}"
    
        res = requests.get(url)
        res.raise_for_status()
    
        soup = BeautifulSoup(res.text, "lxml")
    
        data_rows = soup.find("table", attrs={
            "class": "type_2"
        }).find("tbody").find_all("tr")
        for row in data_rows:
            columns = row.find_all("td")
            if len(columns) <= 1:
                continue  # 의미 없는 데이터 skip
            data = [column.get_text().strip()
                    for column in columns]  # .strip()으로 정리
            # print(data)
    
            writer.writerow(data)  # 리스트 형태로 넣어야 한다.
    

    Seleniumベース


    Seleniumは、Webテストの自動化を実現するフレームワークです.ブラウザの動作をプログラミングで制御することで、人が使用しているように、Webページを要求して応答を受信することができます.

  • 設定
    Celerra pip install seleniumのインストール
    クロムドライバのインストール:クロムバージョンと互換性のあるものをインストールする必要があります.Chromeバージョンは「アドレス」ウィンドウにありますchrome://version入力します.

  • クロムバージョンのChromedriverに必ず合うようにexeが必要です.
  • 端末にpythonを入力して実行します.
    from selenium import webdriver
    browser = webdriver.Chrome()  
    # 다른 경로에 있다면 괄호 안에 적어주어야 한다.
    
    browser.get("http://naver.com")
    これによりChrome Webドライバオブジェクトが作成され、ブラウザでurlに移動します.

    elem = browser.find_element_by_class_name("link_login")
    ログインボタンを見つけるために、F 12で見つけてロードします.
    elem.click()
    前のページと次のページを往復したり、リフレッシュしたりできます.
    browser.back()
    browser.forward()
    browser.refresh()
    検索ウィンドウを見つけたら、タイプもできます.
    elem = browser.find_element_by_id("query")
    elem.send_keys("나도코딩")
    keysを入力してenterで入力した内容を検索します.
    from selenium.webdriver.common.keys import Keys
    elem.send_keys(Keys.ENTER)
    今度は技術で情報を入手しよう
    elem = browser.find_element_by_tag_name("a")
    要素が表示されます.すべての要素をインポートする場合は、elementをelementsに変換できます.インポート後にリンクを開きます.
    elem = browser.find_element_by_tag_name("a")
    for e in elem:
    	e.get_atrribute("href")
    ここから別のページに移動することもできます.
    browser.get("http://daum.net" )
    daumウィンドウに直接移動します.
    開発者ツールを使用して検索ウィンドウを参照し、インポートして検索
    elem = browser.find_element_by_name("q")
    elem.send_keys("이주성")
    elem.send_keys(Keys.ENTER)
    娯楽をしないで、クリックしてください.開発者ツールを使用して検索ボタンを検索します.xpathを使用します.
    elem = browser.find_element_by_name("q")
    elem.send_keys("이주성")
    elem = browser.find_element_by_xpath("//*\
    [@id='daumSearch']/fieldset/div/div/button[2]")
    elem.click()
    このような方法で検索することもできます.
    これまでの作業を終了するには、次の手順に従います.
    browser.close() # 현재 탭 닫기
    browser.quit() # 모든 탭 닫기
    exit()

    Selenium深化(NAVERログイン)

  • CELENIEUMで故意に誤ってNAVER登録を試み、上のIDを削除してから書きます.htmlを出力して終了します.
  • import time
    from selenium import webdriver
    
    # 다른 경로에 있다면 괄호 안에 적어주어야 한다.
    browser = webdriver.Chrome()
    
    # 1. 네이버 이동
    browser.get("http://naver.com")
    
    # 2. 로그인 버튼 클릭
    elem = browser.find_element_by_class_name("link_login")
    elem.click()
    
    # 3. id, pw 입력
    browser.find_element_by_id("id").send_keys("naver_id")
    browser.find_element_by_id("pw").send_keys("passward")
    
    # 4. 로그인 버튼 클릭
    browser.find_element_by_id("log.login").click()
    
    time.sleep(3)
    
    # 5. id를 새로 입력
    browser.find_element_by_id("id").clear()  # 지우고
    browser.find_element_by_id("id").send_keys("my_id")  # 새로 입력
    
    # 6. html 정보 출력
    print(browser.page_source)
    
    # 7. 브라우저 종료
    browser.quit()  # 전체 종료 close는 현재 탭 종료

    Selenium(NAVER航空券)を使う

  • Naver航空券サイトにアクセスし、航空券を検索した後、ロード時間後の結果情報を処理します.ロード時間の処理方法を学習します.
  • from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.maximize_window()  # 창 최대화
    
    url = "https://flight.naver.com/flights/"
    browser.get(url)  # url로 이동
    
    # 가는날, 오는날 선택
    browser.find_element_by_link_text("가는날 선택").click()
    
    # 이번달 27일, 28일 선택
    # browser.find_elements_by_link_text("27")[0].click()  # [0] -> 이번달
    # browser.find_elements_by_link_text("28")[0].click()  # [0] -> 이번달
    
    # 다음달 27일, 28일 선택
    # browser.find_elements_by_link_text("27")[1].click()  # [0] -> 이번달
    # browser.find_elements_by_link_text("28")[1].click()  # [0] -> 이번달
    
    # 이번달 27일, 다음달 28일 선택
    browser.find_elements_by_link_text("27")[0].click()  # [0] -> 이번달
    browser.find_elements_by_link_text("28")[1].click()  # [0] -> 이번달
    
    # 제주도 선택
    browser.find_element_by_xpath("//*[@id='recommendationList']/ul/li[1]").click()
    
    # 항공권 검색 클릭
    browser.find_element_by_xpath('//*[@id="searchArea"]/a').click()
    
    # 첫번째 결과 출력
    elem = browser.find_elements_by_xpath(
        '//*[@id="content"]/div[2]/div/div[4]/ul/li[1]')
    print(elem.text) 
    上記のように、ロード時間によってエラーが発生します.
    ロードを処理する方法は2つあります.
  • 先ほどと同様、待ち時間のみ->ロードにどれくらいの時間がかかるか、効率が低下しています
  • 要素の出現を待つように設定します.例えば、
  • に設定し、10秒待ちとするが、ロード完了直後に動作を処理する.
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # 항공권 검색 클릭
    browser.find_element_by_xpath('//*[@id="searchArea"]/a').click()
    
    # 브라우저를 최대 10초까지 대기하는데 XPATH 기준으로 뒤 값이 해당하는 것이 나올때까지 기다린다.
    try:
        elem = WebDriverWait(browser, 10).until(EC.presence_of_element_located\
        ((By.XPATH,'//*[@id="content"]/div[2]/div/div[4]/ul/li[1]')))
        # 성공했을 때 동작 수행 # XPATH 이외에 다른 것도 가능
        print(elem.text)
    finally:
        browser.quit()
    

    Selenium(Googleムービー)を利用

  • 動ページ(ユーザが動作時に行うページ.ex)をスクロールすると新しい情報が表示されるページ)に対してWeb scrapingを行います.
  • は、割引された映画情報のみをもたらします.
  • import requests
    from bs4 import BeautifulSoup
    
    url = "https://play.google.com/store/movies/top"
    res = requests.get(url)
    res.raise_for_status()
    
    soup = BeautifulSoup(res.text, "lxml")
    
    movies = soup.find_all("div", attrs={"class", "ImZGtf mpg5gc"})
    print(len(movies))
    
    with open("movies.html", "w", encoding="utf8") as f:
        f.write(soup.prettify())  # html 문서를 예쁘게 출력
    
    
    このようにして実行すると、出力0が表示されます.また、Chromeで生成したファイルを開くと、見た画面とは異なる英語のページが表示されます.接続されたユーザーのタイトル情報により、グーグルは異なるページに戻ることができます.韓国Chromeで接続しているときと要求通りに接続しているとき、別のページが復元されます.user agentを使用してこの問題を解決します.
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)\
             AppleWebKit/537.36 (KHTML, like Gecko) \
                 Chrome/86.0.4240.183 Safari/537.36",
        "Accept-Language":"ko-KR,ko"
        }
    既存のuser agentに[Accept-Language]:[ko-Kr,ko]を追加し、ハングルページに戻ります.そうすると、出力10が見えます.
    for movie in movies:
        title = movie.find("div", attrs={"class","WsMG1c nnK0zc"}).get_text()
        print(title)
    映画のタイトルがよく付けられているのも見えます.
    でも10個しか持ってこなかったダイナミックページだからです.この場合、リクエストではなくseleniumと見なすべきです.
    from bs4 import BeautifulSoup
    import requests
    import time
    from selenium import webdriver
    browser = webdriver.Chrome()
    browser.maximize_window()
    
    # 페이지 이동
    url = "https://play.google.com/store/movies/top"
    browser.get(url)
    
    # 스크롤 내리기
    # 모니터(해상도) 높이인 1080 위치로 스크롤 내리기
    # browser.execute_script("window.scrollTo(0, 1080)")  # 1920 x 1080
    
    
    # 화면 가장 아래로 스크롤 내리기
    # browser.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    
    
    interval = 2  # 2초에 한번씩 스크롤 내림
    
    # 현재 문서 높이를 가져와서 저장
    prev_height = browser.execute_script("return document.body.scrollHeight")
    
    # 반복 수행
    while True:
        # 스크롤을 가장 아래로 내림
        browser.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    
        # 페이지 로딩 대기
        time.sleep(interval)
    
        # 현재 문서 높이를 가져와서 저장
        curr_height = browser.execute_script(
            "return document.body.scrollHeight")
        if curr_height == prev_height:
            break
    
        prev_height = curr_height
    print("스크롤 완료")
    
    
    soup = BeautifulSoup(browser.page_source, "lxml")
    
    # movies = soup.find_all("div",
    #                        attrs={"class": ["ImZGtf mpg5gc", "Vpfmgd"]})
    # 리스트를 활용해서 or 처리를 할 수 있다.
    movies = soup.find_all("div",
                           attrs={"class": "Vpfmgd"})
    print(len(movies))
    
    for movie in movies:
        original_price = movie.find("span", attrs={"class": "SUZt4c djCuy"})
        if original_price:
            name = movie.find("div", attrs={"class": "WsMG1c nnK0zc"}).get_text()
            print(f"제목 : {name}")
    
            print(f"할인 전 가격:{original_price.get_text()}")
    
            price = movie.find(
                "span", attrs={"class": "VfPpfd ZdBevf i5DZme"}).get_text()
            print(f"할인 가격 : {price}")
    
            link = movie.find("a", attrs={"class": "JC71ub"})["href"]
            print(f"링크 : https://play.google.com{link}")
    
            print("-"*50)
        else:
            continue
    
    browser.quit()

    Headlessクロムなし


    Seleniumを使用してWeb scrapingを行う場合、ブラウザを開くたびにメモリが消費され、速度が遅くなります.画面を表示する必要がなく、通常のpcではなくサーバ上でWeb scrapingを行う場合は、ブラウザを開く必要はありません.
    この場合は心拍数のないクロムを使用します.クロムを入れずにクロムを使うことです.同じタスクをより高速で完了します.
    既存のコードに以下のコードを追加すればよい.
    options = webdriver.ChromeOptions()
    options.headless = True
    options.add_argument("window-size=1920x1080")
    既存コードのbrowser=webdriver.Chrome()を次のように変更します.
    browser = webdriver.Chrome(options=options)
    実行を開始します.ページがどのように表示されているかを確認するために、スクリーンショットを撮ることができます.
    browser.get_screenshot_as_file("google_movie.png")
    実行時にブラウザは表示されませんが、実行されます.終わったら結果は同じです.
  • 無頭クロム使用時の注意点
  • chromeからuseragent stringを受信するかheadless chromeからuseragent stringを受信するかで差があります.headlessにはheadlesschromeが追加された文が表示されます.
    サーバーとしての立場で、HeadlessChromeがあればカットも可能です.だから私たちは単独で設定します.
    次のコードを追加し、独自のuseragentを設定すればいいです.
    options.add_argument(
        "user-agent=")
    最終コード
    from selenium import webdriver
    
    options = webdriver.ChromeOptions()
    options.headless = True
    options.add_argument("window-size=1920x1080")
    options.add_argument(
        "user-agent=")
    
    browser = webdriver.Chrome(options=options)
    browser.maximize_window()
    
    url = "https://www.whatismybrowser.com/detect/what-is-my-user-agent"
    browser.get(url)
    
    detected_value = browser.find_element_by_id("detected_value")
    print(detected_value.text)
    browser.quit()