안녕하세요! 오늘은 Azure에 대한 소개를 하고자 합니다

 

Azure는 AWS와 마찬가지로 클라우드 서비스 입니다.

 

 

그렇다면 클라우드 서비스는 어떤 의미일까요? 제가 생각해본 클라우드는 이렇습니다.

 

본인이 소유하지 않고도 사용료를 지불하고 다양한 IT 서비스를 이용할 수 있는 플랫폼

이러한 점 때문에 뽑히는 클라우딩 서비스의 대표적인 장점이 바로 Resourece Pooling 입니다

 

내가 가지고 있지도 않는 자원들( Ex : 메모리, 저장공간 등등...)을 내 것 처럼 활용할 수 잇기 떄문이죠

 

이것을 효과적으로 활용하기 위해서는 어떤 서비스가 제공되어 잇는지, 나에게 어떤 것이 필요한지 를 아는 것이 가장 중요하다고 생각합니다

 

그래서 Azure 관련 첫 게시물은 포괄적인 소개를 드릴겁니다

  1. 저장, 공유 목적의 기능

IT 관련 종사자가 아니라면 사실 클라우딩 플랫폼에 대해 정확히 알고 있는 분들이 적을 것이라고 생각됩니다

 

그러나 네이버나 구글 등에서 제공하는 클라우드를 써보신 분들은 많을텐데요

 

해당 플랫폼에서 제공하는 저장 서비스도 이와 유사하다고 이야기 할 수 있습니다

 

Azure에서 이 기능을 지원하는 대표적인 서비스가 바로 Storage Account 입니다

 

Storage account는 저장소를 제공하는 아주 단순한 기능을 가지고 있습니다.

 

file, blob, table, queue 등 다양한 형태의 파일이 저장이 가능합니다

 

 

<Storage Account>

그러나, 우리는 해당 저장소를 통해 다양한 서비스와 연계하여 사용함으로써 그 효율을 극대화 시킬 수 있습니다

 

예를 들어, 함께하는 팀원들에게 Azure Active Directory를 통해 접근권한을 제공함으로써 저장소를 공유할 수 있고

 

또, 해당 저장소에 프로젝트 결과물을 자동백업 시킴으로써 가용성을 높힐 수도 있습니다

 

  1. 자원 차용의 목적

 

저장소도 자원이지만 여기서 말하는 자원은 메모리, cpu 등등이 되겠습니다

 

Azure 내에서는 Virtual Machine 이라는 가상머신을 활용하여 자원을 빌릴 수 있습니다

 

뿐만 아니라 머신러닝 등 많은 자원이 요구되는 작업을 대신 수행해줌으로써 우리에게 도움을 줄 수 있는 것이죠

 

 

<VM>

 

위 그림에 있는 VM등을 이용해 여러가지 일을 할 수 있습니다

 

앱을 구동할 수도 있고, 본인이 원하는 최적의 환경에서 일을 진행할 수도 있겠네요

 

  1. 서비스 목적

 

Azure 에서는 Wep app, Virtual Machine 등을 이용하여 서비스를 구현할 수 있습니다

(해당 부분은 차 후에 게시 하도록 하겠습니다)

 

코딩을 통해 원하는 값을 얻는 것 까지가 아니라, 본인이 직접 구현한 프로그램, 솔루션들을 서비스화 시키고 싶다면


이런부분을 이용하는 것이 바람직 합니다.

 

  1. 이 외의 기능

 

사실 위에서 솔루션들을 크게 나누어 놓은 것이지 Azure가 제공하는 서비스의 매우 약소한 부분만이 소개되었습니다


주요하게 쓰일 수 있는 부분을 약술해 보자면

 

 

 

DNS ZONE - Azure 내에서 만든 주소를 회사 주소와 연결이 가능하게 하는 것

 

Virtual network - 연결망 분리기능

 

Load Balance - instance를 나누어 과부하를 방지하는 기술

 

traffic Manager - 두개의 웹(다른 지역에 위치한)을 만들었을 시, 위치정보를 통해 더 가까운 쪽으로 접속 유도하는 것

 

SQL server - Azure 상에서 SQL 형태로 정보처리를 하는 기능

 

 

이런 것들이 존재합니다.

 

이 것 또한 일부수준이기 때문에 필요한 서비스를 좀 더 찾아보시는 것을 추천드립니다!

** 해당 내용은 일반통계학(김우철 외 8인 공저)의 내용을 공부하며 쓴 포스트 입니다!

 

 

 

오늘 또한 연구 설계 부문이라고 할 수 있겠습니다. 바로 모집단과 표본에 관한 이야기 입니다

 

통계 기초이니만큼 지루하더라도 잘 봐주시기 바라겠습니다!

 

 

모집단은 간단하게 다시 말씀드리자면 "우리가 관찰하고 있는 집단 전체" 입니다

 

이러한 모집단은 찬성 반대, 혹은 1~5점 등과 같이 특성값을 가지게 되는데

 

특성값의 형태에 따라 이산형, 연속형으로 나뉩니다

 

 

이산형과 연속형은 그래프로 대신하는 것이 바람직 할 듯 합니다

 

 

<출처:R, Python 분석과 프로그래밍 (by R Friend) >

 

<출처:R, Python 분석과 프로그래밍 (by R Friend) >

 

 

해당 그래프를 보시면 1단위 혹은 10 단위로 데이터가 있는 곳을 볼 수 있습니다.

 

이산형 데이터는 이렇게 단위 기준으로 명확히 데이터가 나누어져 있다고 볼 수 있습니다

 

 

연속형 데이터는 

 

<출처 : https://m.blog.naver.com/PostList.nhn?blogId=yunjh7024>

 

 

이런 식으로 데이터가 연속되어 있는 것을 볼 수 있습니다!

 

참고로 이런 그래프를 밀도곡선이라고 합니다

 

 

 

우리는 일반적으로 실험을 진행할 때 표본추출의 형태로 진행하게 됩니다

 

이는 모집단이 실제로 어떻게 이루어져 있을 지 알기 위함인데

 

이 분포를 추측하는 것은 매우 어렵기 때문에 통계량을 통해 모집단을 추측합니다

 

 

그것을 알기위해서는 모집단의 통계량에 대해 알아야 겠죠?

 

 

통계량이라고 부르는 것은 여러가지가 있지만, 가장 기초가 되는 것은 바로 "평균" 입니다

 

식은 다음과 같습니다

 

< 모평균 >

 

 

u는 '뮤' 라고 읽으며 모평균을 나타냅니다

 

식을 풀어보면

 

간단히 ci는 값 fi는 빈도수 N은 모집단의 길이가 되겠네요!

 

모집단의 길이가 들어가는 것은 해당 식이 유한모집단을 가정하고 있다는 의미도 될 듯 합니다

 

 

 

무한 모집단의 경우

 

 

이 와 같은 형태로 진행 됩니다

 

유한 모집단과 달리 N으로 나누는 것이 없어졌습니다

 

그리고 연속형의 경우, 각 극단 값을 빼줌으로써 값을 구한 것이네요!

 

대부분의 연속형 이산형 통계량은 이와 같은 맥락으로 진행됩니다

 

 

다음은 표준편차 입니다. 표준편차 이외에도 "평균절대편차" "사분위수범위" 등 다양한 산포측정법이 있으나

 

표준편차에 비해 이론상의 어려움이 존재해 표준편차를 많이 사용한다고 합니다

 

표준 편차

표준편차 식을 살펴보겠습니다

 

우선, 눈에 띄는 것은 Ci-u 입니다. 해당 식을 풀어이야기 하면 각 특성값에서 모평균까지의 거리이겠네요!

 

각 거리를 모두 더한 후, N으로 나눔으로써 각 특성값의 모평군 까지와의 거리의 평균을 구한 것입니다

 

루트의 경우, Ci-u 의 값이 마이너스가 나오지 않게 제곱을 했기 때문에 루트를 씌워준 것이지요

 

 

 

그렇다면 분산은?

 

 

분산

 

딱 봐도 표준편차에 제곱을 한 것 밖에 없죠?

 

분산의 경우, 산포를 나타내주지만 제곱이 들어가 있기 때문에 해당 값이 데이터의 단위와 잘 맞지 않을 수 있고

 

표준편차는 이러한 문제를 해결해 준다고 볼 수 있겠습니다.

 

 

 

마지막으로 상관계수 입니다.

 

상관계수는 두개의 특성에 대한 변화 관계를 나타낸 것입니다.

 

즉 둘이 얼마나 상관이 있을까? 이 얘기 인거죠

 

<유한 모집단의 상관계수>

 

1과 2는 다른 특성값임을 나타내고 있습니다.

 

분자를 보시면 모평균과 각 데이터를 빼고 있습니다. 이번에는 제곱이 없구요

 

즉 +와 -가 구분이 됩니다.

 

그러므로 각 특성값의 부호가 다르면 해당 데이터 행은 마이너스가 나오게 되죠

 

반대로 같으면 +인자가 나옵니다

 

이러한 진행으로 인해 양의 상관관계가 있다면 1에 가깝게 음의 상관관계가 있다면 -1에 가깝게 진행이 됩니다

 

 

 

 

무한모집단의 이산형 연속형도 앞서 말씀드린 것과 같이 동일형식으로 진행됩니다

 

연속형 식만 나타내면 아래와 같습니다

 

 

<연속형 모집단의 상관계수>

 

 

 

 

 

이제 모집단의 통계량에 대해 알아보았으니 표본에 대해서도 알아 보아야 합니다

 

우리는 표본집단의 통계량을 통해 모집단에 접근할 수 있기 때문입니다

 

사실 큰 차이는 없다고 생각합니다. 단지, 집단이 작게 바뀐 것 뿐입니다

 

아래는 표본 평균입니다

 

 

<표본 평균>

 

모집단과 다를바가 거의 없죠..?

 

다른 것이 있다면 해당 식에는 상대도수가 없다는 정도일 듯 합니다. 

 

 

 

 

그렇다면 표본의 표준편차는 어떨까요?

 

<표본 표준편차>

 

 

왜 n-1 일까요? n이 아니고...ㅎㅎ

 

이유는 숙제처럼 풀어보시는게 좋을 듯 합니다

 

힌트를 드리자면~~ "표본의 표준편차의 목적은 모집단을 추측하기 위함인 것" 인 걸 유념해주시면 될 듯 합니다

 

 

<표본 상관계수>

 

 

 

표본상관계수도 앞서 말씀드린 부분과 모상관계수 부분을 접목시켜서 이해하시면 됩니다!!

 

항상 열공하시기 바랍니다~~

 

 

 

 

'기초통계~~' 카테고리의 다른 글

기초 통계(1) - 자료의 생성  (0) 2019.04.16

 

** 해당 내용은 일반통계학(김우철 외 8인 공저)의 내용을 공부하며 쓴 포스트 입니다!

 

 

 

 

사회 대부분의 곳에서는 통계가 사용되어지고 있습니다. 

 

어떤 인사이트를 도출하기 위해서는 그 것에 대한 검증, 분석이 필요하고 이 때 필요한 것이 바로 통계죠!

 

 

 

하물며, 빅데이터 관련해서는 말할 필요가 없을 정도로 그 중요도가 크다고 합니다

 

그런 관계로 다 같이 통계공부를 해보면 좋을 듯 해요!!

 

 

저는 매 포스팅 앞에 이런 그림을 붙여 놓을까 합니다

 

 

 우리가 통계를 쓰게 되는 과정입니다!!

 

공부를 할 때 이런 식으로 내가 어디를 공부하고 있고

 

어떤 상황에 이 것이 필요한지에 대해 명확히 알 때 본인 지식이 되겠죠??

 

 

오늘 배울 부분은 연구 설계에서 데이터에 관한 부분이라고 할 수 있겠습니다.

 

올바른 검정을 위해선 올바른 데이터가 필요한 것은 당연한 일입니다. 

 

그럼 어떤 데이터를 가져올 때 올바른 것일까요

 

 

 

예를 들어 대통령선거에서 결과를 예측하고자 합니다.

 

그럼 우리는 누구에게 설문을 해야할까요?

 

바로 "투표권이 있는 국민" 입니다. 통계학에서는 이런 국민 개인을 "추출단위" 라고 합니다

 

그리고 "투표권이 있는 모든 국민"은 바로  "모집단"  이라고 합니다.

 

 

 

하지만 일반적으로 선거결과 예측을 할 때는 국민모두를 조사하지는 않습니다.

 

일정 이상의 데이터라면 해당 모집단을 대표할 수 있다고 생각하기 때문이죠

 

그러나 기본 전제가 되는 것이 바로 "대표성" 입니다

 

만약 선거결과 예측을 특정지역에서만 진행했다면

 

이는 "투표권을 가진 국민 전체" 라는 모집단을 대표할 수 없겠죠??

 

그렇기 때문에 모집단에서 무작위로 뽑아내는 "랜덤추출" 을 통해 해당 문제를 해결 할 수 있습니다

 

 

이 랜덤추출은 복원추출과 비 복원추출로 나뉘게 되는데

 

뽑았던 것을 제하고 뽑으면 이것이 비 복원추출입니다

 

 

두 차이는 간단하지만, 개인의 실험 목적에 따라 올바른 것을 사용하는 것은 절대적으로 중요합니다

 

 

 

다음은 실험 상황입니다. 우리는 어떤 것에 대해 알아보기 위해 실험을 하는 경우가 많습니다

 

이 때, 변화를 정확히 알아보기 위해 한 곳에는 알고자하는 것을 주입하고

 

한 쪽에는 주입하지 않아야 겠죠?

 

이 때, 주입한 쪽을 "실험집단", 실험집단의 각 개체를 "실험단위" , 주입한 것을 "처리" 라고 합니다.

 

주입되지 않은 쪽은 "통제집단" 입니다!

 

단순한 개념이니 알고만 가시면 될 듯 합니다. 

 

 

여기서 가장 중요한 것은 '한 쪽에는 주입하고 한쪽에는 하지 않는 다' 는 것입니다.

 

즉, 주입한 것에 따른 차이를 알기 위함이라는 것을 알 수 있죠

 

그렇기 때문에 "주입한 것" 이 외에는 모든 것이 둘은 동일해야 합니다

 

 

이러한 점에서 우리는 실험을 할 때 총 3가지 원칙을 지켜야 합니다

 

1 원칙 : "처리" 이 외의 외부 요인은 최소화 한다.

 

2 원칙 : "처리"를 할 실험단위를 선별 시, 랜덤하게 뽑아야 한다

 

3 원칙 : 충분히 많은 실험 단위에 각 처리를 반복실시한다 

 

 

 

이런 내용을 명확히 기억하고 진행하시면 더욱 정확한 실험이 되겠습니다~~!!

 

화이팅~~

'기초통계~~' 카테고리의 다른 글

기초통계(2) - 모집단과 표본  (0) 2019.04.16


오늘은 인스타그램 크롤링에 대해서 포스팅 하겠습니다!


앞에서 말씀드린 것처럼 인스타그램을 크롤링 할 때는 사실 로그인이 필요없습니다


로그인 없이도 검색이 가능하기 때문이죠


(참고로 셀레니움을 통해서 로그인을 할 필요가 없는 것 입니다!)

 


그렇다면 우리는 어떻게 크롤링을 진행하면 좋을까요?

 

 

 


순서를 정하기 위해선 얻고자 하는 데이터를 명확히 정해야합니다


저는 인스타그램의 해시태그 내용을 가져오려 합니다!!

인스타그램 "핫플" 검색 결과



사진은 초상권 보호를 위해;;ㅎㅎ


이런식으로 검색이 가능합니다!


그리고 해시태그를 가져오기 위해서는 검색 시 나오는 게시물들을 클릭해야 내용을 볼 수 있는 것을


확인했습니다

 

Selenium과 BeautifulSoup 동시 활용

 

 

 

데이터가 어디있는지 우리는 이제 알고 있습니다!

그렇다면 해당 데이터들을 어떻게 효율적으로 들고 올 것인가에 대해 생각해 봐야합니다!

인스타그램은 infinite scroll, 스크롤을 계속 내리면서 게시물을 불러오는 형태입니다

 

 

 

인스타그램 검색화면 "페이지 소스"

 

 

또한, 각 게시물들의 주소가 있는 a태그의 상위 태그 및 속성값이

 

동일한 것을 확인할 수 있습니다

 

 


이런 점을 토대로 해서 저는 셀레니움에서 페이지를 조종하고

스크롤 다운을 시켜 페이지소스가 갱신시키고

갱신된 값에서 BeautifulSoup를 통해 게시물 주소를 파싱하여

 

게시물 주소를 통해 다시 페이지 소스를 받아와 그 곳의 해시태그내용을 가져오는 방식으로 코드를 구성했습니다

 

 

 

 

말을 간결하게 정리하자면

 

 

1. 셀레니움을 통해 변경되는 페이지소스를 계속 받아온다

 

2. 받아온 페이지소스에서 뷰티풀솝을 통해 게시물 주소를 파싱한다

 

3. 파싱을 통해 얻은 게시물 URL을 requests를 통해 페이지소스를 얻어온다

 

4. 받아온 페이지소스를 다시 뷰티풀솝을 통해 해시태그 내용을 파싱한다.

 

 

이런 방식으로 진행됩니다!

 

물론 이건 제 개인적인 방법임으로 각자 얻고자하는 데이터에 따라서 방법을 달리하시면 좋을 듯 합니다!

 

 

 

제가 짠 코드는 완성도가 떨어져 따로 올리지는 않았습니다.

 

대신, 코드를 짜시는 데에 있어서 어려움이 있으시다면 댓글 달아주세요!

 

해당 방법은 최적의 방법이 아닐 수 있음을 사전에 말씀드립니다.

저번 게시글까지는 BeautifulSoup 의 사용법을 알려드리기 위해 네이버 뉴스로 진행을 했었습니다

 

이제!! 다시 원래의 목적이었던 인스타그램 크롤링을 진행해보고자 합니다

 

이미 게시글에 들어오신 많은 분들이 알고 계시겠지만 인스타그램은 페이지를 넘어가는 방식이 아닙니다

 

그렇기 때문에 셀레니움이 필요한 것이구요!

 

그렇다면 셀레니움은 어떤 것일까요?

 

 

  1. Selenium 설치

 

셀레니움은 간단히 말하면 자동으로 웹브라우저를 움직이게 해주는 패키지 입니다

 

Webdriver 라는 API를 통해서 조종하는 것이지요

 

방법은 아래와 같습니다.

 

 

우선 pip을 통해 셀레니움을 다운 받습니다

 

pip3 install Selenium

 

 

잘 설치되셨나요??

 

 

오늘은 특별한 준비물이 있습니다 ㅎㅎ

 

  1. Webdriver

 

그 다음, webdriver 를 별개로 다운 받아야 합니다 저는 크롬브라우저를 사용하고 있습니다.

 

 

여기를 누르면 다운받는 곳으로 이동합니다

해당 링크에서 본인의 크롬 버전과 동일한 것을 다운로드 받으면 됩니다

 

 

 

본인의 크롬 버전은 그림과 같이 우측 상단의 버튼을 통해 확인 가능한 점 참고하세요~

 

 

 

  1. 파이썬을 통한 접속

 

준비물을 다 갖추었습니다. 이제 파이썬을 통해서 페이지에 접속해 보겠습니다

 

우선, 우리는 셀레니움을 사용할 때 필요할 것으로 판단되는 패키지 들을 import 하겠습니다

from selenium import webdriver

import time

from selenium.webdriver.common.keys import Keys

 

셀레니움의 웹드라이버는 크롬을 조종하는 역할

 

타임의 경우, 간단히 말하면 잠시 기다리는 역할

 

마지막 Keys 는 브라우저에 키보드 입력을 구현해 주는 역할 입니다.

 

path = "chromedriver.exe"

driver=webdriver.Chrome(path)

driver.implicitly_wait(3)

 

path의 경우, 앞서 다운로드한 webdriver의 경로를 말하는 겁니다.

 

저는 주피터노트북을 사용하고 있고, 시작위치에 드라이버가 설치되어 있어 저런식으로 path 값을 넣어주었지만

 

시작위치와 파일위치가 다르신 분들은 파일의 경로를 넣어주시면 됩니다

 

implicitly_wait는 어떤 url에 들어가 작업을 진행할 때 몇 초간 기다려주는 것입니다

 

셀레니움은 로그인과 같은 절차가 필요하거나 스크롤 다운과 같은 행동이 필요할 때 사용합니다

 

때문에 url에 접속해서 어떤 액션을 취하게 되는데 너무 빠르게 처리가 되면 작동이 되지 않는 경우가 발생합니다

 

implicitly_wait는 그런 경우를 방지하기 위한 것 입니다

 

driver.get('https://instagram.com')

 

get은 입력한 url에 접속하는 것입니다.

 

무사히 되셨나요?!

 

 

 

 

인스타그램 홈페이지에 접속 되셨나요?

 

 

 

  1. 인스타그램 로그인 하기!

 

사실 인스타그램은 게시물 내용을 들고오기 위해서 로그인을 할 필요는 없습니다!

 

그래서 로그인은 포스팅을 하지 않으려다가 다른 사이트에서 혹시 로그인을 할 분이 있지 않을까해서 올립니다

 

이번 포스팅은 로그인까지만 진행할 예정이니 해당 정보가 필요 없다고 생각하시는 분들은 여기까지겠네요..ㅠㅠ

 

각설하고 로그인 부분을 말씀드리겠습니다

 

 

 

홈페이지에서 로그인을 하려면

 

  1. facebook 로그인

  2. 가입

  3. 인스타그램 아이디로 로그인

 

이런 방법들이 있습니다. 전 인스타그램 아이디가 있으니 노란색으로 칠해져 있는 노란색 버튼을 눌러야합니다!

 

이제부터 나오는 내용이 정말 중요하니 정독 부탁드립니다!!

 

 

  1. Selenium을 통해 크롬 조종하기

 

우리는 원하는 페이지에 접근했습니다.

 

그러나 우리가 셀레니움을 쓰는 목적은 페이지 내용 이 외에 해야할 일이 있기 때문이죠!!

 

그 일 중 하나가 바로 로그인입니다. 그럼 로그인을 어떻게 진행할까요?

 

우리는 앞 포스팅에서 설명한 페이지소스를 토대로 저 버튼을 클릭할겁니다

 

해당 내용을 찾기 위해 로그인 버튼을 우클릭하고 검사를 선택하였습니다.

 

 

 

이런 결과가 나왔네요

 

기존 BeautifulSoup에선 find 혹은 select 등을 이용했습니다.

 

셀레니움에서의 함수는 이렇습니다

 

driver.find_element_by_id("id명")

driver.find_element_by_xpath("경로")

driver.find_element_by_css_selector("경로")

 

find_element_by_id("id명")

 

먼저 id 는 find, find_all과 유사하게 조건으로 넣은 id명을 가지고 있는 소스값을 찾는 것 입니다

 

id 뿐만 아니라, class_name("class명"), name("name명") 등 동일한 방식으로 활용가능합니다

 

 

 

find_element_by_xpath

두 번째는 xpath입니다. 이에 대한 문법이 존재하나 해당 부분은 따로 포스팅을 하려 합니다..ㅎㅎ

 

문법보다는 빠르게 적용 가능한 방법으로 알려드리겠습니다.

 

앞선 포스팅에서 copy를 통해 쉽게 경로를 가져올 수 있다고 언급한 적이 있습니다!

 

그게 바로 xpath에도 적용이 됩니다

 

 

 

검사를 통해 추적한 페이지소스에 우클릭을 하면 Copy를 찾을 수 있습니다

 

그 중에서 Copy XPath를 클릭하면

 

//\*\[@id="react-root"\]/section/main/article/div\[2\]/div\[2\]/p/a

 

이런 값이 저장되는 것을 볼 수 있습니다. 이 것은 해당 소스가 있는 경로 인데요!

 

이 값을 driver.find_element_by_xpath("경로")

 

경로라고 적힌 부분에 넣어주시면 됩니다!

 

추가적으로 해당 경로를 간단히 풀어보자면 id가 "react-root"인 태그의 하위 태그 section 그 하위 태그 main.... div까지

 

쭉죽 가다가 div[2] 가 나옵니다. 이 부분은 같은 div가 있는데 그 중 2번째 라는 이야기 입니다

 

내부의 2\를 지우면 모든 div를 선택하게 됩니다

 

 

 

css_selector

이는 xpath 와 매우 유사합니다

#react-root > section > main > article > div.rgFsT > div:nth-child(2) > p > a

상당히 비슷하죠 ?!?!

 

여기서 div.rgFsT는 div 태그 중에 rgFsT 값을 가지고 있는 태그를 선택한 겁니다!!

 

좀 더 명시적일 수 있겠네요

 

nth-child(2) 는 같은 이름을 가진 div 태그들을 지칭해주는 것입니다.

 

해당 부분도 (2)를 ()로 바꿔주면 모든 div를 선택하게 됩니다!

 

이를 토대로 로그인 소스를 선택하면

 

driver.find_element_by_xpath("//*[@id='react-root']/section/main/article/div[2]/div[2]/p/a").click()

이런 코딩을 통해 해당 소스를 선택하고 클릭할 수 있습니다!

 

click() 이라는 메서드를 통해 선택되어있는 부분(?)을 클릭할 수 있는 겁니다

 

해당 부분을 실행하면

 

 

 

이런 페이지로 들어오게 되었습니다

 

이제 우리는 무엇을 해야 할까요?

 

먼저 또다른 메서드를 알려드리도록 하겠습니다!

 

 

driver.find\_element\_by\_xpath("경로").send\_keys("보내고자 하는 내용")

 

 

 

감이 오시나요?

.

.

.

.

.

.

.

맞습니다!... 안 맞았어도 괜찮습니다

 

우리는 send_keys 라는 메서드를 통해서 바로 로그인을 시도 할 껍니다

 

아주 간단합니다!

 

 

1번, 즉 id를 입력하는 소스를 xpath, css_selector 등등 본인이 편한 방법을 이용해 선택한 뒤

 

send_Keys()를 활용해 본인의 id를 적습니다

 

2번은 동일하게 진행

 

3번은 click() 메서드를 이용하여 클릭까지 도달하면!!!

 

100% 는 아니고 90% 정도 로그인에 성공하였습니다.. ㅎㅎㅎㅎ

 

 

 

바로 이것입니다 ㅎㅎ

 

이런 팝업창이 딱 두개 더 생성되는 것을 확인했습니다!

 

여기까지 해오신 분이라면 너무나 쉽게 이 부분 해결할 수 있을꺼라 생각되서 포스팅은 이만 마치겠습니다!

 

모두들 수고하셨습니다^^!!

 

 

안녕하세요~ 저번 포스팅에 이어서 BeautifulSoup 사용법에 대해 추가로 포스팅 하겠습니다

 

저번에 우리는 대량의 페이지소스를 가져올 수 있게끔 하는 코딩을 연습했습니다

 

그 이후 이야기를 하기에 앞서서 페이지 소스가 무엇인지에 대해 간단하게 이야기를 해드리는게 좋겠습니다

 

 

네이버 경제면

 

간단하게 말하자면 페이지를 구성하고 있는 내용들인거죠!

 

우리는 이 속에서 데이터를 가져오기 위해 필요한 내용을 가져올 수도 있고

 

바로 데이터를 가져올 수도 있습니다.

 

 

네이버 경제면 데이터 가져오기!

 

 

상단에 위치한 이 기사를 가져오려면 우리는 어떻게 하면 좋을까요?

 

방법은 이러합니다!

 

앞에서 말씀드린 페이지소스에서 기사로 들어가는 URL을 얻어 올 수 있습니다

( 위 페이지에서 기사로 들어갈 수 있으니까요! )

 

우리는 얻어온 URL을 가지고 저번 포스팅에서 사용했던 requests 함수에 다시 url을 붙여줄겁니다

 

그렇게 되면 해당 페이지의 내용을 가져올 수 있는 것 입니다

 

이제 앞에서 말로한 일 들을 직접 코드로 짜보겠습니다

 

 

 

얻어오고자 하는 기사에 마우스 우클릭을 하여 '검사'를 클릭합니다

 

검사를 하면 우측에 페이지 소스가 나오면서 본인이 검사한 부분의 페이지 소스를 보여줍니다

 

 

 

저의 경우는 이렇게 떴네요! 직관적으로 앞에 보이는 url이

 

내가 얻고자 하는 데이터가 있는 페이지로 들어가는 url이라는 것을 알 수 있습니다

 

우리는 이 부분을 자동으로 가져오게끔 코딩을 짜야합니다

 

이 부분이 바로 오늘의 중점입니다

 

 

페이지소스 보고 경로 찾기( find, find_all )

 

 

 

페이지소스에는 정말 각양각색의 정보가 있습니다

 

우리는 그 중에서 우리가 원하는 정보만을 가져와야 합니다

 

우리는 원하는 정보를 찾을 수 있게 도와주는 find, find_all 함수를 사용할 겁니다

 

해당 함수는 BeautifulSoup에 내장되어 있는 함수입니다.

 

함수 설명 전, 페이지 소스 구성요소에 대해 간략히 말씀드리자면

 

 

 

 

빨간색 동그라미 부분이 태그입니다! div는 태그명 인거죠

 

파란색 동그라미 부분은 속성입니다! 속성값은 class가 아닌, 옆 부분의 노란 형광펜 부분입니다!!

 

마지막으로 분홍색(?) 밑줄 부분은 텍스트 부분입니다! 해당부분은 태그 a의 텍스트 부분이라고 말할 수 있겠네요

 

얻어오고자하는 정보를 정확히 얻어올 수 있는 능력이 있으면 웹 크롤링은 손쉽게 할 수 있다고 생각합니다

 

그러니 아래 부분에 설명 드릴 find, find_all 부분은 잘 봐두세요!

 

 

find 설명
find('태그') 해당 태그를 조건으로 가장 먼저 발견된 값 하나만 도출
find('태그',{'속성':'속성값}) 해당 태그 중에 같은 속성값을 가진 것 도출
find('태그', 속성=True or False) 해당 태그 중에서 해당 속성이 있는or 없는 것
find_all 설명
find_all('태그') 해당 태그를 조건으로 해당되는 모든 값 도출
find_all('태그','속성값') 태그와 속성값이 같은 모든 값 도출
find_all('태그', 속성=True or False) 해당 태그 중에서 해당 속성이 있는or 없는 것

 

 

이 외에도 정말 많은 방법이 있습니다. 우선 기본적이면서 많이 쓰이게 되는 것 위주로 정리했습니다

 

이제 이 방법들을 토대로 원하는 데이터를 파싱해오겠습니다

 

위에 있던 페이지소스를 보면 원하는데이터가 있는 곳은

 

a라는 태그이며 href와 class 라는 속성이 있습니다.

 

하나의 데이터를 찾을 때에는 위에 있는 "find('태그',{'속성':'속성값})" 를 사용하는 것이 가장 적합합니다

 

 

from bs4 import BeautifulSoup

import requests

url = "https://news.naver.com/main/main.nhn?mode=LSD&mid=shm&sid1=101#&date=%2000:00:00&page=101" 
req = requests.get(url)
bs = BeautifulSoup(req.content.decode('utf-8', 'replace'), 'html.parser')

news= bs.find('a',{'class':'cluster_text_headline nclicks(cls_eco.clsart)'})

url_data=news.get("href")

 

 

갑자기 모르는 이야기들이 나왔을 겁니다

 

requests.get 은 requests에 있는 메서드로써 해당 url에 정보를 요청했다고 생각하시면 됩니다

 

BeautifulSoup는 바로 req에 요청한 정보들을 아까 보신 페이지소스 형태로 가져오는 것 입니다.

 

news는 가져온 페이지소스에서 앞서 설명한 방식으로 원하는 데이터를 가져 온 것이죠

 

get("herf")는 가져온 코드에서 herf의 속성값을 가져오는 것입니다

 

아래는 결과 값입니다

 

'https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=101&oid=022&aid=0003352305'

 

우리는 해당경로에 들어가 다시 같은 방법으로 정보를 가져올 것입니다

 

 

 

 

결과값을 url에 입력했더니 다행히도 동일한 기사 제목이 나옵니다

 

각자 얻고자 하는 내용이 다르겠지만

 

저는 본문정보를 가져와 보겠습니다! 방법은 동일합니다

 

본문을 검사 하여 어디에 원하는 데이터가 있는지 파악 후 가져오는 것입니다

 

 

 

내용이 상당히 복잡한 듯 보이지만 실상은 그렇지 않습니다

 

해당 페이지소스의 경우, 페이지의 생김새와 유사하게

 

중간중간에 이미지 관련 소스가 들어가있는 것 뿐입니다

 

코드는 다음과 같습니다

 

 

req= requests.get(url_data)

bs = BeautifulSoup(req.content.decode('euc-kr','replace'), 'html.parser') 

news= bs.find('div',{'id':'articleBodyContents'})

data=news.get_text()

str(data)

 

 

req에 들어가는 변수가 위에서 뉴스기사 주소를 저장했던 변수로

 

news의 경우, 제가 본문 전체를 포함하는 태그와 속성, 속성값으로 변환 되었습니다

 

get_text는 news에서 가져왔던 소스중에서 텍스트 부분을 가져오라는 이야기 입니다!

 

그리고 한글이 깨져 decode를 위에 써있는 것으로 바꾸었습니다.

 

아래는 결과입니다

 

 

 

본문이 잘 들어간 것을 확인 할 수 있었습니다

 

이런 방식으로 for문을 활용하여 자동으로 데이터를 가져 올 수 있습니다!

 

 

 

 

 

find, find_all의 경우 위에 써있는 방법 이외에도 다양한 방법이 많이 있습니다.

 

뿐만 아니라 select 라는 함수를 이용하여 경로를 표시하는 selector 도 있습니다. 

 

그렇기 때문에 해당 부분은 제가 관련 게시물을 쓰기 전까지는.... 다른 블로그나 사이트에서 필독하셔야 합니다!

 

 

 

또, 찾는 부분이 명확한 경우 검사버튼 클릭 후, 해당 소스를 우클릭 하여 copy를 통해 경로를 가져 올 수도 있습니다

 

그러나, 유용함 면에서는 find, find_all 등을 통해 직관적으로 찾는 것이 훨씬 도움이 된다고 생각합니다

 

모두들 화이팅 하시길 바라겠습니다~~!!

 

먼저, 해당 글은 크롤링을 어떻게 하는지 알려주는 글이 아님을 알려드립니다!!

각 종 모듈 혹은 메서드에 대한 세부적인 설명을 드릴 수 있는 수준이 되지 않기 때문에 설명이 부족할 수 있습니다.!!

 

#인스타그램 크롤링 하기!

 

실전에 부딫히면서 배워나가는 것을 좋아하기 때문에 바로 공모전에 도전하게 되었습니다

여러분 또한 그런 마음으로 이 곳에 들어왔을 꺼라 믿습니다

 

크롤링에 사용되었던 가장 중요한 모듈은 두 가지 였습니다. 바로 BeautifulSoup와 Selenium 입니다

오늘은 그 중에서 BeautifulSoup에 대해서 포스팅 해보고자 합니다.

  1. BeautifulSoup 설치


가장 먼저 해야 할 것은 BeautifulSoup을 설치하는 것입니다.

Python 내장 함수가 아닌 이상, 명령프롬프트(cmd)를 활용하여 Python 내부에 설치해 주어야 합니다

pip install beautifulsoup4 

이라는 코드를 명령프롬프트에 입력하면 다운로드 받을 수 있습니다.
여기서 pip은 beautifulsoup4 와 같은 패키지를 install, uninstall 할 수 있는 명령어 입니다.

(참고로 pip3 는 Python3 버전, pip은 python 2버전 입니다. 버전에 맞게 설치하셔야 합니다!!)

 

  1. Python 내부 import

 

1번에서 진행했던 일은 Python에서 모듈을 이용할 수 있도록 설치한 것입니다.
이제 Python 내부에서 사용하려면 import를 해야합니다.

from bs4 import BeautifulSoup

매우 간단하죠..? 사실 여기까지는 거의 다들 아시는 내용일 것이라 생각됩니다.

 

  1. BeautifulSoup와 requests를 활용하여 데이터 얻기

 

 

import requests

requests 는 html을 가져오는 도구입니다.

 

urllib도 있지만 requests가 간단하고 기능이 유용하기 때문에 선호됩니다(개인적으로만..)

사용했던 코딩으로 간단한 예를 들어보겠습니다

 

네이버의 뉴스 > 경제 부분을 예로 들겠습니다.

어떤 방식으로 크롤링을 하게될지는 모르지만 만약, 한 페이지의 내용을 가져오고

다음 페이지로 넘어가야한다면 높은 확률로 위 방법을 쓰게 될 것입니다.

 

방법은 다음과 같습니다

1. 찾고자하는 정보가 있는 페이지로 이동  
2. 페이지가 바뀔 때, url이 어떤 식으로 바뀌는 지 찾아냄.  
3. 알아낸 정보를 토대로 페이지를 자동으로 받아올 수 있는 문장을 구성

 

위 순서를 토대로 네이버 뉴스 > 경제 부문을 직접 보여 드리겠습니다 네이버 뉴스>경제에 들어갔을 때, url 창에 나와있던 값은

 

https://news.naver.com/main/main.nhn?mode=LSD&mid=shm&sid1=101

 

이 것입니다. 그러나 하단에 있는 2 페이지를 클릭했을 때의 값은

 

https://news.naver.com/main/main.nhn?mode=LSD&mid=shm&sid1=101#&date=%2000:00:00&page=2 

 

위와 사뭇 다른 것을 볼 수 있었습니다. 다시 1페이지를 눌러보니

https://news.naver.com/main/main.nhn?mode=LSD&mid=shm&sid1=101#&date=%2000:00:00&page=1

 

이런 값이 나오는 것을 확인 할 수 있었습니다.


해당 값에서는 어떤식으로 url이 구성되는 지 분명히 알 수 있었습니다.
아마 들어가는 경로가 달랐기 때문이라고 생각됩니다.


해당 부분을 알아 냈으니 저는 for문을 통해서 다음페이지 url을 계속 받아오게끔 코딩을 할 것입니다

https://news.naver.com/main/main.nhn?mode=LSD&mid=shm&sid1=101#&date=%2000:00:00&page=1

맨 뒷부분의 "page=1" 에서 숫자부분이 페이지를 담당하고 있다는 것을 아까의 활동으로 알 수 있었습니다.


그 점을 참고하여 "page=1"에서의 "1" 을 {} 로 바꿉니다. format 함수를 이용할 것이기 때문입니다.


format함수는 문자열 내부에 변수를 넣을 수 있는 함수라고 생각하면 좋을 듯 합니다
문자열 내부에 for 문의 변수를 넣어 다음페이지를 계속 얻어 오는 것입니다


page라는 변수와 +1 모두 int이기 때문에 문자열인 url에 맞게 들어가기 위해 str을 사용하였습니다


그 결과로 나온 코드 값 입니다.

from bs4 import BeautifulSoup

import requests

for page in range(0,10):  
url = "[https://news.naver.com/main/main.nhn?mode=LSD&mid=shm&sid1=101#&date=%2000:00:00&page={}" 
req = requests.get(url.format(str(page+1))  

위 코드를 사용하면 네이버 경제부분의 1~10 페이지 소스를 가지고 올 수 있습니다.

 

본인이 원하는 데이터가 있는 페이지에서 위 처럼 코드를 구성하셨다면

다음은 해당 정보를 가지고 원하는 정보를 가져올 차례입니다.!!

 

 

다음 글에서 이어 작성하겠습니다

+ Recent posts