728x90
배운 내용은 목차 중심으로 간단히 정리했습니다-!
배운 내용
Web
- Server & Client Architecture
- 유저가 브라우저를 통해 서버에 데이터를 요청하면(Request) 서버가 요청에 따른 데이터를 전송하는(Response) 구조
- URL
- 프로토콜 규칙에 맞는 작성 필요
- Get - URL에 데이터 포함, 노출
- Post - Body에 데이터가 포함, 데이터 숨김
- Internet
- 인터넷은 컴퓨터로 연결해서 TCP/IP라는 통신 프로토콜을 이용해 정보를 주고 받는 컴퓨터 네트워크
- HTTP Status Code : 서버와 클라이언트가 데이터를 주고 받은 결과를 상태 코드로 확인 가능
- 2xx - success
- 3xx - redirection (brower cache)
- 4xx - request error
- 5xx - server error
Web Crawling
- 웹 페이지 종류
- 정적인 페이지 : 웹 브라우저에 화면이 한 번 뜨면 이벤트에 의한 화면 변경이 없는 페이지
- 동적인 페이지 : 웹 브라우저에 화면이 뜨고 이벤트가 발생하면 서버에서 데이터를 가져와 화면을 변경하는 페이지
- 크롤링 방법
- requests json 문자열로 파싱 : 주로 동적 페이지에서 이용
- requests html 문자열로 파싱 : 주로 정적 페이지에서 이용
- selenium : 브라우저 직접 열어서 데이터 받기
- 속도 - requests json > requests html > selenium
- 코드 간단 정리 - request > response: json(str)
- response의 status code가 200이 나오는지 확인
- 403이나 500이 나오면 잘못 된 것 ➡ header 설정 또는 selenium 사용 필요
import requests
# url : 네이버 증권 사이트
page, page_size = 1, 10
url = f'https://m.stock.naver.com/api/index/KOSPI/price?pageSize={page_size}&page={page}'
response = requests.get(url) # status code
data = response.json()
df = pd.DataFrame(data)[['localTradedAt', 'closePrice']] # dataframe으로 파싱
- 코드 간단 정리 - Naver Rest API
- naver developers 사이트에서 request token 얻기
- api 호출을 통한 데이터 조회
CLIENT_ID, CLIENT_SECRET = "", "" # 개인 key
ko_txt = '웹 크롤링은 재미있습니다.'
url = 'https://openapi.naver.com/v1/papago/n2mt'
headers = {
'content-Type' : 'application/json',
'X-Naver-Client-Id' : CLIENT_ID,
'X-Naver-Client-Secret' : CLIENT_SECRET
}
params = {'source': 'ko', 'target': 'en', 'text': ko_txt}
response = requests.post(url, json.dumps(params), headers=headers)
response.json()
response.json()['message']['result']['translatedText']
HTML
- 웹 문서를 작성하는 마크업 언어
- 구성 요소
- Document : 한 페이지를 나타내는 단어
- Element : 하나의 레이아웃을 나타내는 단위. 시작 태그, 끝 태그, 텍스트로 구성
- Tag : 엘리먼트의 종류를 정의. 시작태그(속성값), 끝 태그
- Attribute: 시작 태그에서 태그의 특정 기능을 하는 값
- id - 웹 페이지에서 유일한 값
- class - 동일한 여러 개의 값 사용 가능. element를 그룹핑할 때 사용
- attr : id와 class를 제외한 나머지 속성들
- Text : 시작태그와 끝 태그 사이에 있는 문자열
- 엘리먼트는 서로 계층적 구조를 가질 수 있음.
CSS Selector
- CSS 스타일을 적용시킨 HTML 엘리먼트를 찾기 위한 방법
- 종류 : Element Selector, ID Selector, Class Selector 등
- 코드 간단 정리 - Gmarket 베스트 상품 데이터
import pandas
import requests
from bs4 import BeautifulSoup # BeautifulSoup을 이용한 HTMl 문자열 데이터 parsing
url = 'https://corners.gmarket.co.kr/bestsellers'
response = requests.get(url)
dom = BeautifulSoup(response.text, 'html.parser') # 클래스로 객체를 만드는 것, 해당 텍스트를 html 형
elements = dom.select('#gBestWrap > div > div:nth-child(5) > div > ul > li')
element = elements[0]
data = {
'title' : element.select_one('.itemname').text,
'link' : element.select_one('.itemname').get('href'),
'img': 'http:' + element.select_one('img').get('data-original'),
'o_price': element.select_one('.o-price').text,
's_price': element.select_one('.s-price').text.strip().split('\n')[0]
}
- 코드 간단 정리 - selenium
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://daum.net')
driver.find_element(By.CSS_SELECTOR, '#q').send_keys('파이썬')
#daumSearch > fieldset > div > div > button.ico_pctop.btn_search
# .inner_search > .ico_pctop.btn_search
selector = '.inner_search > .ico_pctop.btn_search'
driver.find_element(By.CSS_SELECTOR, selector).click()
회고 및 느낀 점
오랜만에 웹크롤링 내용을 정리하며 다시 봤다. 빅프를 앞두고 정리하는 느낌이라 좋았다! 배운 내용들을 이제부터 열심히 사용할 수도 있겠다. 크롤링을 json 방식으로는 잘 안 해봐서 당시 수업을 통해 따라갔었는데 앞으로 크롤링이 필요하다면 한 번 더 적용해보고 싶다!
728x90
'KT AIVLE school' 카테고리의 다른 글
[AIVLE/Week6-1] 두 번째 미니 프로젝트 (0) | 2023.06.27 |
---|---|
[AIVLE/Week4&5] 머신러닝 & 딥러닝 (0) | 2023.06.27 |
[AIVLE/Week3-1] 첫 번째 미니 프로젝트 - 서울시 생활 정보 기반 대중 교통 수요 분석, 서울시 따릉이 수요 분석 (0) | 2023.03.28 |
[AIVLE/Week2] 데이터와 친해지는 시간 - 파이썬 라이브러리, 데이터 처리, 데이터 분석 및 의미 찾기 (1) | 2023.03.26 |
[AIVLE/Week1] Hello Aivle World! - IT프로젝트 관리도구(GIT), 파이썬 프로그래밍 (1) | 2023.02.28 |