[청년취업사관학교 새싹]핀테커스 수업 (12/18)

장민정·2023년 12월 18일
0

웹스크랩핑

정적 페이지 vs 동적 페이지

정적페이지 (Static)

  • 새로운 정보를 노출할 때 url이 변경(새로고침 되는 느낌)
  • 게시판, 네이버 뉴스

동적페이지(dynamic)

  • 새로운 정보를 노출할 때 url이 변경x(새로고침 되는 느낌 없음)
  • 검색해도 새로고침 처럼 창이 바뀌지 않고 바로바로반영

라이브러리 특징

방법1방법2방법3
라이브러리 호출RequestsSeleniumSelenium
URL 접속RequestsSeleniumSelenium
HTML 받아오기RequestsSeleniumSelenium
정보찾기BeautifulSoupBeautifulSoupSelenium
저장하기(excel, csv, db)

정적 웹 스크레이핑

# 라이브러리 호출

import requests
from bs4 import BeautifulSoup

#uRL 접속

response = requests.get('https://finance.naver.com/')
print(response)

# HTML 받아오기
HTML = response.text
soup = BeautifulSoup(HTML, 'html.parser')

#정보찾기

popular_stock_table = soup.find('div', class_='aside_area aside_popular')
popular_stock = popular_stock_table.find_all('tr', class_=['up', 'down', 'same'])
#저장
popular_stock[0].find('a').text
stock_list =[]
for i in range(len(popular_stock)):
    stock_name =popular_stock[i].find('a').text
    stock_list.append(stock_name)
stock_list    

일기 예보 사이트

find로 찾기

# 라이브러리 호출
import requests
from bs4 import BeautifulSoup

# URL 접속
response = requests.get('https://www.weather.go.kr/w/index.do#dong/1120069000')
print(response)

# HTML 받아오기
HTML = response.text
soup = BeautifulSoup(HTML, 'html.parser')

# 정보 가져오기
top5 = soup.find('div', class_ = 'weblog-top10')
top5_list = top5.find_all('a', class_ = 'link')

# 저장하기
result = []
for i in top5_list:
    result.append(i.text)
result

select로 찾기

# 라이브러리 호출
import requests
from bs4 import BeautifulSoup

# URL 접속
response = requests.get('https://www.weather.go.kr/w/index.do#dong/1120069000')
print(response)

# HTML 받아오기
HTML = response.text
soup = BeautifulSoup(HTML, 'html.parser')

# 정보 가져오기
top5 = soup.find('div', class_ = 'weblog-top10')
top5 = soup.select_one('div.weblog-top10')
# top5_list = top5.find_all('a', class_ = 'link')
top5_list = top5.select('a.link')
# 저장하기
result = []
for i in top5_list:
    result.append(i.text)
result

일기예보 사이트 > 기상특보 발표 기준(컬럼, 로우, 내용 가져오기)

response = requests.get('https://www.weather.go.kr/w/community/knowledge/standard.do')

HTML = response.text
soup = BeautifulSoup(HTML, 'html.parser')

table = soup.find('div', class_ = 'over-scroll')
table_col = table.find_all('th', class_ =['position','border_right'])
table_row = table.find_all('th', scope = 'row')
col_list = []
for i in table_col:
    col_list.append(i.text)
# col_list = [i.text for i in table_col]
print(col_list)    
>>

['종류', '주의보', '경보']

row_list = []
for i in table_row:
    row_list.append(i.text)
# row_list = [i.text for i in table_row]    
print(row_list)
>>
['강풍', '풍랑', '호우', '대설', '건조', '폭풍해일', '한파', '태풍', '황사', '폭염']

table_contents = table.find_all('td')
table_list = [i.text for i in table_contents]
table_list

내용 딕셔너리로 가져오기

table_body =soup.select_one('body > div.container > section > div > div.cont-wrap > div > div > table > tbody')
# print(table_body)
tr = table_body.select('tr')[:-1]
len(tr)
result ={}
for title in tr:
    row_title = title.select_one('th').text
    contents =[ i.text.replace('\n', '').replace('\t','') for i in title.select('td')]
    # print(row_title)
    # print(contents)
    result[row_title] = contents
result   

예스24 '자연어 처리' 1페이지 책 제목 가져오기

response = requests.get('https://www.yes24.com/Product/Search?domain=ALL&query=%EC%9E%90%EC%97%B0%EC%96%B4%EC%B2%98%EB%A6%AC')

HTML = response.text
soup = BeautifulSoup(HTML, 'html.parser')

books_div = soup.select_one('#yesSchList')
# B = books_div.find_all('a', class_ = 'gd_name')
books_name = [i.text for i in books_div.select('.gd_name')]
books_name
>>
['AI 2024 트렌드&활용백과',
 '혼자 공부하는 머신러닝+딥러닝',
 '파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습',
 '인공지능 기반 자연어 처리',
 '트랜스포머를 활용한 자연어 처리',
 '밑바닥부터 시작하는 딥러닝 2',
 '자연어처리 바이블',
 'Do it! BERT와 GPT로 배우는 자연어 처리',
 '자연어처리바이블',
 '파이토치로 배우는 자연어 처리',
 '개발자를 위한 머신러닝&딥러닝',
 '모두의 한국어 텍스트 분석 with 파이썬',
 '트랜스포머를 활용한 자연어 처리',
 '텐서플로 2와 머신러닝으로 시작하는 자연어 처리',
 '베이지안으로 접근하는 자연어 처리 2/e',
 '김기현의 자연어 처리 딥러닝 캠프 파이토치 편',
 '파이썬으로 시작하는 한국어 정보 검색과 자연어 처리',
 '파이썬 텍스트 마이닝 완벽 가이드',
 '예제로 배우는 자연어 처리 기초',
 '딥러닝 파이토치 교과서',
 '자연어 처리와 딥러닝',
 'Do it! BERT와 GPT로 배우는 자연어 처리',
 '파이썬으로 배우는 자연어 처리 인 액션',
 '자연어 처리의 정석']

전체 페이지 책 제목 가져오기

total_list = {}
for i in range(4):
    response = requests.get(f'https://www.yes24.com/Product/Search?domain=ALL&query=%EC%9E%90%EC%97%B0%EC%96%B4%EC%B2%98%EB%A6%AC&page={i}')
    
    HTML = response.text
    soup = BeautifulSoup(HTML, 'html.parser')
    
    books_div = soup.select_one('#yesSchList')
    B = books_div.find_all('a', class_ = 'gd_name')
    books_name = [i.text for i in books_div.find_all('a', class_ = 'gd_name')]
    total_list[f'{i+1}페이지 책 제목 리스트'] = books_name
total_list

네이버 금융데이터 전체 페이지 가져오기

def get_page(page):
    response = requests.get(f'https://finance.naver.com/sise/dividend_list.naver?&page={page}')
    HTML = response.text
    soup = BeautifulSoup(HTML, 'html.parser')
    
    table =soup.select_one('#contentarea_left > table.type_1.tb_ty')
    table_columns = [ i.text for i in table.find_all('th', scope = 'col')]
   
    table_body = soup.select_one('#contentarea_left > table.type_1.tb_ty > tbody')
    row_html = table_body.select('tr')
    
    df_values = []
    for i in range(len(row_html)):
        if row_html[i].select_one('.txt').text != '\xa0':
            title = row_html[i].select_one('.txt').text
            values = [i.text for i in row_html[i].select('.num')]
            result = [title] + values
            df_values.append(result)
    df = pd.DataFrame(data=df_values, columns=table_columns)
    return df        
    
last_page = int(soup.select_one('td.pgRR > a').get('href').split('&page=')[-1])
empty_df = pd.DataFrame()
for i in range(1, last_page+1):
    empty_df = pd.concat([empty_df,get_page(i)])
	empty_df = empty_df.reset_index(drop = True)
empty_df

0개의 댓글