본문 바로가기

카테고리 없음

Upstage AI Lab 3기 Python 2~3일차

 

파이썬 웹크롤링 

웹크롤링 활용에 대해 아래와 같은 순서로 진행되었다.

 

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

 

다음은 지금까지 배운 내용을 활용해 프로젝트를 완성하는 과정이다.  아자아자~!