웹 크롤링
- 웹 페이지에서 데이터를 수집하는 방법에 대해서 학습
웹크롤링 방법
웹페이지의 종류
- 정적인 페이지: 웹 브라우저에 화면이 한번 뜨면 이벤트에 의한 화면의 변경이 없는 페이지
- 동적인 페이지: 웹 브라우저에 화면이 뜨고 이벤트가 발생하면, 서버에서 데이터를 가져와 화면을 변경하는 페이지
requests 이용
- 받아오는 문자열에 따라 두가지 방법으로 구분
- json 문자열로 받아서 파싱: 동적 페이지 크롤링할때 사용
- html 문자열로 받아서 파싱: 정적 페이지 크롤링할때 사용
selenium 이용
크롤링 방법에 따른 속도
- requests json > requests html > selenium
동적 웹 크롤링
Naver Stock Data 크롤링(GET 방식)
- 웹서비스 분석: url
- 서버에 데이터 요청: request(url) > response:json(str)
- response의 status code가 200일 경우 -> 정상
- 403이나 500이 나오면 request가 잘못되거나 web server에서 수집이 안되도록 설정이 된 것임 (header 설정 또는 selenium 사용)
-200이 나오더라도 response 내용을 확인해야 함 -> 확인방법: response.text
- 서버에서 받은 데이터 파싱(데이터 형태를 변경):json(str) > list,dict >DataFrame
# 1. 웹서비스 분석
page, page_size = 1, 20
url = f'https://m.stock.naver.com/api/index/KOSPI/price?pageSize={page_size}&page={page}' print(url)
# 2. 서버에 데이터 요청
response = requests.get(url)
response
#3. 서버에서 받은 데이터 파싱(데이터 형태를 변경)
columns = ["localTradedAt", "closePrice"]
datas = response.json()
kospi_df = pd.DataFrame(datas)[columns]
kospi_df.tail(2)
Naver Rest API(POST 방식)
파파고 번역 API
# 1. URL
url = "https://openapi.naver.com/v1/papago/n2mt"
# 2. request > response
msg = "데이터 사이언스는 재미있습니다."
params = { "source": "ko", "target": "en", "text": msg } headers = {
"Content-Type": "application/json",
"X-Naver-Client-Id": CLIENT_ID,
"X-Naver-Client-Secret": CLIENT_SECRET,
}
response = requests.post(url, json.dumps(params), headers=headers) response
# 3. parsing
response.json()["message"]["result"]["translatedText"]
통합검색어 트렌드 API
# 1. URL
url = "https://openapi.naver.com/v1/datalab/search"
# 2. request > response
params = {
"startDate": "2018-01-01",
"endDate": "2022-01-31",
"timeUnit": "month",
"keywordGroups": [
{"groupName": "트위터", "keywords": ["트위터", "트윗"]}, {"groupName": "페이스북", "keywords": ["페이스북", "페북"]}, {"groupName": "인스타그램", "keywords": ["인스타그램", "인스타"]},
]
}
headers = {
"Content-Type": "application/json", "X-Naver-Client-Id": CLIENT_ID, "X-Naver-Client-Secret": CLIENT_SECRET,
}
response = requests.post(url, data=json.dumps(params), headers=headers)
response
# 3. parsing
datas = response.json()["results"]
dfs=[]
for data in datas:
df = pd.DataFrame(data["data"])
df["title"] = data["title"] # 트위터, 페이스북, 인스타그램
dfs.append(df)
정적 웹 크롤링
HTML
1. HTML 이란?
- Hyper Text Markup Language
- 웹 문서를 작성하는 마크업 언어
2. HTML 구성 요소
- Document: 한페이지를 나타내는 단위
- Element: 하나의 레이아웃을 나타내는 단위: 시작태그, 끝태그, 텍스트로 구성
- Tag: 엘리먼트의 종류를 정의: 시작태그(속성값), 끝태그
- id: 웹페이지에서 유일한 값
- class: 동일한 여러개의 값 사용 가능. element를 그룹핑할 때 사용한다
- attr: id와 class를 제외한 나머지 속성들
- Text: 시작태그와 끝태그 사이에 있는 문자열
- 엘리먼트는 서로 계층적 구조를 가질 수 있음
3. HTML 구조
- DOCTYPE
- html
- head // meta: 웹페이지에 대한 정보 , title:웹페이지의 제목 정보
- body // 화면을 구성하는 엘리먼트가 옴
4. HTML 태그
- html에서 문자를 나타내는 태그들
- head
- title을 나타낼 때 사용
- Head는 총 6가지 종류의 태그가 있음(h1~h6)
- 숫자가 커질수록 문자의 크기가 줄어듬
- p
- span
- pre
- code
- 코드를 작성하는 태그
- 들여쓰기나 두 칸 이상의 공백은 적용이 안됨
5. 문자 이외의 HTML 태그
CSS Selector