λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
βœ’οΈ Kibwa Voice Phishing Prev Project/Data Processing

[Data Processing] 1. μŒμ„± 데이터 μˆ˜μ§‘μ„ μœ„ν•œ μ›Ή 크둀링 슀크립트 μž‘μ„±

by A Lim Han 2023. 5. 23.

πŸ₯™ μŒμ„± 데이터 μˆ˜μ§‘μ„ μœ„ν•œ μ›Ή 크둀링 슀크립트 μž‘μ„±

 

 

 λ¨Έμ‹  λŸ¬λ‹μ„ μœ„ν•œ 데이터셋을 ν™•λ³΄ν•˜λŠ” κ³Όμ •μ—μ„œ λ‹€μš΄λ°›μ•„μ•Ό ν•  파일의 μˆ˜κ°€ λ§Žμ•„, μžλ™μœΌλ‘œ μŒμ„± νŒŒμΌλ“€μ„ λ‹€μš΄λ‘œλ“œν•  수 μžˆλŠ” μ›Ή 크둀링 슀크립트λ₯Ό μž‘μ„±ν•˜μ˜€λ‹€. μƒμ„±ν•œ μŠ€ν¬λ¦½νŠΈλŠ” μ•„λž˜ 2κ°€μ§€μ˜ μš”μ†Œλ₯Ό λ°˜μ˜ν•˜λ„λ‘ μž‘μ„±λ˜μ—ˆλ‹€.

 

  • λ‹€μš΄λ‘œλ“œ μ‹œ λ‹€μš΄λ  파일의 이름을 지정할 수 μžˆλ„λ‘ 함
  • νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œ μ‹œ 데이터가 μ €μž₯될 μœ„μΉ˜λ₯Ό μ„€μ •ν•  수 μžˆλ„λ‘ 함

 

 μ•„λž˜λŠ” μž‘μ„±ν•œ 크둀링 μŠ€ν¬λ¦½νŠΈμ™€ μž‘μ„±ν•œ μ½”λ“œμ— λŒ€ν•œ μ„€λͺ…이닀.

 

Download_VoiceFiles.py
0.00MB

 

from selenium import webdriver 
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import requests
from bs4 import BeautifulSoup

 

1. selenium νŒ¨ν‚€μ§€μ—μ„œ ν•„μš”ν•œ λͺ¨λ“ˆλ“€μ„ import

 

webdriver μ›Ή λΈŒλΌμš°μ € μ œμ–΄λ₯Ό μœ„ν•œ 클래슀
ActionChains 마우슀 및 ν‚€λ³΄λ“œ λ™μž‘ λͺ¨λ°©μ„ μœ„ν•œ 클래슀
Keys 특수 ν‚€ μ œμ–΄λ₯Ό μœ„ν•œ 클래슀
By0 μ›Ή μš”μ†Œλ₯Ό μ°ΎκΈ° μœ„ν•œ 방법 지정을 μœ„ν•œ 클래슀

 

 

2. μΌμ‹œμ μΈ λ”œλ ˆμ΄λ₯Ό μ£ΌκΈ° μœ„ν•œ time λͺ¨λ“ˆ import

 

 

3. μ›Ή νŽ˜μ΄μ§€μ˜ λ‚΄μš©μ„ κ°€μ Έμ˜€κΈ° μœ„ν•œ requests λͺ¨λ“ˆ import

 

 

4. HTML & XML λ¬Έμ„œ νŒŒμ‹±κ³Ό 검색을 μœ„ν•œ BeautifulSoup 라이브러리 κ°€μ Έμ˜€κΈ°

browser = webdriver.Chrome('./chromedriver.exe')
url = 'https://www.fss.or.kr/fss/bbs/B0000207/
       list.do?menuNo=200691&bbsId=&cl1Cd=&pageIndex=16&sdate=
       &edate=&searchCnd=1&searchWrd='
browser.get(url)

 

5. webdriver λͺ¨λ“ˆμ—μ„œ Chrome 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ Chrome λΈŒλΌμš°μ €λ₯Ό μ œμ–΄ν•˜κΈ° μœ„ν•œ λ“œλΌμ΄λ²„λ₯Ό 생성

 

 

6. ./chromedriver.exeλŠ” Chrome λ“œλΌμ΄λ²„μ˜ 파일 경둜

-->  ν•΄λ‹Ή νŒŒμΌμ€ Chrome λΈŒλΌμš°μ €μ™€ Selenium이 μƒν˜Έ μž‘μš©ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” 역할을 함

 

 

7. url λ³€μˆ˜μ— μŠ€ν¬λž˜ν•‘ν•˜κ³ μž ν•˜λŠ” μ›Ή νŽ˜μ΄μ§€μ˜ URLκ°’ μ €μž₯

 

 

8. browser 객체의 get λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λΈŒλΌμš°μ €λ₯Ό ν•΄λ‹Ή URL둜 이동

-->  이λ₯Ό 톡해 Selenium이 λΈŒλΌμš°μ €λ₯Ό μ œμ–΄ν•˜κ³ , μ§€μ •λœ URL에 접속할 수 있게 됨

 

 

+ 8λ²ˆκΉŒμ§€μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ Selenium을 톡해 Chrome λΈŒλΌμš°μ €κ°€ 열리고, μ§€μ •λœ URL둜 μ΄λ™ν•˜κ²Œ λœλ‹€.

μœ„ κΈ€μžκ°€ 좜λ ₯λ˜μ–΄μ•Ό 함

 

 

+ μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ μ‹œ μ•„λž˜μ™€ 같은 κ²½κ³ κ°€ λ°œμƒν•  수 μžˆλŠ”λ°, μ΄λŠ” λ¬΄μ‹œν•΄λ„ λ¬΄κ΄€ν•˜λ‹€.

act = ActionChains(browser)
lst = []

 

9. ActionChains 클래슀의 browser 객체λ₯Ό μ΄μš©ν•˜μ—¬ act 객체 생성

--> ActionChains Class

: λΈŒλΌμš°μ €μ—μ„œ μˆ˜ν–‰ν•  λ™μž‘λ“€μ„ μ •μ˜ν•˜κ³  μ œμ–΄ν•˜κΈ° μœ„ν•œ 클래슀

 

 

10. μŒμ„± 파일의 URL을 μ €μž₯ν•  리슀트인 lst 생성

from selenium.webdriver.common.by import By

for i in range(1, 10):
    try:
        element = browser.find_element(By.CSS_SELECTOR, 
                                       f'#content > div.bd-list > table > tbody
                                       > tr:nth-child({i}) > td.title > a')
        act.click(element).perform()
        time.sleep(2)
        target_element = browser.find_element(By.CSS_SELECTOR,
                                              '#content > div.bd-view > div > video')
        audio_url = target_element.get_attribute("src")
        lst.append(audio_url)
    except NoSuchElementException:
        print(f"Element not found for row {i}. Skipping...")
    finally:
        browser.back()
        time.sleep(2)

 

11. for 루프λ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • λ²”μœ„μ˜ 행에 λŒ€ν•΄ μ•„λž˜ ν–‰μœ„λ₯Ό 반볡

 

  • find_element λ©”μ„œλ“œλ₯Ό 톡해 CSS μ„ νƒμžλ‘œ μ›Ή μš”μ†Œ 탐색
  • act.click(element).perform() 을 톡해 찾은 μš”μ†Œ 클릭
  • time.sleep(2) λ₯Ό 톡해 2초 λ™μ•ˆ λŒ€κΈ°
  • target_element.get_attribute("src")λ₯Ό μ‚¬μš©ν•˜μ—¬ λ™μ˜μƒ μš”μ†Œμ˜ μ†μ„±μ—μ„œ μŒμ„± 파일 URL κ°€μ Έμ˜€κΈ°
  • κ°€μ Έμ˜¨ URL을 lst λ¦¬μŠ€νŠΈμ— μΆ”κ°€
  • browser.back()을 톡해 이전 νŽ˜μ΄μ§€λ‘œ λ˜λŒμ•„κ°€κΈ°
  • time.sleep(2) λ₯Ό 톡해 2초 λ™μ•ˆ λŒ€κΈ°

 

+ λ§Œμ•½ NoSuchElementException μ˜ˆμ™Έκ°€ λ°œμƒν•  경우, ν•΄λ‹Ή 행이 μ—†λ‹€λŠ” λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜κ³  ν•΄λ‹Ή μˆœμ„œλ₯Ό μŠ€ν‚΅ν•¨

+ 11번 μ½”λ“œκΉŒμ§€ μ‹€ν–‰ν–ˆμ„ 경우, μ•„λž˜μ™€ 같이 λΈŒλΌμš°μ €κ°€ μ§€μ†μ μœΌλ‘œ μ œμ–΄λœλ‹€.

μˆ˜μ‚¬κΈ°κ΄€ μ‚¬μΉ­ν˜•(κ²€μ°°, κ²½μ°° λ“±)(상세) _ κ·Έλ†ˆ λͺ©μ†Œλ¦¬ _ λ³΄μ΄μŠ€ν”Όμ‹± μ²΄ν—˜κ΄€ _ λ³΄μ΄μŠ€ν”Όμ‹± μ‚¬μ „μ˜ˆλ°© _ λ³΄μ΄μŠ€ν”Όμ‹±μ§€ν‚΄μ΄ _ 민원·μ‹ κ³  _ - Chrome 2023-05-24 16-11-02.mp4
15.48MB

 

print(lst)

import os
import requests

# μ €μž₯ν•  경둜 μ„€μ •
save_directory = "./Voice_FIles_Stored_Here"

# μ €μž₯ν•  디렉토리가 μ—†λ‹€λ©΄ 생성
if not os.path.exists(save_directory):
    os.makedirs(save_directory)

i = 10
for url in lst:
    response = requests.get(url)
    file_path = os.path.join(save_directory, f'{i}.mp3')
    with open(file_path, 'wb') as file:
        file.write(response.content)
        i += 1


browser.quit()

 

12. print(lst)λ₯Ό 톡해 μˆ˜μ§‘ν•œ μŒμ„± 파일의 URL 좜λ ₯

 

 

13. save_directory λ³€μˆ˜μ— μŒμ„± νŒŒμΌμ„ μ €μž₯ν•  경둜λ₯Ό 지정

+ 만일 κ²½λ‘œκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 경우 path 생성

 

 

14. for 루프λ₯Ό μ‚¬μš©ν•˜μ—¬ lst에 μ €μž₯된 μŒμ„± ν”ΌμΌμ˜ URL에 λŒ€ν•΄ μ•„λž˜ κ³Όμ • 반볡

 

  • requests.get(url)을 μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή URL둜 GET μš”μ²­ 전솑
  • μˆ˜λ Ήν•œ 응닡을 response λ³€μˆ˜μ— μ €μž₯
  • file_path λ³€μˆ˜μ— μ €μž₯ν•  파일λͺ…κ³Ό μ €μž₯ 경둜λ₯Ό 지정
  • os.path.join() ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ save_directory 와 파일λͺ…(λ³€μˆ˜ i 의 κ°’)을 κ²°ν•©
  • open(file_path, 'wb')λ₯Ό μ‚¬μš©ν•˜μ—¬ νŒŒμΌμ„ μ“°κΈ° λͺ¨λ“œλ‘œ Open  -->   'wb'은 νŒŒμΌμ„ 이진 λͺ¨λ“œλ‘œ μ—΄κΈ° μœ„ν•œ ν”Œλž˜κ·Έ
  • file.write(response.content)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‘λ‹΅μ˜ λ‚΄μš©μ„ νŒŒμΌμ— μž‘μ„±

 

 

15. λͺ¨λ“  μž‘μ—…μ΄ λλ‚˜λ©΄ browser.quit() λ©”μ„œλ“œλ₯Ό 톡해 Selenium WebDriver μ’…λ£Œ

 

 

 

μœ„ μ½”λ“œλ₯Ό λͺ¨λ‘ μˆ˜ν–‰ν•˜λ©΄, 파일의 μ €μž₯ 경둜인 Voice_FIles_Stored_Here νŒŒμΌμ— 데이터듀이 μ •μƒμ μœΌλ‘œ μ €μž₯λ˜μ—ˆμŒμ„ 확인할 수 μžˆλ‹€.