
데이터 분석 실무 with 파이썬 05장 정리
-라이브러리
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
import time
-크롬 드라이버 열기
# 크롬 드라이버 열기
serve = Service('chromedriver.exe')
driver = webdriver.Chrome(service=serve)
>> chrome 버전이 맞아야함
>> 버전 확인 (크롬 > 설정 > chrome 정보 )
>> 102.0.5005.61로 다운받아야함
>> selenium을 통해 크롬드라이버를 실행할 때 경로를 지정해야 하므로 파일이 있는 폴더에 압축 풀기
- 인스타그램 접속하기
# 인스타그램 접속하기
url = 'https://www.instagram.com/'
driver.get(url)
time.sleep(2)
>> driver.get(url) 명령을 통해 특정 url에 접속
# get -> 에러나도 에러가 뜨지 않음 아무 반응 안함
>> time 꼭 넣어줘야 함
사이트에 접속하거나 클릭한 뒤 해당 페이지의 정보를 다 받을 때 까지 대기 시간이 필요함
- url 접속하기
# 인스타그램 검색 결과 url 만들어서 접속하기
def insta_searching(word):
url = 'http://www.instagram.com/explore/tags/' + word
return url
>> insta_searching() 함수는 word라는 매개변수를 입력받는 함수
키워드 word에 따라 인스타그램 검색 결과 url이 달라짐
- F12 키 누르면 페이지 정보가 뜸
- 아이디, 비번 넣기
email = '인스타계정입력해주세요' ### 계정 정보 수정 필요
input_id = driver.find_elements_by_css_selector('input._2hvTZ.pexuQ.zyHYP')[0]
input_id.clear()
input_id.send_keys(email)
password = '인스타비번입력해주세요' ### 비번 정보 수정 필요
input_pw = driver.find_elements_by_css_selector('input._2hvTZ.pexuQ.zyHYP')[1]
input_pw.clear()
input_pw.send_keys(password)
input_pw.submit()
time.sleep(3)
>> 인스타 계정 정보인 이메일과 패스워드 입력
input_pw.submit() 이 실행되면 입력했던 계정 정보를 바탕으로 로그인 진행
** 개인 정보 노출 주의
ID : class="_2hvTZ pexuQ zyHYP"
PW : class="_2hvTZ pexuQ zyHYP"
- 검색 결과 페이지 접속하기
word = '제주도맛집'
url = insta_searching(word)
driver.get(url)
time.sleep(3)
>> selenium으로 크롬드라이버 실행.
insta_searching() 함수를 이용해 '제주도맛집'에 대한 인스타그램 검색 결과 확인하는 URL 생성
driver.get(url) 명령어를 이용해 해당 URL에 접속
이때도 time 꼭 넣어주기
- select an element 기능 활성화 >> 웹페이지의 HTML 내에서 첫 번째 게시글 해당 부분 클릭
<div class="_aagw"></div> 로 작성돼 있음
- HTML에서 첫 번째 게시글 찾아 클릭하기 (곧 제거됨)
# 첫번째 게시글 열기
# 게시글 정보 가져오기
def select_first(driver):
first = driver.find_element_by_css_selector('div._aagw')
first.click() # 클릭
time.sleep(3)
select_first(driver)
# 곧 제거되는 버전
- HTML에서 첫 번째 게시글 찾아 클릭하기 (뉴 버전)
# 첫번째 게시글 열기
# 게시글 정보 가져오기
from selenium.webdriver.common.by import By
def select_first(driver):
# first = driver.find_element_by_css_selector('div._aagw')
first = driver.find_element(By.CSS_SELECTOR, 'div._aagw')
first.click()
time.sleep(3)
select_first(driver)
# 뉴 버전
>> select_first() 함수에서는 find_element(By.CSS_SELECTOR)를 이용
태그명이 div이고 class명이 _aagw인 요소를 찾아 클릭
>> 게시글 클릭한 뒤 정보를 로딩하는 시간이 소요되기 때문에 time.sleep(3) 꼭 사용
>> 오른쪽 마우스 > copy > copy select , copy xpath
- copy element : <div class="_aagw"></div>
- copy select
#mount_0_0_za > div > div:nth-child(1) > div > div.rq0escxv.l9j0dhe7.du4w35lb > div > div > div.j83agx80.cbu4d94t.d6urw2fd.dp1hu0rb.l9j0dhe7.du4w35lb > div._a3gq > section > main > article > div._aaq8 > div > div > div:nth-child(1) > div:nth-child(1) > a > div._aagu > div._aagw
-copy xpath:
//*[@id="mount_0_0_za"]/div/div[1]/div/div[1]/div/div/div[1]/div[1]/section/main/article/div[1]/div/div/div[1]/div[1]/a/div[1]/div[2]
- 게시글 정보 가져오기
1) 현재 페이지의 HTML 정보 가져오기
# 현재 페이지 hrml 정보 가져오기
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser') # html 파싱
soup
>> driver.page_source 명령어를 통해 현재 화면에 표시된 내용의 HTML 데이터 가져오기
이 정보들을 BeautifulSoup을 통해 필요한 정보들 추출
>> 오른쪽 마우스 > 페이지 소스 보기 한 것과 같은 결과
2) 본문 내용 가져오기
# 본문 내용 가져오기
soup.select('div._aat6 > ul')
soup.select('div._aat6 > ul')[0].text
>> 게시글의 본문 가져오기
크롬 개발자 도구에서 위치 찾기 기능을 활용해 본문에 해당하는 HTML을 살펴보면 span 태그를 찾을 수 있음
<div class="_aat6"> 부분을 찾을 수 있다.
>> div._aat6 > ul : div 태그 중 class명이 _aat6인 태그, 그 바로 아래에 있는 ul 태그
('div._aat6 > ul')[0].text : ul 태그 중 첫 번째 요소 중 텍스트 부분만 선택