웹스크랩핑
정적 페이지 vs 동적 페이지
정적페이지 (Static)
- 새로운 정보를 노출할 때 url이 변경(새로고침 되는 느낌)
- 게시판, 네이버 뉴스
동적페이지(dynamic)
- 새로운 정보를 노출할 때 url이 변경x(새로고침 되는 느낌 없음)
- 검색해도 새로고침 처럼 창이 바뀌지 않고 바로바로반영
라이브러리 특징
| 방법1 | 방법2 | 방법3 |
---|
라이브러리 호출 | Requests | Selenium | Selenium |
URL 접속 | Requests | Selenium | Selenium |
HTML 받아오기 | Requests | Selenium | Selenium |
정보찾기 | BeautifulSoup | BeautifulSoup | Selenium |
저장하기(excel, csv, db) | | | |
정적 웹 스크레이핑
naver 증권 인기 종목 추출
import requests
from bs4 import BeautifulSoup
response = requests.get('https://finance.naver.com/')
print(response)
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
response = requests.get('https://www.weather.go.kr/w/index.do#dong/1120069000')
print(response)
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
response = requests.get('https://www.weather.go.kr/w/index.do#dong/1120069000')
print(response)
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.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)
print(col_list)
>>
['종류', '주의보', '경보']
row_list = []
for i in table_row:
row_list.append(i.text)
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')
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')]
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')
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