[EDA] 웹 데이터 분석 - 네이버 증권, 위키백과 문서

박미영·2023년 4월 3일
0

DataSchool StudyNote - EDA

목록 보기
12/19

📌1. 네이버 증권 페이지 가져오기

  • 방법 1: urllib.request (예제 1-1에서 사용)
  • 방법 2: requests (예제 1-2에서 사용)

📌1-1. 네이버 증권


- urllib.request

# IMPORT 
from urllib.request import urlopen 
from bs4 import BeautifulSoup
url ="https://finance.naver.com/marketindex/"
page = urlopen(url)
soup = BeautifulSoup(page, "html.parser")
print(soup.prettify)



📍데이터 추출


  • ✔️방법 1
# 방법 1
soup.find_all("span", "value"), len(soup.find_all("span", "value"))
  • ✔️방법 2
# 방법 2
soup.find_all("span", class_="value"), len(soup.find_all("span", class_="value"))
  • ✔️방법 3
# 방법 3
soup.find_all("span", {"class":"value"}), len(soup.find_all("span", {"class":"value"}))

세 가지 방법 모두 아래와 같은 출력 값을 가진다.

📍text 추출

  • ✔️방법 1 - text
soup.find_all("span", {"class":"value"})[0].text
  • ✔️방법 2 - string
soup.find_all("span", {"class":"value"})[0].string
  • ✔️방법 3 - get_text()
soup.find_all("span", {"class":"value"})[0].get_text()



# IMPORT 
from urllib.request import urlopen
from bs4 import BeautifulSoup
url ="https://finance.naver.com/marketindex/"
page = urlopen(url)
soup = BeautifulSoup(page, "html.parser")
print(soup.prettify)

-> 다르게 작성

url ="https://finance.naver.com/marketindex/"
# page = urlopen(url)

# response, res # request-> 요청 response -> 응답
response = urlopen(url)
response.status # status 200 정상 응답 -> http 상태 코드
soup = BeautifulSoup(response, "html.parser")
print(soup.prettify)



  • State Code
url ="https://finance.naver.com/marketindex/"
# page = urlopen(url)

# response, res # request-> 요청 response -> 응답
response = urlopen(url)
response.status # status 200 정상 응답 -> http 상태 코드


status 200: 요청한 값을 정상적으로 받아왔다.

HTTP 상태 코드



📌1-2. 네이버 증권

환전 고시 환율 4개의 데이터 가져오기




- requests

pip install requests
# = from urllib.request.Request 기능상 같다. 
import requests
from bs4 import BeautifulSoup
url = "https://finance.naver.com/marketindex/"

response = requests.get(url)
# requests.get(), requests.post() 방식이 있다. 
response

state 코드를 사용하지 않아도 requests를 사용하면 상태 코드가 바로 출력된다.



url = "https://finance.naver.com/marketindex/"
response = requests.get(url)
# requests.get(), requests.post()
# response.text
soup = BeautifulSoup(response.text, "html.parser") 
print(soup.prettify)

response.text도 내용 출력 할 수 있다 하지만 편하게 보기위해 BeautifulSoup 사용

urllib.request vs requests



📍데이터 추출

- select(), select_one()

find, find_all과 같은 기능을 한다.

  • find, select_one: 단일 선택
  • find_all, select: 다중 선택

find_all, select



- find_all vs select

기능이 같은 두 함수 사용 방법

  • find_all
# findmethod = soup.find_all("ul", id="exchangeList")
# findmethod[0].find_all("span", "value")
  • select
exchangeList = soup.select("#exchangeList > li")
exchange = exchangeList[0].select_one(".value").text



  • id=exchangeList에서 li 태그 가져오기
# = soup.find_all("li", "on")
# id => #
# class => .
exchangeList = soup.select("#exchangeList > li")
exchangeList



📍text 추출

title = exchangeList[0].select_one(".h_lst").text
exchange = exchangeList[0].select_one(".value").text
change = exchangeList[0].select_one(".change").text
updown = exchangeList[0].select_one("div.head_info.point_up > .blind").text
link = exchangeList[0].select_one("a").get("href")

link = "https://finance.naver.com/" + link

title, exchange, change, updown, link



- class 같은 이름이 다수일 때

exchangeList[0]에 세 가지 blind가 있다. 따라서 원하는 텍스트(상승)를 찾기 위해서는 정확한 위치를 지정해야한다.

updown1 = str(exchangeList[0].select_one(".blind").text)
updown2 = str(exchangeList[0].select_one("div.head_info.point_up .blind").text)
updown3 = str(exchangeList[0].select_one("div.head_info.point_up > .blind").text)

print("첫번째 blind: " + updown1)
print("div.head_info.point_dn에서 처음 만나는 blind: " + updown2)
print("div.head_info.point_dn 바로 하위의 blind: " + updown3)


  • div.head_info.point_up > .blind에서 >의미
    해당 div에서 바로 하위 blind의 값을 가져와라




📍4개 데이터 수집

위의 텍스트 추출 방식으로 이제 4개 데이터 수집을 하자.

# 4개 데이터 수집
import pandas as pd

exchange_datas = []
baseUrl = "https://finance.naver.com/"

for item in exchangeList:
    data = {
        "title": item.select_one(".h_lst").text,
        "exchange": item.select_one(".value").text,
        "change": item.select_one(".change").text,
        "updown": item.select_one("div.head_info.point_up > .blind").text,
        "link": baseUrl + item.select_one("a").get("href"),
    }
    exchange_datas.append(data)
df = pd.DataFrame(exchange_datas)

df



📍엑셀 저장

df.to_excel("./naverfinance.xlsx", encoding="utf-8")




- 파이참(.py)

# 4개 데이터 수집

import pandas as pd
# = from urllib.request.Request 기능상 같다. 
import requests
from bs4 import BeautifulSoup

url = "https://finance.naver.com/marketindex/"
response = requests.get(url)
# requests.get(), requests.post()
# response.text
soup = BeautifulSoup(response.text, "html.parser") 

# = soup.find_all("li", "on")
# id => #
# class => .
exchangeList = soup.select("#exchangeList > li")
exchangeList

import pandas as pd

exchange_datas = []
baseUrl = "https://finance.naver.com/"

for item in exchangeList:
    data = {
        "title": item.select_one(".h_lst").text,
        "exchange": item.select_one(".value").text,
        "change": item.select_one(".change").text,
        "updown": item.select_one("div.head_info.point_up > .blind").text,
        "link": baseUrl + item.select_one("a").get("href"),
    }
    exchange_datas.append(data)
df = pd.DataFrame(exchange_datas)
df.to_excel("./naverfinance_py.xlsx", encoding="utf-8")




📌2. 위키백과 문서 정보 가져오기

📍URL 한글 깨짐

한글이 포함된 URL 인코딩이 깨진다.


✔️방법 1 - Google

  • google > url decode
    마음에 드는 홈페이지 들어가면 된다.

붙여넣으면 완성

# html = "https://ko.wikipedia.org/wiki/여명의_눈동자"



✔️방법 2 - formating

import urllib
from urllib.request import urlopen, Request

html = "https://ko.wikipedia.org/wiki/{search_words}"
req = Request(html.format(search_words=urllib.parse.quote("여명의_눈동자"))) # 글자를 URL로 인코딩
response = urlopen(req)
response.status

import urllib
from urllib.request import urlopen, Request
from bs4 import BeautifulSoup

# html = "https://ko.wikipedia.org/wiki/여명의_눈동자"
html = "https://ko.wikipedia.org/wiki/{search_words}"
req = Request(html.format(search_words=urllib.parse.quote("여명의_눈동자"))) # 글자를 URL로 인코딩
response = urlopen(req)
soup = BeautifulSoup(response, "html.parser")
print(soup.prettify())



📍데이터 추출

  • 위치 확인
n = 0

for each in soup.find_all("ul"):
    print("=>" + str(n) + "==========================")
    print(each.get_text())
    n += 1

n = 32에 있음을 확인했다.



  • index 32 텍스트 추출
soup.find_all("ul")[32].text.strip().replace("\xa0", "").replace("\n", "")




"이 글은 제로베이스 데이터 취업 스쿨 강의 자료 일부를 발췌한 내용이 포함되어 있습니다."

0개의 댓글