파이썬 웹크롤링
웹크롤링 활용에 대해 아래와 같은 순서로 진행되었다.
2일차
1) 구글 뉴스 크롤링 => AI(자동화) => 자동화 트렌드
2) YES 24 베스트 셀러
3) DB PIA 논문 크롤링
4) SRT 예매 자동화
5) 슬랙 봇 연동
3일차
6) 구글 플레이스토어 댓글 수집
7) VScode 가상환경 세팅
8) FastAPI
1) 구글 뉴스 크롤링 => AI(자동화) => 자동화 트렌드
라이브러리 import & 브라우져 주소창 열기
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
url = 'https://www.google.com/search?q=검색어&sca_esv=30c375223fbe6df1&sca_upv=1&biw=1920&bih=991&tbm=nws&sxsrf=ACQVn09uTTbV1ogcYBLp3IdeDyskkGf2SA%3A1712280225750&ei=oVIPZqr1LP-mvr0PufeI6Aw&udm=&ved=0ahUKEwjqyfH09KmFAxV_k68BHbk7As0Q4dUDCA0&uact=5&oq=검색어&gs_lp=Egxnd3Mtd2l6LW5ld3MiHOyduOqzteyngOuKpSDsu7Ttk6jthLDruYTsoIQyBhAAGB4YDUjGVlCkPFjZUXAEeACQAQKYAZkBoAGCDKoBBDAuMTO4AQPIAQD4AQGYAg6gAs0JwgILEAAYgAQYsQMYgwHCAgUQABiABMICBBAAGB7CAgYQABgeGA_CAgcQABiABBgNwgIIEAAYHhgNGA-YAwCIBgGSBwQ0LjEwoAe1Pw&sclient=gws-wiz-news'
browser.get(url)
뉴스 제목, 언론사, 작성일, 내용 가져오기
browser.find_element(By.CLASS_NAME, 'n0jPhd').text
company = browser.find_element(By.CLASS_NAME, 'MgUUmf').text
content = browser.find_element(By.CLASS_NAME, 'GI74Re').text
created_at = browser.find_element(By.CLASS_NAME, 'rbYSKb').text
컨터이너 방식으로 정보 가져오기
data_list = []
container_list = browser.find_elements(By.CLASS_NAME, 'SoaBEf')
len(container_list)
for elem in container_list:
title = elem.find_element(By.CLASS_NAME, 'n0jPhd').text
company = elem.find_element(By.CLASS_NAME, 'MgUUmf').text
content = elem.find_element(By.CLASS_NAME, 'GI74Re').text
created_at = elem.find_element(By.CLASS_NAME, 'rbYSKb').text
link = elem.find_element(By.CLASS_NAME, 'WlydOe').get_attribute('href')
data_list.append({
'제목' : title,
'언론사' : company,
'내용' : content,
'작성시간' : created_at,
'링크' : link
})
# print(title, company, created_at, link, '\n')
저장
import pandas as pd
df = pd.DataFrame(data_list)
df.to_csv('google_news.csv', encoding='utf-8-sig')
2) YES 24 베스트 셀러
url = 'https://www.yes24.com/Product/Category/BestSeller?CategoryNumber=001&sumgb=06'
browser.get(url)
정보 가져오기: 1) 책 제목 2) 저자 3) 출간일 4) 가격 5) 판매지수
parent = browser.find_element(By.ID, 'yesBestList')
book_container_list = parent.find_elements(By.CLASS_NAME, 'item_info')
for elem in book_container_list:
book_title = elem.find_element(By.CLASS_NAME, 'gd_name').text
author = elem.find_element(By.CLASS_NAME, 'info_auth').text
pub_date = elem.find_element(By.CLASS_NAME, 'info_date').text
price = elem.find_element(By.CLASS_NAME, 'txt_num').text
sell_index = elem.find_element(By.CLASS_NAME, 'saleNum').text
print(book_title, author, pub_date, price, sell_index)
페이지 전환
data_list = []
for i in range(1,4):
url = f'https://www.yes24.com/Product/Category/BestSeller?categoryNumber=001&pageNumber={i}'
browser.get(url)
# 속도가 너무 빠르면 사람이 아닐거라 판단 => 차단
time.sleep(3)
parent = browser.find_element(By.ID, 'yesBestList')
book_list = parent.find_elements(By.CLASS_NAME, 'item_info')
for book in book_list:
title = book.find_element(By.CLASS_NAME, 'gd_name').text
link = book.find_element(By.CLASS_NAME, 'gd_name').get_attribute('href')
author = book.find_element(By.CLASS_NAME, 'authPub').text
data_list.append({
"제목": title, "저자": author, "링크": link
})
저장
* pandas를 이용해 저장 - 상동
3) DB PIA 논문 크롤링
keyword = input('찾고자 하는 논문 주제를 입력하세요.')
url = f'https://www.dbpia.co.kr/search/topSearch?searchOption=all&query={keyword}'
browser.get(url)
링크
link_list = browser.find_elements(By.CLASS_NAME, 'thesis__link')
link_data_list = []
for elem in link_list:
link = elem.get_attribute('href')
link_data_list.append(link)
상세 정보 수집
for link in link_data_list:
browser.get(link)
time.sleep(3)
abstract = ''
try:
abstract = browser.find_element(By.CLASS_NAME, 'abstractTxt').text
except:
abstract = '없음'
4) SRT 예매 자동화
로그인
# 로그인 페이지
url = '로그인 url'
browser.get(url)
# 휴대폰 번호 라디오 버튼 클릭
browser.find_element(By.ID, 'srchDvCd3').click()
browser.find_element(By.ID, 'srchDvNm03').click()
browser.find_element(By.ID, 'srchDvNm03').send_keys('12345678')
browser.find_element(By.ID, 'hmpgPwdCphd03').click()
browser.find_element(By.ID, 'hmpgPwdCphd03').send_keys('12345678')
SRT 조회
reserve_url = '예약페이지 url'
browser.get(reserve_url)
# 도착역 입력
browser.find_element(By.ID, 'arvRsStnCdNm').clear()
browser.find_element(By.ID, 'arvRsStnCdNm').send_keys('도착역')
# 출발 시간
browser.find_element(By.XPATH, '//*[@id="dptTm"]/option[11]').click()
# 기차표 조회
browser.find_element(By.XPATH, '//*[@id="search_top_tag"]/input').click()
예약
import time
for i in range(30):
is_soldout = browser.find_element(By.XPATH, '//*[@id="result-form"]/fieldset/div[6]/table/tbody/tr[1]/td[7]/a').text
print(f'{i}번째 시도 중입니다.{is_soldout}')
if is_soldout == '매진':
browser.refresh()
time.sleep(1)
else:
browser.find_element(By.XPATH, '//*[@id="result-form"]/fieldset/div[6]/table/tbody/tr[1]/td[7]/a').click()
5) 슬랙 봇 연동
import requests
import json
slack_hooks_url = "https://hooks.slack.com/services/xxxxxx/xxxxx/xxxxxx"
payload = {"text":"Hello, World!"}
headers = {'Content-type': 'application/json'}
response = requests.post(slack_hooks_url, data=json.dumps(payload), headers=headers)
print(response)
6) 구글 플레이스토어 댓글 수집
댓글 수집시 scroll 부분외에는 위에서 사용했던 코드 흐름과 같다.
modal_elem = browser.find_element(By.CLASS_NAME, 'fysCi')
import time
for i in range(3):
js_code = 'arguments[0].scrollTo(0, arguments[0].scrollHeight)'
browser.execute_script(js_code, modal_elem)
time.sleep(1)
7) VScode 가상환경 세팅
1) .venv 폴더 생성
> python -m venv .venv
2) 가상환경 활성화
> .venv\Scripts\activate
3) 모듈설치(Package install)
> pip install fastapi
> pip list # 설치 확인
> pip install uvicorn[standard]
4) 루트에 main.py 파일 생성
8) FastAPI : API를 빠르게 만들 수 있도록 하는 프레임워크
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
if __name__ == "__main__":
import uvicorn
uvicorn.run("main:app", reload=True)
결과확인
http://127.0.0.1:8000
# 문서확인
http://127.0.0.1:8000/docs
다음은 지금까지 배운 내용을 활용해 프로젝트를 완성하는 과정이다. 아자아자~!