Notice
Recent Posts
Recent Comments
Link
얼레벌레
[크롤링] 동적 페이지 크롤링 본문
웹페이지 종류
웹페이지 종류에 따라 크롤링 방식이 달라진다.
- 정적 페이지
- 페이지의 데이터가 변경될 때 URL이 변경된다.
- html 포맷의 데이터를 수집한다.
- ex) 페이지1 에서 2를 누르면 URL1 -> URL2로 변경, 텍스트도 변경됨
- 동적 페이지
- 페이지의 데이터가 변경될 때 URL이 변경되지 않는다.
- json 포맷의 데이터를 수집한다.
- ex) 더보기 버튼을 클릭했는데 URL이 바뀌지 않음, 그런데 텍스트는 추가됨.
requests 패키지
- 브라우저의 url을 입력하면 서버에서 데이터를 다운받아 화면에 출력한다.
- url => data
동적 페이지 크롤링 프로세스
- 웹 서비스를 분석
- 크롬 개발자 도구에서 URL을 얻는다.
네트워크 탭의 네트워크 트래픽에 뜨는 것에서 remote address
네트워크 트래픽에서 get/post 방식, 요청 url, response 탭 (서버에서 가져오는 데이터), preview (좀 정리해서 보여주는 탭) 등 정보를 확인할 수 있다.
- 크롬 개발자 도구에서 URL을 얻는다.
- URL을 알아냈으니까, 서버쪽에다가 해당 URL로 데이터를 요청해야 함.
- requests -> response 를 통해 JSON 포맷의 string 데이터를 가져온다.
- JSON 포맷의 string 데이터를 list나 dict 형태로 바꾼 후 dataframe으로 만들어 준다.
- 1~3의 과정을 토대로 함수 만들기
데이터 분석
상관 관계 분석
- 두 데이터 집합 사이에 관계가 있는지 확인하는 분석 방법
- 원달러 환율이 높으면 코스피/코스닥 주가 지수가 낮다 => 음의 상관관계
- 높높이면 양의 상관관계
피어슨 상관계수
- df.corr()
- 두 데이터 집합에 대한 피어슨 상관계수를 구한 값이 1과 가까울 수록 강한 양의 상관관계를 갖는다.
- -1과 가까울수록 강한 음의 상관관계를 갖는다.
- 0과 가까울수록 관계가 없다.
API를 이용한 데이터 수집 방법
API
- application programming interface
- api를 사용해서 데이터를 수집하는 것은 서비스에 데이터를 제공하는 공식적인 방법으로 데이터를 수집하는 것이다.
크롤링 프로세스
- APP 등록해서 app_key(request 토큰) 수집
- developers.naver.com (네이버 api 사용 경우) 들어가서
- 애플리케이션 등록(API 이용 신청) => 애플리케이션 이름, 사용 API 작성
- 비로그인 오픈 API 서비서 환경에서 web 설정, url은 아무거나 => 등록하기
- 그렇게 등록을 하면 내 애플리케이션에서 목록에 뜸, 거기서 ID와 key 값 가져오기.
- Naver API Document 확인
- url을 알아낼 수 있다. (url을 알아내는 과정이 브라우저를 사용하는 앞의 과정과 다름)
- Document -> API 레퍼런스에서 URL, 프로토콜, get/post, 파라미터, 언어코드, 구현예제 등을 확인할 수 있다.
- request(url, app_key) => response(json)
- app_key가 없으면 패스워드가 없는 것이므로, 거절된다.
- 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가지
- ASCII : 영문, 숫자, 특수문자 표현 (4바이트)
- ecukr : 한글 (8바이트)
- 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)
'취업 > KT AIVLE SCHOOL' 카테고리의 다른 글
[크롤링] selenium, xpath, scrapy (0) | 2022.08.09 |
---|---|
[크롤링] Request header와 BeautifulSoup (0) | 2022.08.08 |
[크롤링] 웹 - 서버와 클라이언트, 웹 구조 (0) | 2022.08.07 |
[py] pandas 패키지 (0) | 2022.08.07 |
[py] 데이터 유형과 numpy (0) | 2022.08.07 |