#3월 19일 (수) 파이썬 실강
N 페이지까지의 구글 뉴스 수집
(1) 구글 뉴스 검색으로 이동
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get(url) # 해당 url로 페이지 이동
browser.title
(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
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({
'제목': 제목,
'저자': 저자,
'태그': 태그,
'링크': 링크,
'초록': 초록
})
- 데이터 확인
- 수집한 데이터 저장
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()