[에이쁠] 데이터 수집 2일차

3e_b1n2·2024년 10월 4일
1
post-thumbnail

403 에러에 대응하는 headers 사용한 데이터 요청

Daum Exchange

import pandas as pd
import requests

  1. URL 수집
url = 'https://finance.daum.net/api/exchanges/summaries'
  1. 데이터 요청
#requests > response
response = requests.get(url)
response
#결과는 Response [403], Forbidden => 요청 거부 의미

- 문제를 해결하기 위해 headers를 사용해 요청을 수정
headers(헤더)란 요청과 함께 보내는 추가 정보를 담고 있는 것
headers를 설정하여 필요한 정보를 포함시키기 !

  1. 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

  • 통합검색어 트렌드 API(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의 구성요소

  • Document : 한페이지를 나타내는 단위
  • Element : 하나의 레이아웃을 나타내는 단위 : 시작태그, 끝태그, 텍스트로 구성
  • Tag : 엘리먼트의 종류를 정의 : 시작태그(속성값), 끝태그
  • Attribute : 시작태그에서 태그의 특정 기능을 하는 값
  • id : 웹 페이지에서 유일한 값
  • class : 동일한 여러개의 값 사용 가능 : element를 그룹핑 할때 사용
  • attr : id와 class를 제외한 나머지 속성들 : src, href ...
  • Text : 시작태그와 끝태그 사이에 있는 문자열
    엘리먼트는 서로 계층적 구조를 가짐

HTML Tag 종류

  • div : 레이아웃, 텍스트 설정
  • h1 ~ 6 : 제목 문자열 출력
  • p : 한줄 문자열 출력 (텍스트 출력)
  • span : 한 블럭 문자열 출력 (텍스트 출력)
  • ul li : 메뉴 목록 텍스트 출력
  • a : 페이지 이동 : href(url)라는 속성을 갖는 링크, 텍스트 출력
  • img : 이미지 출력 : src(url)

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에 해당하는 엘리먼트 선택

정적페이지 크롤링(html)

많이 찾는 주제어 수집
-정적(static) 웹페이지 데이터 수집
-BeautifulSoup을 이용하여 HTML 문자열 데이터 parsing

  • BeautifulSoup은 Python에서 웹 페이지의 HTML 및 XML 문서를 쉽게 파싱하고 조작할 수 있도록 도와주는 라이브러리

import pandas as pd
import requests
from bs4 import BeautifulSoup

  1. 웹페이지 분석 : URL
url = 'https://search.naver.com/search.naver?query=삼성전자'
  1. request(URL) > response : str(html)
response = requests.get(url)
response
#결과는 200! 성공!
  1. str(html) > bs object
    +웹 요청으로 받은 HTML 소스를 문자열(text)로 가져오고
    이를 BeautifulSoup 클래스로 변환해 dom에 저장
dom = BeautifulSoup(response.text, 'html.parser')
type(dom)
#dom의 타입은? => bs4.BeautifulSoup
  1. 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 베스트 상품 수집

  1. URL 수집
url = 'https://www.celltrionbeauty.com/main/best-items'
  1. Request > Response : HTML(str)
response = requests.get(url)
response
#결과는 200! 성공!
  1. HTML(str) > BeautifulSoup Object : CSS Selector > DataFrame
    ++웹 요청으로 받은 HTML 소스를 문자열(text)로 가져오고
    이를 BeautifulSoup 클래스로 변환해 dom에 저장
#make BeautifulSoup Object
dom = BeautifulSoup(response.text, 'html.parser')
type(dom)
#결과는 bs4.BeautifulSoup 잘 생성됨!
  • productListBody 하위의 div태그를 선택
#find item list css selector
selector = '#productListBody > div'
elements = dom.select(selector)
len(elements)
#결과는 40
  • 선택된 리스트의 0번째 요소를 가져옴
#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'}
profile
에이블기자 최멍빈입니다.

0개의 댓글