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

저번 게시글까지는 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