본문 바로가기
빅데이터 부트캠프/Crawling&Scraping

빅데이터 푸트캠프 17일차

by Mecodata 2022. 7. 26.

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)

 

댓글