2401004
# unfortunately, i got nothing...
1. Daum 환율
In [320]:
import pandas as pd
import requests
In [321]:
# 1. URL
url = 'https://finance.daum.net/api/exchanges/summaries'
In [322]:
# 2. request -> response
response = requests.get(url)
print('response without header:',response)
# headers 설정
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
'referer':'https://finance.daum.net/exchanges'}
response = requests.get(url, headers = headers)
print('response with headers:', response)
response without header: <Response [403]>
response with headers: <Response [200]>
In [323]:
response.text[:100]
Out[323]:
'{"data":[{"symbolCode":"FRX.KRWUSD","date":"2024-10-04 23:50:00","currencyCode":"USD","currencyName"'
In [324]:
# json -> DataFrame
df = pd.DataFrame(response.json()['data'])
df.head()
Out[324]:
symbolCodedatecurrencyCodecurrencyNamecurrencyUnitcountryregionnamerecurrenceCountbasePrice...changeRatettBuyingPricettSellingPricecashBuyingPricecashSellingPricetcBuyingPricefcSellingPriceexchangeCommissionusDollarRatechartImageUrl01234
FRX.KRWUSD | 2024-10-04 23:50:00 | USD | 달러 | 1 | 미국 | {'korName': '아메리카', 'engName': 'America'} | 미국 (USD/KRW) | 619 | 1348.70 | ... | 0.009506 | 1335.50 | 1361.90 | 1372.30 | 1325.10 | None | None | 6.70077 | 1.0000 | {'day': 'https://t1.daumcdn.net/media/finance/... |
FRX.KRWJPY | 2024-10-04 23:50:00 | JPY | 엔 | 100 | 일본 | {'korName': '아시아', 'engName': 'Asia'} | 일본 (JPY100/KRW) | 619 | 906.84 | ... | -0.002947 | 897.96 | 915.72 | 922.70 | 890.98 | None | None | 2.31591 | 0.6724 | {'day': 'https://t1.daumcdn.net/media/finance/... |
FRX.KRWCNY | 2024-10-04 23:50:00 | CNY | 위안 | 1 | 중국 | {'korName': '아시아', 'engName': 'Asia'} | 중국 (CNY/KRW) | 619 | 189.99 | ... | 0.002533 | 188.10 | 191.88 | 199.48 | 180.50 | None | None | 4.23955 | 0.1409 | {'day': 'https://t1.daumcdn.net/media/finance/... |
FRX.KRWEUR | 2024-10-04 23:50:00 | EUR | 유로 | 1 | 유로 | {'korName': '유럽', 'engName': 'Europe'} | 유로 (EUR/KRW) | 619 | 1479.93 | ... | 0.003880 | 1465.14 | 1494.72 | 1509.38 | 1450.48 | None | None | 5.30400 | 1.0973 | {'day': 'https://t1.daumcdn.net/media/finance/... |
FRX.KRWGBP | 2024-10-04 23:50:00 | GBP | 파운드 | 1 | 영국 | {'korName': '유럽', 'engName': 'Europe'} | 영국 (GBP/KRW) | 619 | 1769.83 | ... | 0.009083 | 1752.14 | 1787.52 | 1804.69 | 1734.97 | None | None | 7.06933 | 1.3122 | {'day': 'https://t1.daumcdn.net/media/finance/... |
5 rows × 22 columns
In [325]:
columns = ['symbolCode', 'currencyCode', 'currencyName', 'basePrice']
df = pd.DataFrame(response.json()['data'])[columns]
df.head()
Out[325]:
symbolCodecurrencyCodecurrencyNamebasePrice01234
FRX.KRWUSD | USD | 달러 | 1348.70 |
FRX.KRWJPY | JPY | 엔 | 906.84 |
FRX.KRWCNY | CNY | 위안 | 189.99 |
FRX.KRWEUR | EUR | 유로 | 1479.93 |
FRX.KRWGBP | GBP | 파운드 | 1769.83 |
In [ ]:
2. 직방 원룸 매물 데이터 수집
In [327]:
import pandas as pd
import requests
1. 위도 경도 구하기
In [329]:
url = 'https://apis.zigbang.com/v2/search?leaseYn=N&q=만촌동&serviceType=원룸'
response = requests.get(url)
response
data = response.json()['items'][0]
lat, lng = data['lat'], data['lng']
lat, lng
Out[329]:
(35.87295913696289, 128.64694213867188)
2. 위도 경도로 geohash 알아내기
In [331]:
!pip install geohash2
Requirement already satisfied: geohash2 in c:\users\user\anaconda3\lib\site-packages (1.1)
Requirement already satisfied: docutils>=0.3 in c:\users\user\anaconda3\lib\site-packages (from geohash2) (0.18.1)
In [332]:
import geohash2
geohash = geohash2.encode(lat, lng, precision = 5)
geohash
Out[332]:
'wy7kp'
3. geohash로 매물 아이디 가져오기
In [334]:
url = 'https://apis.zigbang.com/v2/items/oneroom?geohash=wy7kp&depositMin=0&rentMin=0&salesTypes[0]=전세&salesTypes[1]=월세&domain=zigbang&checkAnyItemWithoutFilter=true'
response = requests.get(url)
response
Out[334]:
<Response [200]>
In [335]:
response.text[:100]
Out[335]:
'{"items":[{"lat":35.8595733998072,"lng":128.632455566717,"itemId":42192432,"itemBmType":"ZIGBANG"},{'
In [336]:
ids = [item['itemId'] for item in response.json()['items']]
len(ids), ids[:5]
Out[336]:
(242, [42192432, 42369842, 42246010, 42303935, 42380544])
4. 매물 아이디로 매물 정보 가져오기
In [338]:
url = 'https://apis.zigbang.com/v2/items/list'
params = {'domain':'zigbang', 'item_ids': ids[:15]}
response = requests.post(url, params)
response
Out[338]:
<Response [200]>
In [339]:
columns = ['item_id', 'deposit','rent', 'size_m2', 'address1']
data = response.json()['items']
df = pd.DataFrame(data)[columns]
df.head()
Out[339]:
item_iddepositrentsize_m2address101234
42192432 | 300 | 20 | 29.70 | 대구시 수성구 범어동 |
42369842 | 500 | 35 | 29.75 | 대구시 수성구 범어동 |
42246010 | 300 | 23 | 23.14 | 대구시 수성구 범어동 |
42303935 | 300 | 29 | 28.00 | 대구시 수성구 범어동 |
42380544 | 300 | 22 | 29.75 | 대구시 수성구 범어동 |
In [ ]:
3. HTML, CSS
1. HTML Tag
In [342]:
# div: 레이아웃, 텍스트 설정
# p, span: 텍스트 출력
# ul, li: 목록 텍스트 출력
# a: 링크(href), 텍스트 출력
# img: 이미지(src) 출력
2. CSS Selector
In [344]:
# Select Element
# - Tag: div
# - id: #d1
# - class: .ds1
# - attr: [val = "data"]
# Not Selector: div:not(.ds1): div 태그 엘리먼트 모두 선택 후 클래스 ds1 엘리먼트 제외
# nth-child(n): div:nth-child(3): 3번째 태그 주 div 태그를 가지면 선택
# selector1, selector2: selector1, selector2에 해당하는 모든 엘리먼트 선택
# selector1 -> selector2: selector1 선택하고 한단계 하위 엘리먼트 중 selector2에 해당하는 엘리먼트 선택
# selector1 selector2: selector1 선택하고 모든 하위 엘리먼트 중 selector2에 해당하는 엘리먼트 선택
In [ ]:
4. 네이버 함께 많이 찾는 주제어 수집
In [359]:
import pandas as pd
import requests
from bs4 import BeautifulSoup
1. 웹페이지 분석: URL
In [372]:
url = 'https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=삼성전자'
2. requests(URL) -> response: str(html)
In [375]:
response = requests.get(url)
response
Out[375]:
<Response [200]>
In [376]:
response.text[:100]
Out[376]:
'<!doctype html> <html lang="ko"><head> <meta charset="utf-8"> <meta name="referrer" content="always"'
3. str(html) -> bs object
In [378]:
dom = BeautifulSoup(response.text, 'html.parser')
type(dom)
Out[378]:
bs4.BeautifulSoup
4. bs object -> .select(css-selector), select_one(css-selector) -> str(text)
In [380]:
# dir(dom)
# BS.select(): 여러 개의 엘리먼트를 선택해서 리스트로 출력
# BS.select_one(): 한 개의 엘리먼트를 선택해서 Tag 객체로 출력
In [381]:
selector = '.fds-refine-query-grid a'
elements = dom.select(selector)
len(elements)
Out[381]:
6
In [382]:
element = elements[0]
keyword = element.text
keyword
Out[382]:
'삼성전자 주가'
In [383]:
keywords = [element.text for element in elements]
keywords
Out[383]:
['삼성전자 주가', '삼성전자주식가격', '삼성전자주식', '삼성전자 주식 전망', '삼성전자 패밀리몰', '삼성전자주식배당금']
In [ ]:
5. Celltrion beauty mall
In [393]:
import requests
import pandas as pd
from bs4 import BeautifulSoup
1. URL
In [395]:
url = 'https://www.celltrionbeauty.com/main/best-items'
2. Request -> response: html(Str)
In [399]:
response = requests.get(url)
response
Out[399]:
<Response [200]>
3. HTML(str) > BeautifulSoup Object : CSS Selector > DataFrame
In [401]:
# make BeautifulSoup Object
dom = BeautifulSoup(response.text, 'html.parser')
type(dom)
Out[401]:
bs4.BeautifulSoup
In [402]:
# find item list css selector
selector = '#productListBody > div'
elements = dom.select(selector)
len(elements)
Out[402]:
40
In [403]:
# find item css selector
element = elements[0]
data = {
'title': element.select_one('.tit').text,
'price': element.select_one('.pri').text,
'img': element.select_one('img').get('data-src'),
}
data
Out[403]:
{'title': '[단독기획]차전자피 가르시니아 슬리밍 환 6박스+콤부차 1박스',
'price': '69,900원',
'img': 'https://image.celltrionbeauty.com/attach/item/DL2024030707/DL2024030707-listMedium.jpg'}
In [404]:
# parsing all elements
items = []
for element in elements:
data = {
'title': element.select_one('.tit').text,
'price': element.select_one('.pri').text,
'img': element.select_one('img').get('data-src'),
}
items.append(data)
In [405]:
df = pd.DataFrame(items)
df.head()
Out[405]:
titlepriceimg01234
[단독기획]차전자피 가르시니아 슬리밍 환 6박스+콤부차 1박스 | 69,900원 | https://image.celltrionbeauty.com/attach/item/... |
세븐레이어 세라마이드 크림 토너 500ml | 7,900원 | https://image.celltrionbeauty.com/attach/item/... |
[단독특가]플라센타 단백질 볼륨 앰플 골드 에디션 50ml 1+1 | 62,900원 | https://image.celltrionbeauty.com/attach/item/... |
어린 비피다 엑스퍼트 바이옴 앰플 50ml | 9,900원 | https://image.celltrionbeauty.com/attach/item/... |
콜라겐 펩타이드 아이크림 포 페이스 80ml | 9,900원 | https://image.celltrionbeauty.com/attach/item/... |
4. Download Images
In [407]:
# os: 파일 시스템 다룸: 디렉토리 생성, 파일 삭제, 파일 목록 출력
import os
# pillow: 이미지 전처리 : 흑백변환, 이미지 사이즈 조절, 이미지 출력
from PIL import Image as pil
In [408]:
# make directory
path = 'data'
os.makedirs(path, exist_ok = True)
In [409]:
# download image
link = df.loc[0, 'img']
link
Out[409]:
'https://image.celltrionbeauty.com/attach/item/DL2024030707/DL2024030707-listMedium.jpg'
In [411]:
filename = 'test'
filelink = f'{path}/{filename}.jpg'
response = requests.get(link)
In [412]:
with open(filelink, 'wb') as file:
file.write(response.content)
In [413]:
os.listdir(path)
Out[413]:
['test.jpg']
In [414]:
# show image
pil.open(filelink)
Out[414]:
'KT AIVLE > Daily Review' 카테고리의 다른 글
241010 (0) | 2024.10.10 |
---|---|
241007~241008 (0) | 2024.10.09 |
241002 (0) | 2024.10.03 |
240930 (0) | 2024.10.01 |
240927 (0) | 2024.09.29 |