- 방법 1: urllib.request (예제 1-1에서 사용)
- 방법 2: requests (예제 1-2에서 사용)
# 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
soup.find_all("span", "value"), len(soup.find_all("span", "value"))
# 방법 2
soup.find_all("span", class_="value"), len(soup.find_all("span", class_="value"))
# 방법 3
soup.find_all("span", {"class":"value"}), len(soup.find_all("span", {"class":"value"}))
세 가지 방법 모두 아래와 같은 출력 값을 가진다.
soup.find_all("span", {"class":"value"})[0].text
soup.find_all("span", {"class":"value"})[0].string
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)
url ="https://finance.naver.com/marketindex/"
# page = urlopen(url)
# response, res # request-> 요청 response -> 응답
response = urlopen(url)
response.status # status 200 정상 응답 -> http 상태 코드
status 200: 요청한 값을 정상적으로 받아왔다.
환전 고시 환율 4개의 데이터 가져오기
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 사용
find, find_all과 같은 기능을 한다.
- find, select_one: 단일 선택
- find_all, select: 다중 선택
기능이 같은 두 함수 사용 방법
# findmethod = soup.find_all("ul", id="exchangeList")
# findmethod[0].find_all("span", "value")
exchangeList = soup.select("#exchangeList > li")
exchange = exchangeList[0].select_one(".value").text
# = soup.find_all("li", "on")
# id => #
# class => .
exchangeList = soup.select("#exchangeList > li")
exchangeList
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
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)
>
의미위의 텍스트 추출 방식으로 이제 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")
# 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")
한글이 포함된 URL 인코딩이 깨진다.
붙여넣으면 완성
# html = "https://ko.wikipedia.org/wiki/여명의_눈동자"
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에 있음을 확인했다.
soup.find_all("ul")[32].text.strip().replace("\xa0", "").replace("\n", "")
"이 글은 제로베이스 데이터 취업 스쿨 강의 자료 일부를 발췌한 내용이 포함되어 있습니다."