活用する
42668 ワード
##################################################################
私もコードの授業を聞いて整理した内容です.
出典:私もhttps://www.youtube.com/channel/UC7iAOLiALt2rtMVAWWl4pnwをコードします
##################################################################
登録 Naver Cospy時価総額ランキング獲得後
Seleniumは、Webテストの自動化を実現するフレームワークです.ブラウザの動作をプログラミングで制御することで、人が使用しているように、Webページを要求して応答を受信することができます.
設定
Celerra pip install seleniumのインストール
クロムドライバのインストール:クロムバージョンと互換性のあるものをインストールする必要があります.Chromeバージョンは「アドレス」ウィンドウにありますchrome://version入力します.
クロムバージョンのChromedriverに必ず合うようにexeが必要です.
端末にpythonを入力して実行します.
browser.get("http://daum.net" )
daumウィンドウに直接移動します.
開発者ツールを使用して検索ウィンドウを参照し、インポートして検索
これまでの作業を終了するには、次の手順に従います. CELENIEUMで故意に誤ってNAVER登録を試み、上のIDを削除してから書きます.htmlを出力して終了します. Naver航空券サイトにアクセスし、航空券を検索した後、ロード時間後の結果情報を処理します.ロード時間の処理方法を学習します.
ロードを処理する方法は2つあります.先ほどと同様、待ち時間のみ->ロードにどれくらいの時間がかかるか、効率が低下しています 要素の出現を待つように設定します.例えば、 に設定し、10秒待ちとするが、ロード完了直後に動作を処理する.動ページ(ユーザが動作時に行うページ.ex)をスクロールすると新しい情報が表示されるページ)に対してWeb scrapingを行います. は、割引された映画情報のみをもたらします.
でも10個しか持ってこなかったダイナミックページだからです.この場合、リクエストではなくseleniumと見なすべきです.
Seleniumを使用してWeb scrapingを行う場合、ブラウザを開くたびにメモリが消費され、速度が遅くなります.画面を表示する必要がなく、通常のpcではなくサーバ上でWeb scrapingを行う場合は、ブラウザを開く必要はありません.
この場合は心拍数のないクロムを使用します.クロムを入れずにクロムを使うことです.同じタスクをより高速で完了します.
既存のコードに以下のコードを追加すればよい.無頭クロム使用時の注意点 chromeからuseragent stringを受信するかheadless chromeからuseragent stringを受信するかで差があります.headlessにはheadlesschromeが追加された文が表示されます.
サーバーとしての立場で、HeadlessChromeがあればカットも可能です.だから私たちは単独で設定します.
次のコードを追加し、独自のuseragentを設定すればいいです.
私もコードの授業を聞いて整理した内容です.
出典:私もhttps://www.youtube.com/channel/UC7iAOLiALt2rtMVAWWl4pnwをコードします
##################################################################
CSV基本(NAVER金融)
登録
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が必要です.
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ログイン)
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航空券)を使う
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つあります.
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ムービー)を利用
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")
実行時にブラウザは表示されませんが、実行されます.終わったら結果は同じです.サーバーとしての立場で、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()
Reference
この問題について(活用する), 我々は、より多くの情報をここで見つけました https://velog.io/@jusung-c/활용テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol