KT AIVLE/Daily Review

241004

bestone888 2024. 10. 6. 15:30

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