Daum Exchange
import pandas as pd
import requests
- URL 수집
url = 'https://finance.daum.net/api/exchanges/summaries'
- 데이터 요청
#requests > response response = requests.get(url) response #결과는 Response [403], Forbidden => 요청 거부 의미
- 문제를 해결하기 위해 headers를 사용해 요청을 수정
headers(헤더)란 요청과 함께 보내는 추가 정보를 담고 있는 것
headers를 설정하여 필요한 정보를 포함시키기 !
- 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) response #결과는 200! 성공!
(3) 내용 확인
response.text[:100]
(4) JSON 데이터를 pandas의 DF형태로 변경
- 사용할 열 이름 정의
- [data]에 해당하는 값을 가져와 앞서 정의한 열만 선택해 pandas의 DataFrame을 생성
#json > DataFrame columns = ['symbolCode', 'currencyCode', 'currencyName', 'basePrice'] df = pd.DataFrame(response.json()['data'])[columns] df.head(2)
Naver API
import pandas as pd
import requests
Request Token(API에 접근하기 위해 필요한 인증 키의 일종)
-애플리케이션등록 -> app_key 획득
-app_key를 이용해서 데이터 가져오기
#1. app_key
CI = '6IYmQ80w1tteH24JEJbx' CS = 'PTdDOgpxho'
통합검색어 트렌드 API
#2. url : document
url = 'https://openapi.naver.com/v1/datalab/search'
#3. request(url, params(data), headers(app_key)) > response(json)
+params(요청할 데이터 내용을 설정,(예: '트위터', '트윗'))
+headers(요청을 보낼 때 필요한 추가 정보를 담고있음, Naver API에 접근하기 위한 클라이언트 ID와 비밀 키를 포함)
+requests.post()는 API에 POST 방식으로 요청을 보내는 함수
+json.dumps()는 파이썬 객체를 JSON 문자열로 변환params = { 'startDate': '2018-01-01', 'endDate': '2023-12-31', 'timeUnit': 'month', 'keywordGroups': [ {'groupName': '트위터', 'keywords': ['트위터', '트윗']}, {'groupName': '페이스북', 'keywords': ['페이스북', '페북']}, {'groupName': '인스타그램', 'keywords': ['인스타그램', '인스타']}, ], } headers = {'X-Naver-Client-Id': CI, 'X-Naver-Client-Secret': CS, 'Content-Type': 'application/json'} response = requests.post(url, data=json.dumps(params) , headers=headers) response
HTML은 웹 문서를 작성하는 마크업 언어
HTML의 구성요소
HTML Tag 종류
CSS Selector
select element
tag : div
id : #ids
class : .ds1
attr : [val='data']
Not Selector : .ds:not(.ds2)
-> .ds2인 class는 선택 대상에서 제외,제거
nth-child(n) : div:nth-child(3)
->세번째 태그 중 div 태그를 가지면 선택
*nth-child의 ()안의 숫자는 가장 첫번째가 0이 아니라 1로 시작
selector1, selector2 : selector1,2에 해당하는 모든 엘리먼트 선택
selector1 > selector2 : selector1을 선택하고 한단계 하위 엘리먼트 중 selector2에 해당하는 엘리먼트 선택
selector1 selector2 : selector1 선택하고 모든 하위 엘리먼트중 selector2에 해당하는 엘리먼트 선택
많이 찾는 주제어 수집
-정적(static) 웹페이지 데이터 수집
-BeautifulSoup을 이용하여 HTML 문자열 데이터 parsing
import pandas as pd
import requests
from bs4 import BeautifulSoup
- 웹페이지 분석 : URL
url = 'https://search.naver.com/search.naver?query=삼성전자'
- request(URL) > response : str(html)
response = requests.get(url) response #결과는 200! 성공!
- str(html) > bs object
+웹 요청으로 받은 HTML 소스를 문자열(text)로 가져오고
이를 BeautifulSoup 클래스로 변환해 dom에 저장dom = BeautifulSoup(response.text, 'html.parser') type(dom) #dom의 타입은? => bs4.BeautifulSoup
- bs object > .select(css-selector), .select_one(css-selector) > str(text)
+BeautifulSoup 객체에서 특정 CSS 선택자를 사용하여, fds-refine-query-grid 클래스 안의 모든 링크('a'태그)를 찾아 리스트로 저장하고, 그 리스트의 길이를 출력selector = '.fds-refine-query-grid a' elements = dom.select(selector) len(elements) #결과는 6
+앞서 선택한 엘리먼트 중 0번째 엘리먼트
element = elements[0] keyword = element.text keyword #결과는 삼성전자 주가
정적페이지 크롤링(2)
import requests
import pandas as pd
from bs4 import BeautifulSoup
celltrion beauty mall 베스트 상품 수집
- URL 수집
url = 'https://www.celltrionbeauty.com/main/best-items'
- Request > Response : HTML(str)
response = requests.get(url) response #결과는 200! 성공!
- HTML(str) > BeautifulSoup Object : CSS Selector > DataFrame
++웹 요청으로 받은 HTML 소스를 문자열(text)로 가져오고
이를 BeautifulSoup 클래스로 변환해 dom에 저장#make BeautifulSoup Object dom = BeautifulSoup(response.text, 'html.parser') type(dom) #결과는 bs4.BeautifulSoup 잘 생성됨!
#find item list css selector
selector = '#productListBody > div'
elements = dom.select(selector)
len(elements)
#결과는 40
#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
결과는 {'title': '[단독기획]차전자피 가르시니아 슬리밍 환 6박스+콤부차 1박스',
'price': '69,900원',
'img': 'https://image.celltrionbeauty.com/attach/item/DL2024030707/DL2024030707-listMedium.jpg'}