contents
summary
🎯웹 스크래핑: 특정 웹 사이트나 페이지에서 필요한 데이터를 자동으로 추출해 내는 것을 의미. 원하는 정보를 추출하기 위해 HTTP GET 요청을 보냄. 정상응답을 받는 경우, 스크
래퍼는 HTML 코드를 분석하여 데이터를 추출.
🎯공통점: 원하는 데이터를 수집할 수 있다는 점에서 공통점을 지니고 있다. 기술적으로
(python)으로 함께 사용되는 경우가 많다. (웹 크롤링을 통한 웹접근 → 스크래핑을 통한특정 데이터 추출)
🎯차이점: 웹 크롤링은 웹사이트에 대한 정보를 색인화하고 저장하는 데 사용되는 반면, 웹 스크래핑은 분석 및 기타 목적을 위해 웹사이트에서 데이터를 추출하는 데 사용.
또한 웹 크롤링은 일반적으로 검색 엔진 및 기타 자동화 도구에 의해 수행되는 반면 웹 스크래핑은 종종 사람 또는 이 목적을 위해 특별히 설계된 자동화 도구에 의해 수행.
https://www.youtube.com/robots.txt
⚠️youtube 댓글 수집은 허용되지 않는다.
id
속성과 class
속성을 지정해 줄 수 있는데, 이를 이용하면 CSS나 JavaScript에서 태그를 좀더 쉽게 다룰 수 있다.🎯기본 사용방식은 아래와 같다.
#처음 1회 설치
#pip install beautifulsoup4
#pip install requests
import requests
from bs4 import BeautifulSoup as bs
url = "크롤링하려는 웹페이지의 주소"
# url에 담겨있는 http페이지 주소를 요청하여 그 주소의 요소들을 가져올 수 있도록 연결
response = requests.get(url)
# response라는 변수에 연결의 결과를 담고
# response.content 으로 받아온 결과의 내용을 html.parser라는 html해석기로 내용을 html tag 구조로 해석합니다.
soup = bs(response.content,"html.parser")
🎯간단한 예제
# 처음 1회 설치
#pip install beautifulsoup4
#pip install requests
import requests
from bs4 import BeautifulSoup as bs
# request 라이브러리를 통한 http 통신호출
page = requests.get("https://library.gabia.com/")
# beautifulsoup 라이브러리를 이용한 page의 text 데이터 파싱(문자열분석)
soup = bs(page.text, "html.parser")
# select 문법을 이용하여 html 내 필요한 부분을 모두 선택합니다.
# div.esg-entry-content 에서 a 를 타고 그 아래로 span 을 타고 내려가서 text 를 불러옵니다.
elements = soup.select('div.esg-entry-content a > span')
# for 구문을 통해 반복적으로 수행해줍니다.
for index, element in enumerate(elements, 1):
print("{} 번째 게시글의 제목: {}".format(index, element.text))
# pip install selenium
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
import time
import pandas as pd
import warnings # 경고창 무시
warnings.filterwarnings('ignore')
# 드라이버 설정 및 페이지넘버 설정(저는 12로 설정했어요)
# 함수 구현
def get_movie_reviews(url, page_num=12):
chrome_driver = 'C:/Users/user-pc/Downloads/chromedriver_win32/chromedriver.exe'
wd = webdriver.Chrome(chrome_driver)
wd.get(url)
# 빈 리스트 생성하기
writer_list=[]
review_list=[]
date_list=[]
like_list=[]
for page_no in range(1,page_num+1): # 1페이지에서 page_num까지의 리뷰 추출
try:
page_ul = wd.find_element_by_id('paging_point') # 페이지 포인트 코드 추출
page_a = page_ul.find_element_by_link_text(str(page_no))
page_a.click()
time.sleep(2) # 페이지 로딩까지의 시간 두기
writers = wd.find_elements_by_class_name('writer-name')
writer_list += [writer.text for writer in writers]
reviews = wd.find_elements_by_class_name('box-comment')
review_list += [ review.text for review in reviews ]
dates = wd.find_elements_by_class_name('day')
date_list += [date.text for date in dates]
likes = wd.find_elements_by_id('idLikeValue')
like_list += [like.text for like in likes]
if page_no%10==0: # 10이상의 값을 만났을 때 다음 페이지로 넘기기 버튼
if page_no==10:
next_button = page_ul.find_element_by_class_name("paging-side")
#next_button = page_ul.find_element_by_class_name('btn-paging next')
next_button.click()
time.sleep(2)
else:
next_button = page_ul.find_element_by_xpath('//*[@id="paging_point"]/li[13]/button').click()
time.sleep(2)
except NoSuchElementException:
break
movie_review_df = pd.DataFrame({"Writer" : writer_list,
"Review" : review_list,
"Date" : date_list,
"Like" : like_list})
wd.close()
return movie_review_df
# url 과 pagenum 을 입력하여 작성자, 리뷰내용, 작성날짜, 좋아요 수 요청 및 dataframe 반환
#범죄도시4 movie_review_df = get_movie_reviews("http://www.cgv.co.kr/movies/detail-view/?midx=88104#", page_num=3905)
movie_review_df = get_movie_reviews("http://www.cgv.co.kr/movies/detail-view/?midx=85813", page_num=12)
# dataframe 저장
movie_review_df.to_csv('범죄도시2크롤링.csv', index=False, encoding="utf-8-sig")
결과 (dataframe)
key points
많은 기업들이 최근에는 크롤링을 막아두고 있다. 그럼에도 불구하고 허가하는 이유는?