네이버 동영상 크롤링

완료 누르기 전에 미리보기 눌렀다가 실수로 작성한글 날려서 처음부터... 덕분에 하루늦게 올립니다.

시작하기 전에

크롤링 공부를 위한 자료입니다. 데이터 수집을 위한 다양한 방법을 소개하기 위한 포스터로 개인의 공부 등을 위해서만 아래 내용을 사용해주시면 감사하겠습니다.

네이버를 포함하여 웹서버에 과도한 트래픽을 발생시키거나, 다운받은 영상을 공유할 경우 영업방해와 저작권위반등에 문제가 발생할 수 있습니다.

이에따른 문제에 대해서는 책임지지 않습니다.

 

1. URL 얻어오기

여직까지 URL을 찾는다고 표현을 해왔는데, 이번에는 얻어온다고 표현하겠습니다.

15초 광고 후 재생의 경우에는 확인해보니 광고가 재생되는 시점에 웹브라우저가 서버로부터 광고 후 재생될 영상의 url을 전송받는 것을 확인할 수 있었습니다.

 

크롬 네트워크

[ 크롬 -> 검사 -> 네트워크 ]로 들어가보면 위와같은 화면을 볼 수 있습니다.

확인해보니 이 시점에 영상의 url을 전송받으며, 광고가 끝난 후 영상을 전송받는 것을 확인 할 수 있었습니다.

 

영상의 URL을 담은 응답메시지

위 화면에서 "source" : "~~~" 라고 되어있는 부분이 영상의 URL이 되는 부분입니다.

확인해보니 영상의 해상도에 따라서 URL이 서로 다른것을 볼 수 있었습니다.

 

저 응답메시지를 직접 파이썬에서 불러와서 확인하면 좋겠지만, 아직미숙해서...

 

저는 요청메시지를 그대로 갖고와서 서버로부터 응답메시지를 받아서 처리하는 방법으로 가보겠습니다.

 

2. 요청메시지(Request)

요청메시지를 먼저 확인해보겠습니다. 

 

요청메시지

GET 메서드를 이용해서 전송되는 요청메시지의 파라미터들은 위와같습니다.

일부 내용은 요청메시지마다 중복되는 것들이겠지만, 영상의 종류에 따라서 내용이 많이 다를 수 있기 때문에 파라미터들에 들어갈 내용을 분석해보지는 않겠습니다.

 

저 파라미터 내용은 나중에 심심하면 어떻게 만들어지는지 한번 하나씩 분석해보겠습니다.

 

어찌되었든, 우리의 브라우저에서 저러한 메시지를 웹서버로 전송하기 때문에, 브라우저 로그를 기록하여 요청메시지를 얻어보겠습니다.

 

브라우저 로그

위와같은 방식으로 브라우저를 실행하면 위와같이 전송된 요청메시지를 확인 할 수 있습니다.

 

3~4초에 800개정도의 메시지가...보내졌습니다...

 

우리는 이 많은 메시지에서 원하는 메시지(URL을 응답받을 수 있는 메시지)를 찾는 작업을 해야합니다.

 

흠...

 

요청파라미터의 내용을 보셔서 아시겠지만, 전송되는 메시지의 길이가 상당히 긴 편입니다.

따라서 메시지 길이가 6000자 이하면 버리도록 하겠고, 또하나 메시지에 

 

[ "url":"(https://apis.naver.com/rmcnmv/rmcnmv/vod/play ] 라는 내용이 존재해야합니다. 요청메시지의 기본내용이니까요. (혹시 틀리면 나중에 수정하겠습니다.)

 

따라서 위의 조건을 사용해서 원하는 메시지를 찾아보겠습니다.

 

요청메시지 확인하기

위와같이 실행해보니까 딱 하나, 요청메시지가 걸립니다. 빈 리스트들은 메시지가 6000이상이지만, 정규표현식에서 안잡히는 녀석들입니다.

 

3. URL 응답받기

마지막으로 매우 간단한 작업이 남았습니다.

import requests 를 해주신 후 앞에서 찾아낸 요청메시지를 전송하고, 응답메시지를 받으면 거기서 원하는 정보를 찾으면 끝입니다.

 

응답메시지에서 URL 확인

위와같이 원하는 부분을 추출할 수 있습니다. (JSON을 이용해도 무관합니다.)

 

여러개의 URL에 검색되는 것은 말씀드린 것처럼, 해상도별로 URL이 조금씩 다르기 때문입니다.

 

우리는 가장 고해상도를 필요로 함으로 마지막 append부분을 아래처럼 바꿔주겠습니다.

 

URL 확인

끝~

 

깔끔하게 하나의 URL을 얻어왔습니다.

 

결과화면

 

 

일단 여기까지!

 

에혀...

 

확인해보니까 15초 후 SKIP과 같은 방식도 위와같이 광고시간에 URL을 전송받더군요...

(왜 생각을 못했지...)

 

따라서 그냥 위의 코드만 이용해서 url을 얻어와도 될테고, 혹은 서버에 응답요청 한번이라도 덜주겠다 싶으시면, 그냥 skip버튼 활성화해서 클릭하셔도 될꺼같습니다...

 

큰 차이는 없을꺼 같네요...

 

다음에는 코드정리와 멀티프로세싱을 다루겠습니다.

네이버 동영상 크롤링

 

목표!

이전편에 말씀드린 것처럼 동영상 광고 후 스킵에대한 문제를 해결하도록 하겠습니다.

 

1. 의외로 간단한 해결...

5초/ 15초 광고 후 스킵이 가능한 영상의 코드를 확인해봤는데 단순히 skip버튼이 숨김상태로 존재하는 것을 확인할 수 있었습니다.

 

네... 그냥 script 수정해서 활성화 시켜주고, 클릭하도록 해주면 됩니다.

 

SKIP 버튼 확인

위 영상은 15초 광고 후 스킵이 가능한 영상입니다.

위에 붉게 칠해진 부분을 보면 [ button ] 속성을 볼 수 있습니다.

 

이부분이 SKIP 버튼에 대한 부분일 것을 볼 수 있습니다.

 

보게되면 style 영역에 [ display : none; ] 라고 되어있는 부분이 있는 것을 알 수 있습니다. (크흠...)

 

이부분을 [ display : block; ] 으로 변경해보면 아래같이 바뀌는 것을 볼 수 있습니다.

 

너무... 간단하네요... ㅎㅎ

 

 

SKIP 버튼 활성화

위와 같이 SKIP버튼이 활성화 되는 것을 볼 수 있습니다.

 

실제로 클릭하면 SKIP도 됩니다.

 

그럼 위의 과정을 코드로 작성하겠습니다.

 

먼저 XPath를 얻어와야합니다. (이전글에서 사용했던 방법 그대로 진행했습니다. id 변경해준 후 XPath Copy)

 

그다음 script를 수정해주는 코드를 넣어주고, 버튼에 click을 붙여주면 됩니다.

 

2. 코드

전체 코드

한칸한칸 설명드리겠습니다.

 

1) 기본 라이브러리 호출

2) 크롬브라우저 실행, 다운로드를 원하는 페이지 접속

3) 숨겨져있는 SKIP버튼 호출 (skip버튼의 상태가 none로 된걸을 볼 수 있습니다.)

4) SKIP버튼의 style을 display:block;으로 재설정 (skip버튼의 상태가 block으로 변한것을 볼 수 있습니다.)

5) 활성화된 SKIP버튼 클릭

6) 동영상 url을 갖고와서 저장

 

간단하게 첫번째 문제는 해결했습니다.

 

그럼 다음으로 두번째 문제, [광고 15초 후 재생]의 경우의 해결법을 찾아보겠습니다. (난항이 예상되는...)

네이버 동영상 크롤링

네이버를 시작으로 유튜브와 구글의 동영상 크롤링에 대한 내용을 다룰 예정입니다.

들어가기 전에

크롤링을 통해서 얻은 동영상을 재업로드하는 경우 저작권 위반에 해당될 수 있습니다.

개인 공부용으로 작성된 글입니다. 참고하시는 분들도 공부용으로만 봐주시면 감사하겠습니다.

 

준비하기

작업환경 : Jupyter notebook

사용 라이브러리 : selenium, urllib

네이버 동영상은 " https://tv.naver.com " 의 동영상을 기준으로 하였습니다.

 

1. 동영상 저장 확인

먼저 url로 동영상이 저장되는지 확인해보도록 하겠습니다.

 

간단하게 이전에 다뤘던 구글 이미지 크롤링과 동일한 방법으로 영상 링크를 갖고 와서 저장하는 방법으로 시작해보겠습니다.

동영상 링크

크롬의 [검사] 기능을 이용해서 동영상의 소스를 찾아봤습니다.

 

보이는 것처럼 src 이하의 주소가 동영상의 소스가 됩니다.

 

동영상 주소로 들어갔을 경우

해당 동영상 링크를 주소창에 입력하면 위와 같은 화면을 볼 수 있습니다.

 

해당 영상이 저장이 가능한지 urllib를 이용해서 확인해보겠습니다.

 

동영상 저장

간단하게 저장되네요.(용량은 약 45MB)

 

2. XPath로 동영상 url 갖고 오기

매번 위와 같은 수작업으로 동영상의 url을 확인하는 방법은 크롤링이라고 할 수 없겠죠.

XPath를 이용해서 동영상의 url을 갖고 와 보겠습니다.

 

XPath 복사하기

복사해봤더니

     //*[@id="rmcPlayer_15550522065636948.video"]

라는 값이 저장되는 것을 볼 수 있었습니다.

 

위와 같은 형식의 id값은 동영상마다 id값이 다를 수 있기 때문에, id값이 아닌 class나 div 틀을 갖고 오는 방법이 필요합니다.

 

id 제거

위와 같이 검사 부분을 보게 되면, id = "rmcPlayer_~~~"라고 되어있는 부분이 있습니다.

동영상의 url을 시작으로 상위의 요소에 붙은 위와 같은 id 값들을 전부 제거하고 다시 XPath 값을 갖고 와 보겠습니다.

 

중간에 id = "player"라고 되어있는 부분부터 동영상의 url까지의 id값을 제거해주시면 됩니다.(총 3개)

 

다시 XPath값을 갖고 와서 보니 아래와 같은 값을 얻을 수 있었습니다.

 

//*[@id="player"]/div/div/div[11]/div[13]/video

 

div가 반복되는 게 마음에 안 들지만, 일단 넘어가겠습니다.

 

위의 XPath를 이용해서 url을 얻어와 보겠습니다.

 

url 얻어오기

위와 같은 방법으로 동영상의 url을 얻어올 수 있었습니다.

 

3. 코드 종합

일단 여기까지 코드를 정리해보겠습니다.

 

코드정리

위와 같이 몇 줄 안 되는 코드로 원하는 주소의 동영상을 저장할 수 있었습니다.

 

그럼 이제 몇 가지 문제점을 집고 다음으로 넘아가겠습니다.

 

4. 문제점 확인

네이버의 동영상을 보기위해 웹페이지에 접속하면 자동으로 영상이 재생됩니다.

 

다만, 다들 아시겠지만, 영상의 시작전에 볼 수 있는게 있습니다.

 

바로 광고 입니다. 물론 모든 영상에 광고가 붙지는 않습니다. 아래와 같은 3가지 경우가 있습니다.

 

1) 광고없음 : 광고가 없는경우 위와같이 time.sleep(2) 정도면 웹페이지가 영상의 링크를 갖고오기까지 충분한 시간이 됩니다. 이상적이죠...

2) 5/15초 광고 후 스킵

3) 15초 광고 후 재생

2와 3의 경우 위의 코드를 그냥 실행하게되면 원하는 동영상이 아니라 광고가 파일로 저장되게됩니다.

때문에 이 문제들을 해결하는 방법을 다음 글에서 보도록 하겠습니다... (지금부터 연구...)

 

따라서 다음영상은 2번(5/15초 광고 후 스킵)의 문제를 해결하는 방법을 다루겠습니다.

다음으로 3번(15초 광고 후 재생)

마지막으로 멀티프로세싱을 이용하여 원하는 영상들을 한번에 수집하는 방법을 다루겠습니다.

 

따라서 총 4편을 구성될 예정입니다.

 

파이썬을 이용한 웝 크롤링 (python web crawling with Selenium)

본문에서는 파이썬을 이용한 웹 크롤러 제작에 대한 내용을 다룹니다.

이전 포스터의 연장입니다. 내용 이해를 위하여 이전 포스트 확인 부탁드립니다.


1. 텍스트 데이터 수집하기

텍스트 데이터를 수집하는 방법은 비교적 간단한 편이다. 왜냐하면, 이전에 보았던 send_keys가 해당 개체에 값을 전달하는 것이었다면, text라는 녀석을 이용하여 손쉽게 해당 개체가 갖고있는 텍스트 정보를 갖고올 수 있기 때문입니다.

아래는 위키에서 네이버를 검색하고 검색 결과를 갖고오는 모습을 볼 수 있습니다.


보는바와 같이 겨우 7줄의 코드로 모든 과정이 수행됩니다.




< 코드 >

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome('./chromedriver.exe')
driver.get('https://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC:%EB%8C%80%EB%AC%B8')
driver.find_element_by_xpath('//*[@id="mp_search"]/table/tbody/tr/td[1]/div/div/form/input[1]').send_keys('네이버')
driver.find_element_by_xpath('//*[@id="mp_search"]/table/tbody/tr/td[1]/div/div/form/input[1]').send_keys(Keys.ENTER)
print(driver.find_element_by_xpath('//*[@id="mw-content-text"]').text)



2. 이미지 데이터 수집하기

이미지 데이터 수집은 조금 복잡할 수 있습니다.

왜냐하면, 사이트마다 처리하는 방식이 많이 다르기 때문이죠.

저는 일단 가장 국내에서 대중적인 네이버를 대상으로 진행했습니다.


왼쪽이 코드고, 오른쪽은 파이썬이 제어하는 크롬화면입니다.


< 코드 >

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome('./chromedriver.exe')
driver.get('https://naver.com')
driver.find_element_by_xpath('//*[@id="query"]').send_keys('마동석')
driver.find_element_by_xpath('//*[@id="query"]').send_keys(Keys.ENTER)
driver.find_element_by_xpath('//*[@id="lnb"]/div/div[1]/ul/li[2]/a/span').click()

link = []
for i in range(1, 30):
    try:
        img = driver.find_element_by_xpath('//*[@id="_sau_imageTab"]/div[1]/div[2]/div['+ str(i) + ']/a[1]/img')
    except:
        img = driver.find_element_by_xpath('//*[@id="_sau_imageTab"]/div[2]/div[2]/div['+ str(i) + ']/a[1]/img')
    link.append(img.get_attribute('src'))


왼쪽 코드부 하단에 link 라는 리스트에 저장되는 내용은 오른쪽 이미지들의 이미지 링크입니다.


반복문내에서 이미지 주소를 갖고와서 바로바로 저장하는 방법보다는 한번에 이미지들의 링크를 수집한 후 이 링크들의 이미지들을 다운로드 하는 방식이 저는 더 편해서 이렇게 했습니다. (중간에 애러떠도 수정하기 쉬우니까요)


그럼 최종적으로 이미지는 어떻게 저장할까요?


파이썬의 내장 라이브러리인 urllib를 사용합니다.




이렇게하면, 현재 파이썬 파일과 함께있는 img폴더에 이미지들이 하나씩 저장되게됩니다. 어때요? 간단하죠?


import urllib.request

count = 0
for url in link:
    count += 1
    urllib.request.urlretrieve(url, './img/img'+str(count)+'.jpg')




다음이야기~

일단 초급과정은 여기서 마무리하겠습니다. 여기서 조금만 응용하면 거의 대부분의 간단간단한 기능들은 모두 구현이 가능합니다.

다음 중급자 코스에서는 Headless 크롤링과, 서버를 속이는 방법을 작성하겠습니다..




파이썬을 이용한 웝 크롤링 (python web crawling with Selenium)

본문에서는 파이썬을 이용한 웹 크롤러 제작에 대한 내용을 다룹니다.

개인 정리의 성향이 강하기 때문에 실무에서 사용하는 방법과는 다를 수 있으며, 자바스크립트등을 다루어야 하는 내용은 포함하지 않습니다.



1. 크롤링 환경 구축

 python3 버전과 selenium 라이브러리, 그리고 크롬드라이버가 필요합니다.

 파이썬은 사용을 위한 환경은 아나콘다 3.x버전을 설치하시는 것을 권장합니다. (포스터에서는 아나콘다 3.x 버전 설치시 따라오는 주피터 노트북 사용)
 Selenium은 jupyter notebook에서 [!pip install selenium] 명령으로 간단하게 설치가 가능합니다.

 크롬드라이버는 사용하는 OS에 알맞게 다운로드 후 파이썬 .py 또는 .ipynb 파일과 함께 두면 됩니다.  다운로드 링크 => 다운로드



2. 프로그래밍 기본


다음과 같이 jupyter notebook에서 selenium을 import하고, 아래의 방식으로 크롬드라이버를 실행 할 수 있습니다.

driver.get( URL )을 이용하여 원하는 페이지로 이동도 가능합니다.




그리고 여기서 오른쪽 클릭을 하면 [검사] 라는 녀석이 있습니다. "크롬 브라우저"에서만 가능합니다.



검사라는 녀석을 클릭하면 옆에 창이하나 생기는데, 이 후 검색어를 입력하는 부분에서 한번더 [우클릭+검사]를 눌러주면 아래 화면과 같이 특정 영역이 지정되는 것을 볼 수 있습니다.




위 사진에서 오른쪽 영역은 해당 페이지의 HTML문서 내용입니다. 그리고 이 HTML문서에서 검색어를 입력하는 영역에 대한 부분이 바로 파란색으로 지정된 영역임을 알 수 있습니다.


아래 그림과 같이 오른쪽 파란색 영역에서 [우클릭 - Copy - Copy XPath]를 누르면 해당 영역에 대한 XPath값을 복사해올 수 있습니다.





이렇게 복사해온 값을 파이썬 코드에서 사용합니다.


앞서 크롬드라이버를 갖고온 driver라는 녀석한테 find_element_by_xpath(' XPath ').send_keys(" 전송할 내용 ") 이라는 형태로 작성하면 아래와 같이 실행했을 때, 구글검색 영역에 send_keys에 입력한 글자가 자동으로 입력되는 것을 볼 수 있습니다.






입력을 했다면, [엔터] 버튼을 눌러서 검색결과를 확인해야겠죠?


아래 코드를 확인해주세요.



위에 xpath의 값은 전과 동일합니다. 다만, send_keys에서 문자를 전달하는 것이 아니라, ENTER키를 누른 액션을 전달한다는게 차이입니다.


즉, 위 코드로 검색창에 커서를 둔 상태로 ENTER키를 누른 효과를 만들 수 있는 것입니다.



일단 여기까지해서 크롤링의 가장 기본적인 부분을 다루어봤습니다.


바로 다음에 이어질 포스터에서는 크롤링을 통하여 실제 데이터라고 할 수 있는 것들을 긇어오는 방법을 알아보겠습니다.

+ Recent posts