본문 바로가기

카테고리 없음

BeautifulSoup 웹 스크래핑

 

삼성전자 주식의 과거 거래일 및 거래 데이터 수집 (1~10페이지)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import undetected_chromedriver as uc

driver = uc.Chrome()

driver.get("https://finance.naver.com/item/sise_day.naver?code=005930")

from bs4 import BeautifulSoup
import pandas as pd
import warnings
warnings.filterwarnings('ignore')

# driver.find_element(By.CSS_SELECTOR, 'table.type2')
html = BeautifulSoup(driver.page_source)
table = html.find('table', class_ = 'type2')
pd.read_html(str(table))[0].dropna()

 


페이지 끝까지 가져오기

from bs4 import BeautifulSoup
import pandas as pd
import warnings
warnings.filterwarnings("ignore")
import undetected_chromedriver as uc

driver = uc.Chrome()


box = []
# 셀레니움 사용해서 1~710페이지까지만 하나의 데이터 프레임
for n in range(1, 710):
    driver.get(f"https://finance.naver.com/item/sise_day.naver?code=005930&page={n}")
    # HTML 소스 코드가 모두 뜰 때까지 최대 10초 기다려라! 다 뜰때까지
    driver.implicitly_wait(10)
    html = BeautifulSoup(driver.page_source) # 현재 창에 있는 소스를 들고 옴    
    table = html.find("table", class_ = "type2")
    table = pd.read_html(str(table))[0].dropna()
    box.append(table)
    #time.sleep(2)

driver.implicitly_wait(10) 함수

-> html 소스코드가 다 뜰 때까지 최대 10초 기다리는 함수 (시간 없을 때 쓰기)

 


 

로그인

driver = uc.Chrome()
driver.get('https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com/')

driver.find_element(By.CSS_SELECTOR, 'input.input_id').send_keys('my id')
time.sleep(1)
driver.find_element(By.CSS_SELECTOR, 'input.input_pw').send_keys('my pw')
time.sleep(1)

driver.find_element(By.CSS_SELECTOR, 'button.btn_login').click()

import pyautogui

# 현재 마우스 위치 출력
login_id = pyautogui.position()
login_id

import pyperclip

pyautogui.click(login_id)
time.sleep(1)
pyautogui.click(login_id)
time.sleep(1)

pyperclip.copy('dfdsdf')
pyautogui.hotkey('ctrl', 'v')

pyautogui.click(login_pw)
time.sleep(1)
pyautogui.click(login_pw)
time.sleep(1)

pyperclip.copy('dfdsdf')
pyautogui.hotkey('ctrl', 'v')

 


 

1. 중복된 상품 없이 100개 이상의 상품 정보 수집하기(제목, 가격, 평점)
2. 수집된 정보는 데이터프레임으로 만들기

# Chrome 드라이버 실행
driver = uc.Chrome()
driver.get('https://shopping.naver.com/fresh/directfarm/home')
total = set()

# 1. 중복된 상품 없이 100개 이상의 상품 정보 수집하기(제목, 가격, 평점)
# 2. 수집한 정보는 데이터프레임으로 만들기


while True:
    body = driver.find_element(By.CSS_SELECTOR, "body")
    body.send_keys(Keys.PAGE_DOWN)
    time.sleep(2)

    for i in driver.find_elements(By.CSS_SELECTOR, "li._1OKV3UfxuI"):
        title = (i.find_element(By.CSS_SELECTOR, "strong._1lxNNH5gfD").text)
        price = (i.find_element(By.CSS_SELECTOR, 'span._3MzrqSUlwR').text)
        star = (i.find_element(By.CSS_SELECTOR, "span._29gNnX1yLx").text.split("\n")[1])
        a = (title, price, star)
        total.add(a)

    print(f"{len(total)}개 아이템 수집완료")
    
    if len(total) >= 100:
        break

 


블로그 제목 가져오기

iframe : 부모 문서와는 별개의 문서로, 독립적으로 콘텐츠를 로드할 수 있는 HTML 요소

driver.switch_to.frame('mainFrame')
driver.find_element(By.CSS_SELECTOR, 'div.pcol1').text

 


 

네이버 국내증시 - 시가총액 다 체크해서 가져오기

Network - Payload에서

이런식으로 볼 수 있음.

 

태그이름이 input, class name이 fieldIds

total = []

for n in tqdm(range(1, 47)):

    dic = {"menu" : 'market_sum',
           "returnUrl" : f"http://finance.naver.com/sise/sise_market_sum.naver?sosok=0&page={n}",
           "fieldIds" : fields}

    url = requests.post("https://finance.naver.com/sise/field_submit.naver", data = dic)
    html = BeautifulSoup(url.text)

    table = html.find("table", class_ = 'type_2')
    table = pd.read_html(str(table))[0]
    total.append(table)
    time.sleep(2)
    
table = pd.concat(total)
table.dropna(subset="종목명").columns

table = pd.concat(total)
stock = table.dropna(subset="종목명").columns
stock.to_excel('stock.xlsx', index=False)