얼레벌레

[크롤링] 동적 페이지 크롤링 본문

취업/KT AIVLE SCHOOL

[크롤링] 동적 페이지 크롤링

__Lucie__ 2022. 8. 7. 23:43

웹페이지 종류

웹페이지 종류에 따라 크롤링 방식이 달라진다.

  • 정적 페이지
    • 페이지의 데이터가 변경될 때 URL이 변경된다.
    • html 포맷의 데이터를 수집한다.
    • ex) 페이지1 에서 2를 누르면 URL1 -> URL2로 변경, 텍스트도 변경됨
  • 동적 페이지
    • 페이지의 데이터가 변경될 때 URL이 변경되지 않는다.
    • json 포맷의 데이터를 수집한다.
    • ex) 더보기 버튼을 클릭했는데 URL이 바뀌지 않음, 그런데 텍스트는 추가됨.

requests 패키지

  • 브라우저의 url을 입력하면 서버에서 데이터를 다운받아 화면에 출력한다.
  • url => data

 

동적 페이지 크롤링 프로세스

  1. 웹 서비스를 분석
    • 크롬 개발자 도구에서 URL을 얻는다.
      네트워크 탭의 네트워크 트래픽에 뜨는 것에서 remote address
      네트워크 트래픽에서 get/post 방식, 요청 url, response 탭 (서버에서 가져오는 데이터), preview (좀 정리해서 보여주는 탭) 등 정보를 확인할 수 있다.
  2. URL을 알아냈으니까, 서버쪽에다가 해당 URL로 데이터를 요청해야 함.
    • requests -> response 를 통해 JSON 포맷의 string 데이터를 가져온다.
  3. JSON 포맷의 string 데이터를 list나 dict 형태로 바꾼 후 dataframe으로 만들어 준다.
  4. 1~3의 과정을 토대로 함수 만들기
  5.  

데이터 분석

상관 관계 분석

  • 두 데이터 집합 사이에 관계가 있는지 확인하는 분석 방법
  • 원달러 환율이 높으면 코스피/코스닥 주가 지수가 낮다 => 음의 상관관계
  • 높높이면 양의 상관관계

피어슨 상관계수

  • df.corr() 
  • 두 데이터 집합에 대한 피어슨 상관계수를 구한 값이 1과 가까울 수록 강한 양의 상관관계를 갖는다.
  • -1과 가까울수록 강한 음의 상관관계를 갖는다.
  • 0과 가까울수록 관계가 없다.

API를 이용한 데이터 수집 방법

API

  • application programming interface
  • api를 사용해서 데이터를 수집하는 것은 서비스에 데이터를 제공하는 공식적인 방법으로 데이터를 수집하는 것이다.

크롤링 프로세스

  1. APP 등록해서 app_key(request 토큰) 수집
    • developers.naver.com (네이버 api 사용 경우) 들어가서
    • 애플리케이션 등록(API 이용 신청) => 애플리케이션 이름, 사용 API 작성
    • 비로그인 오픈 API 서비서 환경에서 web 설정, url은 아무거나 => 등록하기
    • 그렇게 등록을 하면 내 애플리케이션에서 목록에 뜸, 거기서 ID와 key 값 가져오기.
  2. Naver API Document 확인
    • url을 알아낼 수 있다. (url을 알아내는 과정이 브라우저를 사용하는 앞의 과정과 다름)
    • Document -> API 레퍼런스에서 URL, 프로토콜, get/post, 파라미터, 언어코드, 구현예제 등을 확인할 수 있다.
  3. request(url, app_key) => response(json)
    • app_key가 없으면 패스워드가 없는 것이므로, 거절된다.
  4. json(str) => list, dict => dataframe

** json.dump() 를 사용한 이유?

  • 인터넷 트래픽에서는 영문, 숫자, 특수문자만 사용가능하다.
  • 그런데 json.dumps()는 한글과 같은 문자를 인코딩 (영문, 숫자, 특수문자로 변환)함.
  • params를 그대로 사용하면 "파이썬은 재밌습니다"가 깨져버림.
  • 그렇기 때문에 한글을 영문, 숫자, 특수문자로 변환해주어야 하는데, 그 변환해주는 게 json.dumps()임.
  • 한글이 없으면 이렇게 안해줘도 됨

 

수업 중 웹 크롤링 외 지식들

dogstring 

함수를 사용하는 방법을 문자열로 작성한 것

help() 혹은 shift+tab 으로 dogstring을 띄울 수 있음.
ex) help(stock_price)

lambda 란?

일회성 함수이다. (실행 시 잠깐 생성되었다가 사라지기 때문)

사용하는 이유: 간단한 함수(파라미터를 받아서 바로 리턴하는)를 메모리를 절약하여 사용하기 위해

간단한 함수를 argument에서 구현해서 사용하는 용도로 주로 사용한다.

사용 방법 =>  lambda 파라미터 : 리턴코드

apply() 함수

모든 데이터를 func를 적용시킨 결과 출력

utf-8-sig

엑셀에서 사용하는 인코딩 방식과 호환이 되는 utf-8 인코딩 방식.

인코딩 처리 안하면 깨져서 나온다.

  • 인코딩이란?
    • human이 사용하는 언어는 'A'라고 하자. 컴퓨터가 사용하는 언어는 0과 1로만 구성되어 있다.
    • 이 A를 컴퓨터한테 0101..로 변환해 전송해야 함.
    • A를 0001로 변환하는 것을 인코딩, 반대로 0001을 A로 변환하는 것을 디코딩이라고 한다.
    • 즉, 인코딩은 문자->이진수, 디코딩은 이진수->문자이다.
    • 하지만 인코딩과 디코딩은 여러 종류가 있다.
      가령 1번방식 인코딩은 A->0001 로 해석하고,
      2번 방식 인코딩은 A를 1000으로 해석했다고 하자.
      이 때 만약 1번 방식으로 인코딩한 0001을 2번 방식으로 디코딩을 진행한다면 깨져버린다.
      즉, 1번 방식으로 인코딩 했으면 똑같이 1번 방식으로 디코딩을 해야 한다.
  • python dataframe에서는 utf-8 인코딩 방식을 사용하는데,
    엑셀에서는 ISO... 방식을 사용한다.
  • 그래서 dataframe에서 정한 A를 엑셀에서 열면 깨지는 것이다.
    이것을 방지하는 것이 'utf-8-sig'이다 -> 사용하면 엑셀에서 ISO...로 인코딩한다.

인코딩 방식 3가지

  1. ASCII : 영문, 숫자, 특수문자 표현 (4바이트)
  2. ecukr : 한글 (8바이트)
  3. utf-8 : + 모든나라 언어(16바이트)

한글자 쓸 때 utf-8이 가장 많이 차지

그런데 요즘엔 하드웨어가 많이 저렴해졌기 때문에 무조건 utf-8을 쓰는 추세

함수의 scope

변수를 선언할 때 함수 밖에서 선언하는 것과 함수 안에서 선언하는 변수의 메모리 저장공간이 다르다.

전역(global)영역: 함수 밖의 영역

지역(local)영역 : 함수 안의 영역

data=10 #RAM 안의 글로벌 영역에 생성

def change() :
	data=20 #새로운 변수를 RAM 안의 로컬 영역에 생성
    
chante()
print(data) #10이 출력됨.

#이런 결과가 나오는 이유: global, local을 고려하지 않았기 때문에

해결 방법 (마지막에 20이 출력되도록 하는 방법): global 명령어 사용.

global 명령어는, 지역 영역에서 전역 영역에 있는 변수를 가져올 때 사용하는 명령어이다.

data = 10

def change():
	global data #전역 영역에 있는 data를 지역 영역으로 가져옴
	data=20 
    
change()
print(data)