crawling, parsing, scraping
- 크롤링(crawling) = 지정한 링크의 데이터를 다 긁어오는 것
- 파싱(parsing) = 문자열데이터를 분석 및 분해하여 목적한 패턴에 맞게 문자열의 구조를 결정하는 것
- 스크래핑(scraping) = 파싱한 데이터에서 필요한 데이터만 가져오는 것
- requests 모듈을 통해 실행(import requests)
- requests.get('주소')로 원하는 데이터를 불러옴
- response = requsets.get('주소')
response.text로 텍스트 데이터 크롤링
response.content로 바이너리 데이터 크롤링
BeautifulSoup
- 받아온 html(크롤링)을 파싱하기 위해 사용하는 패키지
import bs4
bs4.BeautifulSoup()
ex) bs4.BeautifulSoup('파일명','html.parser') = 해당 파일의 html을 파싱
(해당 파일이 html이면 .parser를 입력하지 않아도 자동 적용)
- .find('태그명') = 일치하는 태그명을 가진 가장 첫 요소만 반환
- .findAll('태그명') = 일치하는 태그명을 가진 모든 요소 반환
- 둘 다 찾고자 하는 class나 id를 지정해서 실행 가능(class_='', id='')
※ att = {'class':'title'}
findAll('태크명', attrs=att)과 같이 딕셔너리로 찾고자 하는 데이터의 범위 설정 후 적용가능
import pandas as pd
def movieDf(num):
reviewList = []
stars = []
subjects = []
att = {'class':'title'}
for i in range(1, num+1):
url = f'https://movie.naver.com/movie/point/af/list.naver?&page={num}'
response = requests.get(url)
html = response.text
review = bs4.BeautifulSoup(html)
elements = review.find_all('td', attrs=att)
for e in elements:
subjects.append(e.text.split('\n')[1])
stars.append(e.text.split('\n')[3].split('중')[-1])
if e.text.split('\n')[5] == '':
reviewList.append('리뷰없음')
else:
reviewList.append(e.text.split('\n')[5])
data={'제목':subjects,'평점':stars,'후기':reviewList}
return pd.DataFrame(data)
Selenium
- 크롬인 척을 넘어서 실제로 브라우저를 제어하여 데이터를 수집, 자동화 등을 하기 위한 패키지
- bs4로 해결 할 수 없는 경우 사용 (웹주소가 GET방식이 아닌 경우, 자바스크립트를 사용하는 동적 페이지의 경우)
※ element() 안에 입력 (By 입력후 각 요소에 해당하는 데이터를 뒤이어 입력)
- By.ID = 태그의 id값으로 추출
- By.NAME = 태그의 name값으로 추출
- By.XPATH = 태그의 경로로 추출- By.LINK_TEXT = 링크 텍스트값으로 추출
- By.PARTIAL_LINK_TEXT = 링크 텍스트의 자식 텍스트 값을 추출
- By.TAG_NAME = 태그 이름으로 추출
- By.CLASS_NAME = 태그의 클래스명으로 추출
- By.CSS_SELECTOR = css선택자로 추출 (selector 복사로 추출할때 주로 사용)
- .get() = 해당 링크 실행
- 요소.send_keys("텍스트") = 해당 요소에 지정한 텍스트 입력
- 요소.click() = 해당 요소 클릭하기
- 데이터.find_element() = 해당 데이터에서 지정한 원소 찾기 (여러개이면 elements)
- 데이터.send_keys() = 해당 데이터에 지정한 원소 전달 ('\n'를 입력하면 엔터 처리)
- time.sleep() = 지정한 숫자(초)만큼 정지상태 유지
!pip install selenium
!pip install webdriver-manager
# Library 가져오기
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
chrome_driver = ChromeDriverManager().install()
service = Service(chrome_driver)
driver = webdriver.Chrome(service=service)
# 이후 원하는 동작 제시
# 네이버 로그인 페이지 접속
login_url = "https://nid.naver.com/nidlogin.login"
driver.get(login_url)
time.sleep(2) # 2초간 머뭄
# # 아이디, 비밀번호 변수에 저장
my_id = "아이디"
my_pw = "비밀번호"
# # 아이디, 비밀번호 입력
id = driver.find_element(By.CSS_SELECTOR, '#id')
id.send_keys(my_id)
id.send_keys('\n')
pw = driver.find_element(By.CSS_SELECTOR, '#pw')
pw.send_keys(my_pw)
pw.send_keys('\n')
time.sleep(1)
# # 로그인 버튼 클릭
button = driver.find_element(By.ID, "log.login")
button.click()
time.sleep(1)
# 중고나라 접속
cafe_joong = "https://cafe.naver.com/joonggonara"
driver.get(cafe_joong)
time.sleep(1500)
# '조던 판매 게시판' 클릭
menu = driver.find_element(By.ID, "menuLink2171")
menu.click()
time.sleep(1)
# 프레임 전환
# driver.switch_to.frame({frame name})
# 프레임 확인: 개발자 도구 → iframe 검색
driver.switch_to.frame("cafe_main")
time.sleep(1)
# XPath란? 웹 페이지의 구조 최상단부터 태그를 타고 들어가, 해당 HTML 요소가 어디에 존재 하는 지를 나타내는 경로의 일종
xpath = "/html/body/div[1]/div/div[4]/table/tbody/tr[1]/td[1]/div[2]/div/a"
# 첫번째 글 클릭
writing = driver.find_element(By.XPATH, xpath)
writing.click()
time.sleep(1)
# 첫번째 글 제목 출력
subject = driver.find_element(By.CSS_SELECTOR, "h3.title_text").text
# 첫번째 글 내용 출력
content = driver.find_element(By.CSS_SELECTOR, "div.se-main-container").text
print(subject, content)
driver.close()
pickle
- 객체를 바이너리 형태로 저장을 하는 방식 (용량이 작게 텍스트 데이터를 관리할 수 있음)
- 저장 : pickle.dump(객체, 파일)
- 불러오기 : pickle.load(파일)
- json도 같은 방식으로 저장 및 불러오기 가능
import pickle
with open('covid.pk', 'wb') as f: # covid1(파이썬 객체)을 covid.pk(피클 확장자 파일)로 저장
pickle.dump(covid1, f)
with open('covid.pk', 'rb') as f: # covid.pk(피클 확장자 파일)를 불러와 covid_pk(파이썬 객체)에 저장
covid_pk = pickle.load(f)
'빅데이터 부트캠프 > Crawling&Scraping' 카테고리의 다른 글
빅데이터 부트캠프 42일차 (0) | 2022.09.01 |
---|---|
빅데이터 부트캠프 37일차 (0) | 2022.08.25 |
빅데이터 부트캠프 34일차 (0) | 2022.08.22 |
댓글