Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

jh-data1og 님의 블로그

패스트캠퍼스 ㅣ 데이터분석 부트캠프 18기 4주차 본문

카테고리 없음

패스트캠퍼스 ㅣ 데이터분석 부트캠프 18기 4주차

jh-data1og 2025. 3. 23. 15:52

 

 

 

 

 

#3월 19일 (수) 파이썬 실강

N 페이지까지의 구글 뉴스 수집

 

(1) 구글 뉴스 검색으로 이동
from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()

 

 

(2) 첫번째 뉴스의 제목, 내용, 언론사, 작성시간, 링크 수집 - 싱글 데이터

 

제목 = browser.find_element(By.CLASS_NAME, 'n0jPhd').text # 제목
내용 = browser.find_element(By.CLASS_NAME, 'GI74Re').text # 내용
언론사 = browser.find_element(By.CLASS_NAME, 'MgUUmf').text # 언론사
작성시간 = browser.find_element(By.CLASS_NAME, 'rbYSKb').text # 작성시간
링크 = browser.find_element(By.CLASS_NAME, 'WlydOe').get_attribute('href') # 링크

제목, 내용, 언론사, 작성시간, 링크

 

(3) 1페이지 전체 뉴스의 제목, 내용, 언론사, 작성시간, 링크 수집 - 멀티 데이터

 

data = browser.find_elements(By.CLASS_NAME, 'SoaBEf')
data_list = []

for index, i in enumerate(data):
    print(f'현재 {index} 뉴스를 가져오는 중입니다...')
   
    제목 = i.find_element(By.CLASS_NAME, 'n0jPhd').text # 제목
    내용 = i.find_element(By.CLASS_NAME, 'GI74Re').text # 내용
    언론사 = i.find_element(By.CLASS_NAME, 'MgUUmf').text # 언론사
    작성시간 = i.find_element(By.CLASS_NAME, 'rbYSKb').text # 작성시간
    링크 = i.find_element(By.CLASS_NAME, 'WlydOe').get_attribute('href') # 링크

    data_list.append({
        '제목':제목,
        '내용':내용,
        '언론사':언론사,
        '작성시간':작성시간,
        '링크':링크
    })

 

(4) N 페이지까지 뉴스 데이터 수집

 

① 다음 페이지 이동 버튼 클릭

 

② 페이지 이동은 GET 메소드 -> URL을 통해 변경 요청 - url parser 활용

 

- url의 start 값이 변경되도록 하기

for i in range(0, 50, 10):

  print(url)

 

- 브라우저를 변경된 url로 이동시키기 : browser.get()

import time
for i in range(0, 50, 10):

  time.sleep(5)
  browser.get(url)

 

keyword = input('검색어를 입력하세요 :')

data_list = []
for page in range(0, 30, 10):
    url = f'https://www.google.com/search?q={keyword}&newwindow=1&sca_esv=3caead4b194ccc5f&tbs=sbd:1&tbm=nws&sxsrf=ADLYWILNkD6jUfJMfDWC1vl6p9sAIh4o0A:1737614318161&ei=7uORZ8izCZmp0-kPo-3UuQ8&start={page}&sa=N&ved=2ahUKEwjI4sLhnYuLAxWZ1DQHHaM2NfcQ8tMDegQIAxAE&biw=1182&bih=1241&dpr=1.6'
    print(f'{page}로 이동 중 입니다.')
    browser.get(url)
   
    data = browser.find_elements(By.CLASS_NAME, 'SoaBEf')
   
    for i in data:
        제목 = i.find_element(By.CLASS_NAME, 'n0jPhd').text # 제목
        내용 = i.find_element(By.CLASS_NAME, 'GI74Re').text # 내용
        언론사 = i.find_element(By.CLASS_NAME, 'MgUUmf').text # 언론사
        작성시간 = i.find_element(By.CLASS_NAME, 'rbYSKb').text # 작성시간
        링크 = i.find_element(By.CLASS_NAME, 'WlydOe').get_attribute('href') # 링크
   
        data_list.append({
            '제목':제목,
            '내용':내용,
            '언론사':언론사,
            '작성시간':작성시간,
            '링크':링크
        })

        print(f'제목: {제목}')

 

③ 수집한 데이터 저장

from datetime import datetime
import pandas as pd

today = datetime.now().strftime("%y%m%d") #현재 날짜와 시간

df = pd.DataFrame(data_list)
df.to_csv(f'{today}_구글_뉴스_수집.csv', encoding='utf-8-sig')
df
import os 
os.getcwd()

 

 

 

 

 

DBPIA 논문 수집하기

 

(1) 브라우저 열기
from selenium import webdriver
browser = webdriver.Chrome()

 

(2) DBPIA 논문 사이트 이요 -> 검색 쿼리 활용
keyword = input('키워드를 입력해주세요 : ')
browser.get(url)

 

(3) 1 페이지의 첫번째 논문 데이터 수집

 

- 제목, 태그, 저자, 초록, 링크

제목 = browser.find_element(By.CLASS_NAME, 'thesis__tit').text
저자 = browser.find_element(By.CLASS_NAME, 'thesis__item').text
태그 = browser.find_element(By.CLASS_NAME, 'thesis__keyword').text
초록 = browser.find_element(By.CLASS_NAME, 'thesis__abstract').text
링크 = browser.find_element(By.CLASS_NAME, 'thesis__link').get_attribute('href')
 

- 초록 없을 때

try:
    초록 = browser.find_element(By.CLASS_NAME, 'thesis__abstract').text
except:
    초록 = ''

 

(4) 1 페이지의 전체 논문 데이터 수집
(5) 1-5 페이지의 전체 논문 데이터 수집

 

browser.find_element(By.CLASS_NAME, 'thesisAll__selectTit').click()
browser.find_element(By.ID, 'get100PerPage').click()
browser.find_element(By.CLASS_NAME, 'thesis__newSort').click()
browser.find_element(By.CLASS_NAME, 'thesisWrap').text
datas = browser.find_elements(By.CLASS_NAME, 'thesisWrap')
data_list = []

for index, i in enumerate(datas):
    제목 = i.find_element(By.CLASS_NAME, 'thesis__tit').text
    저자 = i.find_element(By.CLASS_NAME, 'thesis__item').text
    태그 = i.find_element(By.CLASS_NAME, 'thesis__keyword').text
    링크 = i.find_element(By.CLASS_NAME, 'thesis__link').get_attribute('href')
    초록 = i.find_element(By.CLASS_NAME, 'thesis__abstract').text

   
    print(f'{index}번째 데이터를 가져오는 중입니다... 제목: {제목}')
    data_list.append({
        '제목': 제목,
        '저자': 저자,
        '태그': 태그,
        '링크': 링크,
        '초록': 초록
    })

 

- 태그, 초록 없을 경우

browser.find_element(By.CLASS_NAME, 'thesisWrap').text
datas = browser.find_elements(By.CLASS_NAME, 'thesisWrap')
data_list = []

for index, i in enumerate(datas):
    제목 = i.find_element(By.CLASS_NAME, 'thesis__tit').text
    저자 = i.find_element(By.CLASS_NAME, 'thesis__item').text
   
    try:
        태그 = i.find_element(By.CLASS_NAME, 'thesis__keyword').text
    except:
        태그 = ''

    try:
        초록 = i.find_element(By.CLASS_NAME, 'thesis__abstract').text
    except:
        초록 = ''

    링크 = i.find_element(By.CLASS_NAME, 'thesis__link').get_attribute('href')
   
    print(f'{index}번째 데이터를 가져오는 중입니다... 제목: {제목}')
    data_list.append({
        '제목': 제목,
        '저자': 저자,
        '태그': 태그,
        '링크': 링크,
        '초록': 초록
    })

 

- 데이터 확인

data_list

 

- 수집한 데이터 저장

from datetime import datetime
import pandas as pd

today = datetime.now().strftime("%y%m%d")

df = pd.DataFrame(data_list)
df.to_csv(f'{today}_논문_수집({keyword}).csv', encoding='utf-8-sig')
df

 

 

 

 

 

구글 플레이스토어 리뷰 수집
(1) 브라우저 열기
from selenium import webdriver

browser = webdriver.Chrome()

 

 

from selenium.webdriver.common.by import By

browser.find_elements(By.CLASS_NAME, 'VfPpkd-Bz112c-LgbsSe')[7].click()

 

(2) 첫번째 리뷰 데이터 수집

- 닉네임, 평점, 작성일, 리뷰내용, 유용하다고 평가한 사람


browser.find_element(By.CLASS_NAME, 'X5PpBb').text # 닉네임
browser.find_element(By.CLASS_NAME, 'iXRFPc').get_attribute('aria-label')[10] # 평점
browser.find_element(By.CLASS_NAME, 'bp9Aid').text # 작성일
browser.find_element(By.CLASS_NAME, 'h3YV2d').text # 내용
browser.find_element(By.CLASS_NAME, 'AJTPZc').text #유용평가

 

- CSS_SELECTOR 활용

browser.find_element(By.CSS_SELECTOR, '[jscontroller=SWD8cc]').get_attribute('data-original-thumbs-up-count')

 

(3) 스크롤 -> java script

 

import time
modal = browser.find_element(By.CLASS_NAME, 'fysCi')

for i in range(5):
    browser.execute_script("arguments[0].scrollTo(0, arguments[0].scrollHeight)", modal)
    time.sleep(5)

 

 

 

 

 

SLACK API 활용해 슬랙 메세지 보내기

 

- Window 버전

import requests
import json
url = '자신의 개인 슬랙 주소'

data = {"text": f"Hello, new space"}
headers = {'Content-type' : 'application/json'}

requests.post(url, data=json.dumps(data), headers=headers)

 

-> 슬랙 메세지로 "Hello, new space"

-> %pip install ~ 코드 실행

 

- Mac 에서는 아래 코드 실행하면 바로 출력

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}'
자신의 개인 슬랙 주소

 

- 표 데이터를 수집하고 싶다면?

 
import pandas as pd

url = '수집하고자 하는 링크'
df = pd.read_html(url, encoding='euc-kr')[1]

msg = df.to_markdown()
import requests
import json
url = '자신의 개인 슬랙 주소'

data = {"text": msg}
headers = {'Content-type' : 'application/json'}

requests.post(url, data=json.dumps(data), headers=headers)

 

 

- 시간을 정해서 매일 메세지가 오게 하고 싶다면?

예를 들어, 오후 5시 30분에 매일 메세지를 보내려면

import schedule
import pandas as pd
import requests
import json
import time

def send_msg():
    url = '수집하고자 하는 링크'
    df = pd.read_html(url, encoding='euc-kr')[1]
   
    msg = df.to_markdown()
    url = '자신의 개인 슬랙 주소'
   
    data = {"text": msg}
    headers = {'Content-type' : 'application/json'}
   
    requests.post(url, data=json.dumps(data), headers=headers)

schedule.every().day.at("17:30").do(send_msg)


while True:
    schedule.run_pending()
    time.sleep(60)

 

 

 

 

 

#3월 21일 (금) 파이썬 실강

SRT 예매

 

(1) 사이트로 이동하기

 

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()

 

 

(2) 로그인 진행하기

 

- 휴대전화번호 클릭 -> 아이디 입력 -> 비밀번호 입력 -> 확인 버튼 클릭

 

① 휴대전화번호 클릭

browser.find_element(By.ID, 'srchDvCd3').click()

 

- XPATH로  '휴대전화번호' 텍스트 가져오기

browser.find_element(By.XPATH, '//*[@id="login-form"]/fieldset/div[1]/div[1]/div[1]/label[3]').text

 

- TAG_NAME으로 진행

labels = browser.find_elements(By.TAG_NAME, 'label')

for i in labels:
    if i.get_attribute("for") == "srchDvCd3":
        print(i.text)
    else:
        print('pass')

 

- CSS_SELECTOR로 진행

browser.find_element(By.CSS_SELECTOR, '#login-form > fieldset > div.input-area.loginpage.clear > div.fl_l > div.top.val_m.inputgroup > label:nth-child(6)').text

browser.find_element(By.CSS_SELECTOR, 'label[for="srchDvCd3"]').text

 

 

② 아이디 입력

phone = '01087654321'
browser.find_element(By.ID, 'srchDvNm03').send_keys(phone)

 

- XPATH로 진행

phone = '01087654321'
browser.find_element(By.XPATH, '//*[@id="srchDvNm03"]').send_keys(phone)

 

③ 비밀번호 입력

pw = '43214321'
browser.find_element(By.ID, 'hmpgPwdCphd03').send_keys(pw)

 

④ 로그인/확인 버튼 클릭

- ID 없을 때, XPATH 활용

browser.find_element(By.XPATH, '//*[@id="login-form"]/fieldset/div[1]/div[1]/div[4]/div/div[2]/input').click()

 

(3) 예매페이지로 이동

 

- 출발지 : 수서

- 도착지 : 대전

- 날짜 : 2025/03/29 (토)

- 시간 설정: 18시

 

① 도착지 설정: 대전

 

- 자동으로 설정되어있던 도착지 삭제 및 대전으로 변경

browser.find_element(By.ID, 'arvRsStnCdNm').clear()
browser.find_element(By.ID, 'arvRsStnCdNm').send_keys('대전')

 

② 날짜 설정: 2025/03/29

data_list = browser.find_element(By.ID,'dptDt').find_elements(By.TAG_NAME, 'option')

date= '20250329'
for i in data_list
    if i.get_attribute('value') == date :
        i.click()
날짜컨테이너 = browser.find_element(By.ID, 'dptDt')
날짜목록들 = 날짜컨테이너.find_elements(By.TAG_NAME, 'option')

for i in 날짜목록들:
    if i.get_attribute('value') == '20250329':
        i.click()

 

③ 시간 설정: 18시

container = browser.find_element(By.ID,'dptTm') #부모
time_list = container.find_elements(By.TAG_NAME,'option') #자식

for i in time_list:
    if i.get_attribute('value') == '180000':
        i.click()

 

④ 조회하기 버튼 클릭

- 버튼은 XPATH로, 아이디는 있으면 좋은 것!

browser.find_element(By.XPATH, '//*[@id="search_top_tag"]/input').click()

 

(4) 예매하기

 

- 현재 시간 기준으로, 일반실 상위 3개 확인 후 예매 가능한 시간대는 예매하기 클릭

# //*[@id="result-form"]/fieldset/div[6]/table/tbody/tr[1]/td[7]/a # 첫 번째 일반실 버튼
# //*[@id="result-form"]/fieldset/div[6]/table/tbody/tr[2]/td[7]/a # 두 번째 일반실 버튼
# //*[@id="result-form"]/fieldset/div[6]/table/tbody/tr[3]/td[7]/a # 세 번째 일반실 버튼

import time
for i in range(10):
    time.sleep(0.5)
   
    첫번째요소 = browser.find_element(By.XPATH, '//*[@id="result-form"]/fieldset/div[6]/table/tbody/tr[1]/td[7]/a')
    두번째요소 = browser.find_element(By.XPATH, '//*[@id="result-form"]/fieldset/div[6]/table/tbody/tr[2]/td[7]/a')
    세번째요소 = browser.find_element(By.XPATH, '//*[@id="result-form"]/fieldset/div[6]/table/tbody/tr[3]/td[7]/a')
   
    if 첫번째요소.text != '매진':
        첫번째요소.click()
        print('첫 번째 시간대 예매 성공')
        break
    elif 두번째요소.text != '매진':
        두번째요소.click()
        print('두 번째 시간대 예매 성공')
        break
    elif 세번째요소.text != '매진':
        세번째요소.click()
        print('세 번째 시간대 예매 성공')    
        break
    else: # 전부 다 매진인 경우
        print('전체 매진입니다. 새로고침을 진행합니다.')
        browser.refresh()