Web Crawling

Doya·2025년 4월 8일

ESTSOFT_AI개발7기

목록 보기
29/43

개요

웹 크롤링 실습

Web Crawling

  • web을 돌아다니면서 원하는 정보를 수집하는 행위
  • 웹 상에서 이미지, 텍스트, API등 다양한 데이터 형태로 존재

Selenium

  • python만 아닌 다양한 언어에서 많이 사용하는 웹 자동화 라이브러리
  • 자동으로 웹 브라우저를 제어할 수 있게 해줌
  • 웹 크롤링, 웹 테스트 자동화, 매크로 도구 제작등에 사용
from selenium import webdriver
from selenium.webdriver.common.by import By

실습 방법

  • 네이버 웹툰 댓글 클로링 및 txt, csv, json파일로 저장하기

실습에 사용한 웹툰, 결과 등은 계시 X

실습

  • txt 파일로 저장
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(options=options)
try:   
    url = '사용 URL'
    driver.get(url)
    driver.implicitly_wait(2)
    driver.execute_script('window.scrollTo(0, (document.body.scrollHeight)-2700);')
    u_cbox_list = driver.find_elements(by = By.CLASS_NAME, value = 'u_cbox_list')
    comment = driver.find_elements(by=By.CLASS_NAME, value='u_cbox_comment')
    path = './data/naverweb.txt' # 댓글 정보 내용을 일반 텍스트 파일 저장 
    file = open(path, mode='w', encoding='utf-8')
    for c in comment:    
        u_nick = c.find_element(by=By.CLASS_NAME, value = 'u_cbox_nick').text
        u_content = c.find_element(by=By.CLASS_NAME, value = 'u_cbox_contents').text
        u_date = c.find_element(by=By.CLASS_NAME, value = 'u_cbox_date').text
        u_recomm = c.find_element(by=By.CLASS_NAME, value = 'u_cbox_cnt_recomm').text
        print(f'닉네임: {u_nick}\t  날짜: {u_date}\t 내용:{u_content}\t\t  조회수: {u_recomm}\n')
        print("-" * 60)
        file.write(u_nick+ ' '+u_content+' ' +u_date+ ' ' + u_recomm + '\n')
except Exception as ex:
    print('web크롤링 에러  발생', ex)

time.sleep(10)
driver.close() #닫기
print(path, '파일 저장 성공')
file.close()
  • cvs파일로 저장
import csv

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(options=options)
try:   
    url = '사용 URL'
    driver.get(url)
    driver.implicitly_wait(2)
    driver.execute_script('window.scrollTo(0, (document.body.scrollHeight)-2700);')
    u_cbox_list = driver.find_elements(by = By.CLASS_NAME, value = 'u_cbox_list')
    comment = driver.find_elements(by=By.CLASS_NAME, value='u_cbox_comment')
    
    result = []
    pathCSV = './data/naverweb.csv' # 댓글 정보 내용을 cvs로 저장
    with open(pathCSV, mode = 'w', newline = '') as file:
        writer = csv.writer(file)
        writer.writerow(['닉네임', '날짜', '내용', '조회수'])
        for c in comment:    
            u_nick = c.find_element(by=By.CLASS_NAME, value = 'u_cbox_nick').text
            u_date = c.find_element(by=By.CLASS_NAME, value = 'u_cbox_date').text
            u_content = c.find_element(by=By.CLASS_NAME, value = 'u_cbox_contents').text
            u_recomm = c.find_element(by=By.CLASS_NAME, value = 'u_cbox_cnt_recomm').text
            print(f'닉네임: {u_nick}\t  날짜: {u_date}\t 내용:{u_content}\t\t  조회수: {u_recomm}\n')
            print("-" * 60)
            writer.writerow([u_nick, u_date, u_content, u_recomm])
        
except Exception as ex:
    print('web크롤링 에러  발생', ex)

time.sleep(10)
driver.close() #닫기
  • json 파일로 저장
# copy를 안쓰는 방식 
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(options=options)

try:
    url = '사용 URL'
    driver.get(url)  
    driver.implicitly_wait(1) 
    driver.execute_script('window.scrollTo(0, (document.body.scrollHeight)-2700);')

    u_cbox_list = driver.find_element(by=By.CLASS_NAME, value='u_cbox_list')
    comments = driver.find_elements(by=By.CLASS_NAME, value='u_cbox_comment')  
    result_list = []  
    pathjson = './data/naverweb.json'
   
    for ct in comments:
        u_nick = ct.find_element(by=By.CLASS_NAME, value='u_cbox_nick').text
        u_content = ct.find_element(by=By.CLASS_NAME, value='u_cbox_contents').text
        u_date = ct.find_element(by=By.CLASS_NAME, value='u_cbox_date').text
        u_recomm = ct.find_element(by=By.CLASS_NAME, value='u_cbox_cnt_recomm').text
        print(f'닉네임:{u_nick}\t  날짜:{u_date}\t  {u_content}\t 조회수:{u_recomm}')
        print('- ' * 60)
        #------------------------------------------------------------------------------------------------------
        #json처리 기술 [key] : value
        # 1 import json
        # 2 키값이 여러개일때 copy()
        # 3 파일 형태로 가져오기 위해 dump()
        result_dict = {
            "Nick": u_nick,
            "Date": u_date,
            "Contest": u_content,
            "Recomm": u_recomm
        }
        result_list.append(result_dict)
        with open(pathjson, 'w', encoding='utf-8-sig') as f:
            json.dump(result_list, f, ensure_ascii=False, indent=4)
        #------------------------------------------------------------------------------------------------------
except Exception as ex:
    print('web크롤링 에러이유 ', ex)   

time.sleep(5)
driver.close() #웹드라이브 닫기

JSON(JavaScript Object Notation)

  • 사람이 읽을 수 있고, 시스템에서 구문 분석할 수 있는 방식으로 데이터를 저장, 교환하기 위한 텍스트 기반 형식
  • 기본적으로 JSON은 키-값의 형태로 되어 있음
  • Javascript에 기반하지만 c, c++, c#, python등 다양한 프로그래밍 언어에서 쉽게 사용 가능함
  • 파일 확장자가 .json의 형태
profile
안녕하세요. 도야입니다

0개의 댓글