[KT-AIVLE] 4. 웹 크롤링

Coding_Holic·2022년 8월 4일
0

AIVLE

목록 보기
3/5

웹 크롤링

  • 웹 페이지에서 데이터를 수집하는 방법에 대해서 학습

웹크롤링 방법

웹페이지의 종류

  • 정적인 페이지: 웹 브라우저에 화면이 한번 뜨면 이벤트에 의한 화면의 변경이 없는 페이지
  • 동적인 페이지: 웹 브라우저에 화면이 뜨고 이벤트가 발생하면, 서버에서 데이터를 가져와 화면을 변경하는 페이지

requests 이용

  • 받아오는 문자열에 따라 두가지 방법으로 구분
    • json 문자열로 받아서 파싱: 동적 페이지 크롤링할때 사용
    • html 문자열로 받아서 파싱: 정적 페이지 크롤링할때 사용

selenium 이용

  • 브라우저를 직접 열어서 데이터를 받는 방법

크롤링 방법에 따른 속도

  • requests json > requests html > selenium

동적 웹 크롤링

  • 웹서비스 분석: 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)

파파고 번역 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

profile
안녕하세용 개발에 미치고 싶은 초보 개발자입니다:)

0개의 댓글