2024. 2. 14. 10:52ㆍSKKU DT
어제에 이어서 일별 시세를 스크래핑 해오는 작업을 해 볼 것이다.
tbody 안에 tr 구조가 많이 있다.
tr 구조 안에는 많은 td 구조가 있다.
import requests
from bs4 import BeautifulSoup
#import mplfinance as mpf
#import pandas as pd
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'}
response = requests.get("https://finance.naver.com/item/sise_day.naver", params={'code' : '005930'}, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
tr_list = soup.select('.type2 tr')
open = []
close = []
high = []
low = []
volume = []
dates = []
dict = {
'open': open,
'close': close,
'high': high,
'low': low,
'volume': volume,
}
for idx, tr in enumerate(tr_list):
if idx < 2:
continue
td_list = tr.select('td')
for idx, td in enumerate(td_list):
match idx:
case 0:
if td.get_text().strip() == '':
break
dates.append(td.get_text().strip())
case 1:
close.append(td.get_text().strip().replace(',', '')) #1000단위 콤마를 없애기
case 2:
open.append(td.get_text().strip().replace(',', ''))
case 3:
high.append(td.get_text().strip().replace(',', ''))
case 4:
low.append(td.get_text().strip().replace(',', ''))
case 5:
volume.append(td.get_text().strip().replace(',', ''))
print(dict)
print(dates)
데이터 시각화 -캔들 차트 그리기
-mplfinance 패키지 설치 -> pip install mplfinance
-pandas 패키지 설치 -> pip install pandas
dataframe 사용
import requests
from bs4 import BeautifulSoup
import mplfinance as mpf
import pandas as pd
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'}
response = requests.get("https://finance.naver.com/item/sise_day.naver", params={'code' : '005930'}, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
tr_list = soup.select('.type2 tr')
open = []
close = []
high = []
low = []
volume = []
dates = []
dict = {
'open': open,
'close': close,
'high': high,
'low': low,
'volume': volume,
}
for idx, tr in enumerate(tr_list):
if idx < 2:
continue
td_list = tr.select('td')
for idx, td in enumerate(td_list):
match idx:
case 0:
if td.get_text().strip() == '':
break
dates.append(td.get_text().strip())
case 1:
close.append(td.get_text().strip().replace(',', '')) #1000단위 콤마를 없애기
case 2:
open.append(td.get_text().strip().replace(',', ''))
case 3:
high.append(td.get_text().strip().replace(',', ''))
case 4:
low.append(td.get_text().strip().replace(',', ''))
case 5:
volume.append(td.get_text().strip().replace(',', ''))
df = pd.DataFrame(dict, index=pd.to_datetime(dates))
print(df)
캔들 차트를 그려보자
import requests
from bs4 import BeautifulSoup
import mplfinance as mpf
import pandas as pd
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'}
response = requests.get("https://finance.naver.com/item/sise_day.naver", params={'code' : '005930'}, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
tr_list = soup.select('.type2 tr')
open = []
close = []
high = []
low = []
volume = []
dates = []
dict = {
'open': open,
'close': close,
'high': high,
'low': low,
'volume': volume,
}
for idx, tr in enumerate(tr_list):
if idx < 2:
continue
td_list = tr.select('td')
for idx, td in enumerate(td_list):
match idx:
case 0:
if td.get_text().strip() == '':
break
dates.append(td.get_text().strip())
case 1:
close.append(int(td.get_text().strip().replace(',', ''))) #1000단위 콤마를 없애기
case 2:
open.append(int(td.get_text().strip().replace(',', '')))
case 3:
high.append(int(td.get_text().strip().replace(',', '')))
case 4:
low.append(int(td.get_text().strip().replace(',', '')))
case 5:
volume.append(int(td.get_text().strip().replace(',', '')))
df = pd.DataFrame(dict, index=pd.to_datetime(dates))
print(dict)
mpf.plot(df, type='candle', style='charles', title='Samsung Candlestick Chart', ylabel='Price', volume=True)
코드를 실행하면 캔들 차트가 그려진다. 그런데 날짜가 과거로 돌아가는 모습이라 코드를 수정한다.
수정된 코드
insert는 앞에서부터 데이터가 추가되는 형태, append는 끝에 데이터가 추가되는 형태이다.
import requests
from bs4 import BeautifulSoup
import mplfinance as mpf
import pandas as pd
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'}
response = requests.get("https://finance.naver.com/item/sise_day.naver", params={'code' : '005930'}, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
tr_list = soup.select('.type2 tr')
open = []
close = []
high = []
low = []
volume = []
dates = []
dict = {
'open': open,
'close': close,
'high': high,
'low': low,
'volume': volume,
}
for idx, tr in enumerate(tr_list):
if idx < 2:
continue
td_list = tr.select('td')
for idx, td in enumerate(td_list):
match idx:
case 0:
if td.get_text().strip() == '':
break
dates.insert(0, td.get_text().strip())
case 1:
close.insert(0, int(td.get_text().replace(',', ''))) #1000단위 콤마를 없애기
case 3:
open.insert(0, int(td.get_text().replace(',', '')))
case 4:
high.insert(0, int(td.get_text().replace(',', '')))
case 5:
low.insert(0, int(td.get_text().replace(',', '')))
case 6:
volume.insert(0, int(td.get_text().replace(',', '')))
df = pd.DataFrame(dict, index=pd.to_datetime(dates))
print(dict)
mpf.plot(df, type='candle', style='charles', title='Samsung Candlestick Chart', ylabel='Price', volume=True)
실제 일봉과 비교하면 똑같은 것을 볼 수 있다!
공시정보 가져오기
https://finance.naver.com/item/news.nhn?code=005930
공시정보도 바로 직전 일별 시세와 비슷한 구조를 가지고 있다.
table.type6 > tbody로 지정 가능하다.
iframe 이므로 해당 페이지 링크를 받아온다.
원하는 텍스트만 가져오기
import requests
from bs4 import BeautifulSoup
import mplfinance as mpf
import pandas as pd
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'}
response = requests.get("https://finance.naver.com/item/news_notice.naver", params={'code' : '005930'}, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
tbody_list = soup.select('table.type6 > tbody')
for tbody in tbody_list:
tr_list = tbody.select('tr')
for tr in tr_list:
td_list = tr.select('td')#tr 아래 td가 3개이다
for td in td_list:
print(td.get_text())
정리해서 가져오려면, 코드를 수정한다.
import requests
from bs4 import BeautifulSoup
import mplfinance as mpf
import pandas as pd
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'}
response = requests.get("https://finance.naver.com/item/news_notice.naver", params={'code' : '005930'}, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
tbody_list = soup.select('table.type6 > tbody')
title = []
info = []
dates = []
for tbody in tbody_list:
tr_list = tbody.select('tr')
for tr in tr_list:
td_list = tr.select('td')#tr 아래 td가 3개이다
for idx, td in enumerate(td_list):
text = td.get_text()
match idx:
case 0:
title.insert(0, text)
case 1:
info.insert(0, text)
case 2:
dates.insert(0, text)
print(title)
print(info)
print(dates)
테이블 형식으로 변환하기 위해서 코드 수정
import requests
from bs4 import BeautifulSoup
import mplfinance as mpf
import pandas as pd
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'}
response = requests.get("https://finance.naver.com/item/news_notice.naver", params={'code' : '005930'}, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
tbody_list = soup.select('table.type6 > tbody')
title = []
info = []
dates = []
dict = {'title':title, 'info':info, 'dates':dates}
for tbody in tbody_list:
tr_list = tbody.select('tr')
for tr in tr_list:
td_list = tr.select('td')#tr 아래 td가 3개이다
for idx, td in enumerate(td_list):
text = td.get_text()
match idx:
case 0:
title.insert(0, text)
case 1:
info.insert(0, text)
case 2:
dates.insert(0, text)
df = pd.DataFrame(dict, index=None)
print(df)
엑셀 파일로 다운로드 하기
pip install openpyxl 설치,
import requests
from bs4 import BeautifulSoup
import mplfinance as mpf
import pandas as pd
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'}
response = requests.get("https://finance.naver.com/item/news_notice.naver", params={'code' : '005930'}, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
tbody_list = soup.select('table.type6 > tbody')
title = []
info = []
dates = []
dict = {'title':title, 'info':info, 'dates':dates}
for tbody in tbody_list:
tr_list = tbody.select('tr')
for tr in tr_list:
td_list = tr.select('td')#tr 아래 td가 3개이다
for idx, td in enumerate(td_list):
text = td.get_text()
match idx:
case 0:
title.insert(0, text)
case 1:
info.insert(0, text)
case 2:
dates.insert(0, text)
df = pd.DataFrame(dict)
df.set_index(keys=['dates'], inplace=True, drop=True)
df.to_excel('./news.xlsx')
print(df)
코드를 실행하면, 엑셀파일이 폴더에 생긴다.
Selenium -WebDriver
request로는 로그인은 하지 못한다. 더 많은 기능을 할 수 있는 Selenium.
pip install selenium으로 설치,
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.naver.com')
print(driver.title)
여러 기능을 넣으면 아래 코드를 쓸 수 있다. 주석으로 설명을 대체했다.
from selenium import webdriver
from selenium.webdriver.common.by import By #By 키워드를 사용하기 위한 import
options = webdriver.ChromeOptions()
options.add_argument('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0')
driver = webdriver.Chrome()
driver.get('https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=%ED%95%98%EC%9D%B4%EB%8B%89%EC%8A%A4')
print(driver.title)
driver.implicitly_wait(10) #웹페이지가 다 로딩이 될 때까지 10초까지 기다린다
driver.maximize_window() #화면 최대화 가능
ps = driver.page_source() #웹페이지 우클릭해서 페이지 소스 보기 기능과 같다.
soup = BeautifulSoup(ps, 'html.parser') #똑같이 BeautifulSoup 사용이 가능하다.
el = driver.find_elements(By.CSS_SELECTOR, '.news_contents > .news_tit')
print(el)
원하는 부분을 지정할 수 있고 클릭이나 키 입력도 가능하다.
from selenium import webdriver
from selenium.webdriver.common.by import By #By 키워드를 사용하기 위한 import
from selenium.webdriver.common.keys import Keys
options = webdriver.ChromeOptions()
options.add_argument('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0')
driver = webdriver.Chrome()
driver.get('https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=%ED%95%98%EC%9D%B4%EB%8B%89%EC%8A%A4')
print(driver.title)
driver.implicitly_wait(10) #웹페이지가 다 로딩이 될 때까지 10초까지 기다린다
driver.maximize_window() #화면 최대화 가능
ps = driver.page_source #웹페이지 우클릭해서 페이지 소스 보기 기능과 같다.
#soup = BeautifulSoup(ps, 'html.parser') #똑같이 BeautifulSoup 사용이 가능하다.
el = driver.find_element(By.ID, 'nx_query')
el.click() #el로 지정한 부분에 마우스 클릭 가능
el.send_keys(Keys.ENTER) #키 지정 가능
원하는 검색어 입력과 검색까지 가능해졌다.
from selenium import webdriver
from selenium.webdriver.common.by import By #By 키워드를 사용하기 위한 import
from selenium.webdriver.common.keys import Keys
import time
options = webdriver.ChromeOptions()
options.add_argument('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0')
driver = webdriver.Chrome()
driver.get('https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=%ED%95%98%EC%9D%B4%EB%8B%89%EC%8A%A4')
print(driver.title)
driver.implicitly_wait(10) #웹페이지가 다 로딩이 될 때까지 10초까지 기다린다
driver.maximize_window() #화면 최대화 가능
ps = driver.page_source #웹페이지 우클릭해서 페이지 소스 보기 기능과 같다.
#soup = BeautifulSoup(ps, 'html.parser') #똑같이 BeautifulSoup 사용이 가능하다.
el = driver.find_element(By.ID, 'nx_query')
el.click() #el로 지정한 부분에 마우스 클릭 가능
el.send_keys('젤라또') #키 지정 가능
el.send_keys(Keys.ENTER)
time.sleep(10)
Selenium으로 인스타 로그인하기
dotenv 패키지 설치로 보안을 강화한다.
pip install python-dotenv 설치
from selenium import webdriver
from selenium.webdriver.common.by import By #By 키워드를 사용하기 위한 import
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
from dotenv import load_dotenv
import os
load_dotenv(verbose=True)
INSTAGRAM_ID = os.getenv('INSTAGRAM_ID')
INSTAGRAM_PASSWORD = os.getenv('INSTAGRAM_PASSWORD')
.env 파일을 하나 만들고 아이디와 비밀번호를 넣으면 된다. git에 올린다면 .env 파일은 .gitignore에 추가하면 된다.
INSTAGRAM_ID=asdfasdfasdf
INSTAGRAM_PASSWORD=asdfasdfasdf
ID와 패스워드 인풋이 같은 클래스를 가지고 있다.
위를 바탕으로 아래와 같이 코드를 작성할 수 있다.
from selenium import webdriver
from selenium.webdriver.common.by import By #By 키워드를 사용하기 위한 import
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
from dotenv import load_dotenv
import os
load_dotenv(verbose=True)
INSTAGRAM_ID = os.getenv('INSTAGRAM_ID') #알맞은 키 값으로 가져오기
INSTAGRAM_PASSWORD = os.getenv('INSTAGRAM_PASSWORD')
options = webdriver.ChromeOptions()
options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0')
driver = webdriver.Chrome()
driver.get('https://instagram.com')
driver.implicitly_wait(10) #웹페이지가 다 로딩이 될 때까지 10초까지 기다린다
driver.maximize_window() #화면 최대화 가능
el = driver.find_elements(By.CSS_SELECTOR, '._aa4b._add6._ac4d._ap35') #selector로 가져올 때는 샵을 넣기, ID input 태그 선택하기
el[0].send_keys(INSTAGRAM_ID) #내 ID를 텍스트로 넣기
el[1].send_keys(INSTAGRAM_PASSWORD)
el[1].send_keys(Keys.ENTER) #아이디, 패스워드 입력한 후 엔터키
time.sleep(8) #로그인 할 때는 implicitly_wait이 먹히지 않는다.
로그인이 잘 된다!
인스타에서 태그 검색하기
검색 부분의 클래스를 살펴본다. 클래스가 매우 길다.
코드로 복사해서 공백 선택한 후 Ctrl+d 하면 뒤의 공백도 같이 잡혀서 한 번에 점을 찍는다.
검색을 하기 위해서 해당 부분 키 입력에 대한 코드를 작성한다.
search_btn = driver.find_element(By.CSS_SELECTOR, '.x9f619.x3nfvp2.xr9ek0c.xjpr12u.xo237n4.x6pnmvc.x7nr27j.x12dmmrz.xz9dl7a.xn6708d.xsag5q8.x1ye3gou.x80pfx3.x159b3zp.x1dn74xm.xif99yt.x172qv1o.x10djquj.x1lhsz42.xzauu7c.xdoji71.x1dejxi8.x9k3k5o.xs3sg5q.x11hdxyr.x12ldp4w.x1wj20lx.x1lq5wgf.xgqcy7u.x30kzoy.x9jhf4c')
search_btn.click()
search_input = driver.find_element(By.CSS_SELECTOR, '.x1lugfcp.x19g9edo.x1lq5wgf.xgqcy7u.x30kzoy.x9jhf4c.x972fbf.xcfux6l.x1qhh985.xm0m39n.x9f619.x5n08af.xl565be.x5yr21d.x1a2a7pz.xyqdw3p.x1pi30zi.xg8j3zb.x1swvt13.x1yc453h.xh8yej3.xhtitgo.xs3hnx8.x1dbmdqj.xoy4bel.x7xwk5j')
반응형 웹이라 클래스명이 계속 바뀐다...
XPath로 해결이 가능하다. 트리 구조로 클래스 명이 달라져도 따라갈 수 있다.
전체 코드를 작성하였다.
from selenium import webdriver
from selenium.webdriver.common.by import By #By 키워드를 사용하기 위한 import
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
from dotenv import load_dotenv
import os
load_dotenv(verbose=True)
INSTAGRAM_ID = os.getenv('INSTAGRAM_ID') #알맞은 키 값으로 가져오기
INSTAGRAM_PASSWORD = os.getenv('INSTAGRAM_PASSWORD')
options = webdriver.ChromeOptions()
options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0')
driver = webdriver.Chrome()
driver.get('https://instagram.com')
driver.implicitly_wait(10) #웹페이지가 다 로딩이 될 때까지 10초까지 기다린다
driver.maximize_window() #화면 최대화 가능
el = driver.find_elements(By.CSS_SELECTOR, '._aa4b._add6._ac4d._ap35') #selector로 가져올 때는 샵을 넣기, ID input 태그 선택하기
el[0].send_keys(INSTAGRAM_ID) #내 ID를 텍스트로 넣기
el[1].send_keys(INSTAGRAM_PASSWORD)
el[1].send_keys(Keys.ENTER) #아이디, 패스워드 입력한 후 엔터키
time.sleep(8) #로그인 할 때는 implicitly_wait이 먹히지 않는다.
search_btn = driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div[1]/div[1]/div[1]/div/div/div[1]/div/div[2]/div[2]/span/div/a/div')
search_btn.click()
driver.implicitly_wait(10)
search_input = driver.find_element(By.CSS_SELECTOR, '.x1lugfcp.x19g9edo.x1lq5wgf.xgqcy7u.x30kzoy.x9jhf4c.x972fbf.xcfux6l.x1qhh985.xm0m39n.x9f619.x5n08af.xl565be.x5yr21d.x1a2a7pz.xyqdw3p.x1pi30zi.xg8j3zb.x1swvt13.x1yc453h.xh8yej3.xhtitgo.xs3hnx8.x1dbmdqj.xoy4bel.x7xwk5j')
search_input.send_keys('#디지털트윈')
search_input.send_keys(Keys.ENTER)
driver.implicitly_wait(10)
time.sleep(100)
인스타그램 로그인하고, 검색 부분에 클릭을 하고, 검색창에 "#디지털트윈"까지 입력되는 것을 확인하였다.
하지만 엔터를 눌러도 검색이 되진 않는다.
코드를 수정하여 태그 검색된 결과로 바로 가도록 바꾼다.
from selenium import webdriver
from selenium.webdriver.common.by import By #By 키워드를 사용하기 위한 import
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
from dotenv import load_dotenv
import os
load_dotenv(verbose=True)
INSTAGRAM_ID = os.getenv('INSTAGRAM_ID') #알맞은 키 값으로 가져오기
INSTAGRAM_PASSWORD = os.getenv('INSTAGRAM_PASSWORD')
options = webdriver.ChromeOptions()
options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0')
driver = webdriver.Chrome()
driver.get('https://instagram.com')
driver.implicitly_wait(10) #웹페이지가 다 로딩이 될 때까지 10초까지 기다린다
driver.maximize_window() #화면 최대화 가능
el = driver.find_elements(By.CSS_SELECTOR, '._aa4b._add6._ac4d._ap35') #selector로 가져올 때는 샵을 넣기, ID input 태그 선택하기
el[0].send_keys(INSTAGRAM_ID) #내 ID를 텍스트로 넣기
el[1].send_keys(INSTAGRAM_PASSWORD)
el[1].send_keys(Keys.ENTER) #아이디, 패스워드 입력한 후 엔터키
time.sleep(8) #로그인 할 때는 implicitly_wait이 먹히지 않는다.
#search_btn = driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div[1]/div[1]/div[1]/div/div/div[1]/div/div[2]/div[2]/span/div/a/div')
#search_btn.click()
#driver.implicitly_wait(10)
#search_input = driver.find_element(By.CSS_SELECTOR, '.x1lugfcp.x19g9edo.x1lq5wgf.xgqcy7u.x30kzoy.x9jhf4c.x972fbf.xcfux6l.x1qhh985.xm0m39n.x9f619.x5n08af.xl565be.x5yr21d.x1a2a7pz.xyqdw3p.x1pi30zi.xg8j3zb.x1swvt13.x1yc453h.xh8yej3.xhtitgo.xs3hnx8.x1dbmdqj.xoy4bel.x7xwk5j')
#search_input.send_keys('#디지털트윈')
#search_input.send_keys(Keys.ENTER)
driver.get('https://www.instagram.com/explore/tags/디지털트윈/')
driver.implicitly_wait(10)
time.sleep(100)
가장 첫 번째 게시물을 가져올 것이다.
아래와 같은 코드로 가장 첫 번째 게시물을 클릭하는 데에 성공했다.
from selenium import webdriver
from selenium.webdriver.common.by import By #By 키워드를 사용하기 위한 import
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
from dotenv import load_dotenv
import os
load_dotenv(verbose=True)
INSTAGRAM_ID = os.getenv('INSTAGRAM_ID') #알맞은 키 값으로 가져오기
INSTAGRAM_PASSWORD = os.getenv('INSTAGRAM_PASSWORD')
options = webdriver.ChromeOptions()
options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0')
driver = webdriver.Chrome()
driver.get('https://instagram.com')
driver.implicitly_wait(10) #웹페이지가 다 로딩이 될 때까지 10초까지 기다린다
driver.maximize_window() #화면 최대화 가능
el = driver.find_elements(By.CSS_SELECTOR, '._aa4b._add6._ac4d._ap35') #selector로 가져올 때는 샵을 넣기, ID input 태그 선택하기
el[0].send_keys(INSTAGRAM_ID) #내 ID를 텍스트로 넣기
el[1].send_keys(INSTAGRAM_PASSWORD)
el[1].send_keys(Keys.ENTER) #아이디, 패스워드 입력한 후 엔터키
time.sleep(8) #로그인 할 때는 implicitly_wait이 먹히지 않는다.
#search_btn = driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div[1]/div[1]/div[1]/div/div/div[1]/div/div[2]/div[2]/span/div/a/div')
#search_btn.click()
#driver.implicitly_wait(10)
#search_input = driver.find_element(By.CSS_SELECTOR, '.x1lugfcp.x19g9edo.x1lq5wgf.xgqcy7u.x30kzoy.x9jhf4c.x972fbf.xcfux6l.x1qhh985.xm0m39n.x9f619.x5n08af.xl565be.x5yr21d.x1a2a7pz.xyqdw3p.x1pi30zi.xg8j3zb.x1swvt13.x1yc453h.xh8yej3.xhtitgo.xs3hnx8.x1dbmdqj.xoy4bel.x7xwk5j')
#search_input.send_keys('#디지털트윈')
#search_input.send_keys(Keys.ENTER)
driver.get('https://www.instagram.com/explore/tags/디지털트윈/')
driver.implicitly_wait(10)
post = driver.find_elements(By.CSS_SELECTOR, '._ac7v._al3n > ._aabd._aa8k._al3l')[0]
post.click()
time.sleep(100)
다음 게시물 버튼 누르기
from selenium import webdriver
from selenium.webdriver.common.by import By #By 키워드를 사용하기 위한 import
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
from dotenv import load_dotenv
import os
load_dotenv(verbose=True)
INSTAGRAM_ID = os.getenv('INSTAGRAM_ID') #알맞은 키 값으로 가져오기
INSTAGRAM_PASSWORD = os.getenv('INSTAGRAM_PASSWORD')
options = webdriver.ChromeOptions()
options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0')
driver = webdriver.Chrome()
driver.get('https://instagram.com')
driver.implicitly_wait(10) #웹페이지가 다 로딩이 될 때까지 10초까지 기다린다
driver.maximize_window() #화면 최대화 가능
el = driver.find_elements(By.CSS_SELECTOR, '._aa4b._add6._ac4d._ap35') #selector로 가져올 때는 샵을 넣기, ID input 태그 선택하기
el[0].send_keys(INSTAGRAM_ID) #내 ID를 텍스트로 넣기
el[1].send_keys(INSTAGRAM_PASSWORD)
el[1].send_keys(Keys.ENTER) #아이디, 패스워드 입력한 후 엔터키
time.sleep(8) #로그인 할 때는 implicitly_wait이 먹히지 않는다.
#search_btn = driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div[1]/div[1]/div[1]/div/div/div[1]/div/div[2]/div[2]/span/div/a/div')
#search_btn.click()
#driver.implicitly_wait(10)
#search_input = driver.find_element(By.CSS_SELECTOR, '.x1lugfcp.x19g9edo.x1lq5wgf.xgqcy7u.x30kzoy.x9jhf4c.x972fbf.xcfux6l.x1qhh985.xm0m39n.x9f619.x5n08af.xl565be.x5yr21d.x1a2a7pz.xyqdw3p.x1pi30zi.xg8j3zb.x1swvt13.x1yc453h.xh8yej3.xhtitgo.xs3hnx8.x1dbmdqj.xoy4bel.x7xwk5j')
#search_input.send_keys('#디지털트윈')
#search_input.send_keys(Keys.ENTER)
driver.get('https://www.instagram.com/explore/tags/디지털트윈/')
driver.implicitly_wait(10)
post = driver.find_elements(By.CSS_SELECTOR, '._ac7v._al3n > ._aabd._aa8k._al3l')[0]
post.click()
driver.implicitly_wait(10)
next_btn = driver.find_element(By.CSS_SELECTOR, '._aaqg._aaqh > ._abl-')
post.click()
time.sleep(100)
Selector가 너무 많아지므로 상단에 Dictionary 형태로 selector를 하나 만들어서 관리하도록 바꾸었다.
from selenium import webdriver
from selenium.webdriver.common.by import By #By 키워드를 사용하기 위한 import
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
from dotenv import load_dotenv
import os
#Dictionary 타입 selector 정리하기
selector = {
'id_input':'._aa4b._add6._ac4d._ap35',
'first_post':'._ac7v._al3n > ._aabd._aa8k._al3l',
'next_btn':'._aaqg._aaqh > ._abl-'
}
load_dotenv(verbose=True)
INSTAGRAM_ID = os.getenv('INSTAGRAM_ID') #알맞은 키 값으로 가져오기
INSTAGRAM_PASSWORD = os.getenv('INSTAGRAM_PASSWORD')
options = webdriver.ChromeOptions()
options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0')
driver = webdriver.Chrome()
driver.get('https://instagram.com')
driver.implicitly_wait(10) #웹페이지가 다 로딩이 될 때까지 10초까지 기다린다
driver.maximize_window() #화면 최대화 가능
el = driver.find_elements(By.CSS_SELECTOR, selector['id_input']) #selector로 가져올 때는 샵을 넣기, ID input 태그 선택하기
el[0].send_keys(INSTAGRAM_ID) #내 ID를 텍스트로 넣기
el[1].send_keys(INSTAGRAM_PASSWORD)
el[1].send_keys(Keys.ENTER) #아이디, 패스워드 입력한 후 엔터키
time.sleep(8) #로그인 할 때는 implicitly_wait이 먹히지 않는다.
#search_btn = driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div[1]/div[1]/div[1]/div/div/div[1]/div/div[2]/div[2]/span/div/a/div')
#search_btn.click()
#driver.implicitly_wait(10)
#search_input = driver.find_element(By.CSS_SELECTOR, '.x1lugfcp.x19g9edo.x1lq5wgf.xgqcy7u.x30kzoy.x9jhf4c.x972fbf.xcfux6l.x1qhh985.xm0m39n.x9f619.x5n08af.xl565be.x5yr21d.x1a2a7pz.xyqdw3p.x1pi30zi.xg8j3zb.x1swvt13.x1yc453h.xh8yej3.xhtitgo.xs3hnx8.x1dbmdqj.xoy4bel.x7xwk5j')
#search_input.send_keys('#디지털트윈')
#search_input.send_keys(Keys.ENTER)
driver.get('https://www.instagram.com/explore/tags/디지털트윈/')
driver.implicitly_wait(10)
post = driver.find_elements(By.CSS_SELECTOR, selector['first_post'])[0]
post.click()
driver.implicitly_wait(10)
next_btn = driver.find_element(By.CSS_SELECTOR, selector['next_btn'])
post.click()
time.sleep(100)
이미지 크롤링
*사진 자체를 저장하려면 파일 입출력을 해야한다.
의류 브랜드 인스타그램 공식 계정에서 상단 10개 게시물의 사진 1장과 본문, 좋아요 수, 게시 일자 가져와서 엑셀에 저장하기
-의류 브랜드 url 5개 정도 배열에 ['nike','chanel'...]
-첫 번째 게시물 클릭하고 수집하고 다음 게시물 넘어가기
-DataFrame으로 가공하고 엑셀에 저장
-게시물 첫 번째가 동영상일 때 다음으로 넘어가기
날짜 가져오기
클래스명 _aaqe 사용하면 된다
본문 가져오기
h1._ap3a._aaco._aacu._aacx._aad7._aade 클래스 명으로 가져오면 된다.
from selenium import webdriver
from selenium.webdriver.common.by import By #By 키워드를 사용하기 위한 import
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
from dotenv import load_dotenv
import os
#Dictionary 타입 selector 정리하기
selector = {
'id_input':'._aa4b._add6._ac4d._ap35',
'first_post':'._ac7v._al3n > ._aabd._aa8k._al3l',
'next_btn':'._aaqg._aaqh > ._abl-',
'cover':'._ac7v.xzboxd6.sras4av.sgc1b0m div ._aagu ._aagv img',
'test':'h1._ap3a._aaco._aacu._aacx._aad7._aade'
}
brands = ['nike', 'chanel', 'hermes', 'adidas', 'gucci']
load_dotenv(verbose=True)
INSTAGRAM_ID = os.getenv('INSTAGRAM_ID') #알맞은 키 값으로 가져오기
INSTAGRAM_PASSWORD = os.getenv('INSTAGRAM_PASSWORD')
options = webdriver.ChromeOptions()
options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0')
driver = webdriver.Chrome()
driver.get('https://instagram.com')
driver.implicitly_wait(10) #웹페이지가 다 로딩이 될 때까지 10초까지 기다린다
driver.maximize_window() #화면 최대화 가능
def click_nxt():
next_btn = driver.find_element(By.CSS_SELECTOR, selector['next_btn'])
next_btn.click()
driver.implicitly_wait(10)
el = driver.find_elements(By.CSS_SELECTOR, selector['id_input']) #selector로 가져올 때는 샵을 넣기, ID input 태그 선택하기
el[0].send_keys(INSTAGRAM_ID) #내 ID를 텍스트로 넣기
el[1].send_keys(INSTAGRAM_PASSWORD)
el[1].send_keys(Keys.ENTER) #아이디, 패스워드 입력한 후 엔터키
time.sleep(8) #로그인 할 때는 implicitly_wait이 먹히지 않는다.
text = []
image = []
like = []
date = []
data = {'text':text, 'image':image, 'like':like, 'date':date}
#search_btn = driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div[1]/div[1]/div[1]/div/div/div[1]/div/div[2]/div[2]/span/div/a/div')
#search_btn.click()
#driver.implicitly_wait(10)
#search_input = driver.find_element(By.CSS_SELECTOR, '.x1lugfcp.x19g9edo.x1lq5wgf.xgqcy7u.x30kzoy.x9jhf4c.x972fbf.xcfux6l.x1qhh985.xm0m39n.x9f619.x5n08af.xl565be.x5yr21d.x1a2a7pz.xyqdw3p.x1pi30zi.xg8j3zb.x1swvt13.x1yc453h.xh8yej3.xhtitgo.xs3hnx8.x1dbmdqj.xoy4bel.x7xwk5j')
#search_input.send_keys('#디지털트윈')
#search_input.send_keys(Keys.ENTER)
for b in brands:
driver.get(f'https://instagram.com/{b}')
driver.implicitly_wait(10)
images = []
for i in range(10):
cover = driver.find_elements(By.CSS_SELECTOR, selector['cover'])[i]
images.append(cover.get_attribute('src'))
post = driver.find_elements(By.CSS_SELECTOR, selector['first_post'])[0]
post.click()
driver.implicitly_wait(10)
click_nxt()
time.sleep(10)
span a span 안에 좋아요의 class를 넣으면 좋아요만 보인다.
날짜랑 좋아요까지 완성(selector 딕셔너리 수정 필요)
from selenium import webdriver
from selenium.webdriver.common.by import By #By 키워드를 사용하기 위한 import
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
from dotenv import load_dotenv
import os
#Dictionary 타입 selector 정리하기
selector = {
'id_input':'._aa4b._add6._ac4d._ap35',
'first_post':'._ac7v.xzboxd6.xras4av.xgc1b0m > .x5yr21d.xu96u03.x10l6tqk.x13vifvy.x87ps6o.xh8yej3',
'next_btn':'._aaqg._aaqh > ._abl-',
'cover':'._ac7v.xzboxd6.sras4av.sgc1b0m div ._aagu ._aagv img',
'text':'h1._ap3a._aaco._aacu._aacx._aad7._aade',
'like':'span a span .html-span.xdj266r.x11i5rnm.xat24cr.x1mh8g0r.xexx8yu.x4uap5.x18d9i69.xkhd6sd.x1hl2dhg.x16tdsg8.x1vvkbs',
'date':'._aaqe'
}
brands = ['nike', 'chanel', 'hermes', 'adidas', 'gucci']
load_dotenv(verbose=True)
INSTAGRAM_ID = os.getenv('INSTAGRAM_ID') #알맞은 키 값으로 가져오기
INSTAGRAM_PASSWORD = os.getenv('INSTAGRAM_PASSWORD')
options = webdriver.ChromeOptions()
options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0')
driver = webdriver.Chrome()
driver.get('https://instagram.com')
driver.implicitly_wait(10) #웹페이지가 다 로딩이 될 때까지 10초까지 기다린다
driver.maximize_window() #화면 최대화 가능
def click_nxt():
next_btn = driver.find_element(By.CSS_SELECTOR, selector['next_btn'])
next_btn.click()
driver.implicitly_wait(10)
el = driver.find_elements(By.CSS_SELECTOR, selector['id_input']) #selector로 가져올 때는 샵을 넣기, ID input 태그 선택하기
el[0].send_keys(INSTAGRAM_ID) #내 ID를 텍스트로 넣기
el[1].send_keys(INSTAGRAM_PASSWORD)
el[1].send_keys(Keys.ENTER) #아이디, 패스워드 입력한 후 엔터키
time.sleep(8) #로그인 할 때는 implicitly_wait이 먹히지 않는다.
text = []
image = []
like = []
date = []
data = {'text':text, 'image':image, 'like':like, 'date':date, 'brand':brands}
#search_btn = driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div[1]/div[1]/div[1]/div/div/div[1]/div/div[2]/div[2]/span/div/a/div')
#search_btn.click()
#driver.implicitly_wait(10)
#search_input = driver.find_element(By.CSS_SELECTOR, '.x1lugfcp.x19g9edo.x1lq5wgf.xgqcy7u.x30kzoy.x9jhf4c.x972fbf.xcfux6l.x1qhh985.xm0m39n.x9f619.x5n08af.xl565be.x5yr21d.x1a2a7pz.xyqdw3p.x1pi30zi.xg8j3zb.x1swvt13.x1yc453h.xh8yej3.xhtitgo.xs3hnx8.x1dbmdqj.xoy4bel.x7xwk5j')
#search_input.send_keys('#디지털트윈')
#search_input.send_keys(Keys.ENTER)
for b in brands:
driver.get(f'https://instagram.com/{b}')
driver.implicitly_wait(10)
images = []
for i in range(10):
cover = driver.find_elements(By.CSS_SELECTOR, selector['cover'])[i]
images.append(cover.get_attribute('src'))
image.append()
post = driver.find_elements(By.CSS_SELECTOR, selector['first_post'])[0]
post.click()
driver.implicitly_wait(10)
text.append(driver.find_element(By.CSS_SELECTOR, selector['text']).text)
like.append(driver.find_element(By.CSS_SELECTOR, selector['like']))
date.append(driver.find_element(By.CSS_SELECTOR, selector['date']).get_attribute('title'))
click_nxt()
print('image', image)
print('text', text)
time.sleep(10)
최종 코드
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
from dotenv import load_dotenv # pip install python-dotenv
import os
from selenium.common.exceptions import NoSuchElementException
selector = {
'id_input':'._aa4b._add6._ac4d._ap35',
'first_post': '._ac7v.xzboxd6.xras4av.xgc1b0m div a ._aagu > ._aagv + ._aagw',
'next_btn': '._aaqg._aaqh > ._abl-',
'cover': '._ac7v.xzboxd6.xras4av.xgc1b0m div ._aagu ._aagv img',
'text': 'h1._ap3a._aaco._aacu._aacx._aad7._aade',
'like': 'span a span .html-span.xdj266r.x11i5rnm.xat24cr.x1mh8g0r.xexx8yu.x4uap5.x18d9i69.xkhd6sd.x1hl2dhg.x16tdsg8.x1vvkbs',
'date': '._aaqe'
}
brands = ['nike', 'chanel', 'hermes', 'adidas', 'gucci']
load_dotenv(verbose=True)
INSTAGRAM_ID = os.getenv('INSTAGRAM_ID')
INSTAGRAM_PASSWORD = os.getenv('INSTAGRAM_PASSWORD')
options = webdriver.ChromeOptions()
options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36')
driver = webdriver.Chrome()
driver.get('https://instagram.com')
driver.implicitly_wait(10)
driver.maximize_window()
def click_nxt():
next_btn = driver.find_element(By.CSS_SELECTOR, selector['next_btn'])
next_btn.click()
driver.implicitly_wait(10)
# 인스타그램 로그인하기
el = driver.find_elements(By.CSS_SELECTOR, selector['id_input']) # ID input태그 선택하기
el[0].send_keys(INSTAGRAM_ID)
el[1].send_keys(INSTAGRAM_PASSWORD)
el[1].send_keys(Keys.ENTER)
time.sleep(8)
text = []
image = []
like = []
date = []
data = {'text': text, 'image': image, 'like': like, 'date': date, 'brand': brands}
# 의류브랜드 데이터 수집
for b in brands:
driver.get(f'https://instagram.com/{b}/')
driver.implicitly_wait(10)
images = []
for i in range(10):
cover = driver.find_elements(By.CSS_SELECTOR, selector['cover'])[i]
images.append(cover.get_attribute('src'))
image = image + images
post = driver.find_elements(By.CSS_SELECTOR, selector['first_post'])[0]
post.click()
driver.implicitly_wait(10)
for i in range(10):
try:
text.append(driver.find_element(By.CSS_SELECTOR, selector['text']).text)
except NoSuchElementException:
print('no element')
like.append(driver.find_element(By.CSS_SELECTOR, selector['like']))
date.append(driver.find_element(By.CSS_SELECTOR, selector['date']).get_attribute('title'))
if i < 9:
next_btn = driver.find_element(By.CSS_SELECTOR, selector['next_btn'])
next_btn.click()
driver.implicitly_wait(10)
print('image', image)
print('text',text)
print('like', like)
print('date', date)
time.sleep(10)
'SKKU DT' 카테고리의 다른 글
[SKKU DT] 73일차 -MySQL 데이터베이스, FastAPI (1) | 2024.02.16 |
---|---|
[SKKU DT] 72일차 -웹 스크래핑(웹 크롤링)(3) Selenium 인스타그램 크롤링, 유튜브 크롤링 / MySQL 데이터베이스 (2) | 2024.02.15 |
[SKKU DT] 70일차 -웹 스크래핑(웹 크롤링), 파이썬 (1) | 2024.02.13 |
[SKKU DT] 69일차 -유니티 Shader Graph(셰이더 그래프), Particle System(파티클 시스템) 정리, 예제 (0) | 2024.02.07 |
[SKKU DT] 68일차 -유니티 Rest API 활용하기(뉴스 기사, 주식 정보), Shader Graph(셰이더 그래프) (1) | 2024.02.06 |