2018년 4월 4일 수요일

,

웹텍스트 크롤링 프로그래밍



웹텍스트 크롤링 프로그래밍

아디이어와 R, Python에서 필요한 함수 소개

      "네이버에서 혼밥에 대한 일반인들의 글을 크롤링하고자 한다. 어떻게 해야 하나?"

웹블로그에서 특정 내용(예를 들면, 각 글의 주제, 본문, 시간)등을 추출하는 것이 현재 국내 텍스트 마이닝에서 가장 많이 하는 일이다. 이 장에서는 네이버 만이 아니라 어떤 웹사이트건, 해당 사이트에 있는 내용을 추출해 오는 방법을 이해하는 데 필요한 핵심내용을 파이썬 코드를 이용하여 설명하고자 한다. 

특정 불로그(타겟사이트)에서 반복해서 나타나는 특정 정보를 추출해, 특정 csv화일에 저장하기를 순서대로 설명하고, Python

웹텍스트 크롤링 프로그래밍


아디이어와 R, Python에서 필요한 함수 소개

      "네이버에서 혼밥에 대한 일반인들의 글을 크롤링하고자 한다. 어떻게 해야 하나?"
웹블로그에서 특정 내용(예를 들면, 각 글의 주제, 본문, 시간)등을 추출하는 것이 현재 국내 텍스트 마이닝에서 가장 많이 하는 일이다. 이 장에서는 네이버 만이 아니라 어떤 웹사이트건, 해당 사이트에 있는 내용을 추출해 오는 방법을 이해하는 데 필요한 핵심내용을 파이썬 코드를 이용하여 설명하고자 한다. 

특정 불로그(타겟사이트)에서 반복해서 나타나는 특정 정보를 추출해, 특정 csv화일에 저장하기를 순서대로 설명하고, Python과 R과 으로 하는 법을 간략히 예문으로 설명하고자 한다.  

파이썬이나 R로 작성할 경우 참고할 사이트
      R 예제:  http://kuduz.tistory.com/1041 
               (살짝 다른 기능을 하는 코드이긴 하나 큰 차이가 없이 이용 가능합니다.)
      Python 예제: 

Step 0: 추출하고자 하는 타겟 사이트의 URL 구조 파악하자.
      예: 네이버에서 fishing keyword 도시락 으로 서치한 결과 페이지를 살펴보고 아래 특성을 파악하자. 

        우선, 타겟 사이트로 가서 다음 사항을 살펴보자. (네이버 블로그로 일단 가보자.)

      1) html ? Vs javascript? 구성 언어 확인하자.
            확인 방법? 소스 코드를 보자 (단축키 Ctrl + Shift + I)
           * 파일의 시작과 끝이 <HTML> ... </HTML>로 작성되면 우리가 크롤링할 수 있는 문서 즉, html문서이다.

           여기서는 편의상 html로 구성된 웹사이트 정보만 취급하자.             * 참고: 자바스크립트 부분(###)이  html내 포함되는 경우도 많이 있다. 
                         (Html내 <SCRIPT>###</SCRIPT> 로 삽입되어 있음.)
 
       2) 동적 html인지 정적 html인지 확인하자.
            *만약 트위터처럼 한 페이지에 서치 결과가 계속 추가되는 동적html로 구성된 사이트라면 (즉, 탐색 결과가 페이지로 나누어 정리되지 않는 페이지라면 트위터 추출시 사용한 방법을 이용하면 된다.) 
 
    3) 서치결과 웹페이지 url에서 키워드와 페이지 위치를 파악하자 (주소 형성 문법 이해).
           url 내 서치키워드, 서치결과 페이지 넘버, 날짜(있는 경우) 등이 url의 어디에 기록되는 지 확인하자.
          (예: 도시락 첫페이지 https://section.blog.naver.com/Search/Post.nhn?pageNo=1&rangeType=ALL&orderBy=sim&keyword=도시락)
              -> https://section.blog.naver.com/Search/Post.nhn?pageNo=페이지수&rangeType=ALL&orderBy=sim&keyword=서치키워드
      *이걸 보고 앞으로 크롤 할 페이지 url을 알수 있다.
      * 패턴을 파악하기 어렵도록 url을 암호화한 사이트는 다른 방법을 찾아야 함.
                (예를 들면 구글은 서치 결과에 해당하는 사이트 url을 암호화해서 그 주소들을 그대로 가져와서 사용할 수 없다. 내가 열심히 찾아낸 정보인데,,, 반드시 구글에 와서 찾아라는 아이디어다.)
             
Step 1: web text scraping시 항상 쓰는 library 설치 및 부르기
          (필요한 function 포함된 라이브러리(=패키지(R), 모듈(Python))을 호출)
 
Python경우:
      from selenium import webdriver  # webdriver사용  (가상크롬 설정)
      from bs4 import BeautifulSoup   # 웹문자 추출 beautifulsoup
      import urllib.request           # url가져오기
      import re                       # request(url가져오기)
      import time                     # ...
      import numpy as np       # 과학 계산, 다차원 배열을 처리 참고 http://pythonstudy.xyz/python/article/402-numpy-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
         import csv                      # csv화일 저장용

R경우: 설치(package) 후 부르기 (library)
install.packages("httr")
install.packages("rvest")
library(httr)
library(rvest)

Step 2: 분석시 필요한 각 변수들 만들기(정의) 및 필요한 기초 정보 설정
             변수: 크롤링할 url (복수이므로 이것 설정)
                     피싱키워스 입력
                     크롤링할 페이수 최대 수 설정
                     추출 데이터 저장할 화일명과 파일 변수 생성

Loop(아래 반복 처리)
Step 3: 타겟 url의 html 소스코드 불러서 변수(sourcecode)에 담자.

R의 경우:    sourcecode<-read_html("타겟 url") 

Python경우:   sourcecode.get("타겟url")

Step 4  (파싱): 가져온 소스코드 전체에서 수집하고자 하는 부분들(필드1, 필드2…라 하자)만 따로 뽑아서 해당 변수(field1, field2…)에 담아 넣자
      
Python경우:  
        예: soup = BeautifulSoup(driver.page_source, "html.parser")
                      # 전체 소스코드를 파싱하기 좋은 형태의 데이타변수에 넣고 (soup),
              field1 = soup.find_all("div", {"class":"list_search_post"})     
                        #soup에서 특정 내용 추출해 link에 담기

R의 경우: html_nodes(sourcecode, find_class) sourcecode에서 특정 html클래스 (예 field_class)에 해당하는 내용 추출(파싱)해주는 용도의 함수가 따로 있다. 
              field1<-html_nodes(sroucecode, 'a') (예 tag
                     * html_nodes(html, '.searchCont')
              (특정 class의 경우에는 해당 class이름 적기. 단 '. 마침표 필요함)
              field2 <- html_attr(sourcecode, 'href') 
               (url주소를 sourcecode내에서 찾아서 url1에 저장하기)                        
              links <- html %>% html_nodes('a') %>% html_attr('href')
             
Step 5 : 마지막으로 텍스트 화일(csv형태)로 저장하자. (화일명은 예를 들어 CrwaledText.csv) 위 각 항목을 다 합쳐서 다른 변수에 담은 뒤 (예 information) 만든 뒤 이것 파일로 저장)
 R의 경우: write.csv(information, "CrwaledText.csv")
 Python경우: writer.writerow( [information] ) 
       (Python의 경우 writer는 사전에 CrwaledText.csv로 지정해야 함. Python 예제 참고할 것.)


으로 하는 법을 간략히 예문으로 설명하고자 한다.  

  • 파이썬이나 R 작성할 경우 참고할 사이트
      R 예제http://kuduz.tistory.com/1041 
               (
살짝 다른 기능을 하는 코드이긴 하나 차이가 없이 이용 가능합니다.)
      Python 예제

Step 0: 추출하고자 하는 타겟 사이트의 URL 구조 파악하자.
      : 네이버에서 fishing keyword 도시락 으로 서치한 결과 페이지를 살펴보고 아래 특성을 파악하자

        우선, 타겟 사이트로 가서 다음 사항을 살펴보자. (네이버 블로그로 일단 가보자.)

      1) html ? Vs javascript? 구성 언어 확인하자.
            
확인 방법? 소스 코드를 보자 (단축키 Ctrl + Shift + I)
           파일의 시작과 끝이 <HTML> ... </HTML>로 작성되면 우리가 크롤링할  있는 문서 , html문서이다.

           여기서는 편의상 html 구성된 웹사이트 정보만 취급하자           * 참고: 자바스크립트 부분(###)  html 포함되는 경우도 많이 있다. 
                         (Html <SCRIPT>###</SCRIPT> 로 삽입되어 있음.)
 
       2) 동적 html인지 정적 html인지 확인하자.
            *
만약 트위터처럼 한 페이지에 서치 결과가 계속 추가되는 동적html 구성된 사이트라면 (, 탐색 결과가 페이지로 나누어 정리되지 않는 페이지라면 트위터 추출시 사용한 방법을 이용하면 된다.) 
 
    3) 서치결과 웹페이지 url에서 키워드와 페이지 위치를 파악하자 (주소 형성 문법 이해).
           
url 서치키워드, 서치결과 페이지 넘버, 날짜(있는 경우) 등이 url 어디에 기록되는 확인하자.
          (
: 도시락 첫페이지 https://section.blog.naver.com/Search/Post.nhn?pageNo=1&rangeType=ALL&orderBy=sim&keyword=도시락)
              -> https://section.blog.naver.com/Search/Post.nhn?pageNo=페이지수&rangeType=ALL&orderBy=sim&keyword=서치키워드
      *
이걸 보고 앞으로 크롤 페이지 url 알수 있다.
      * 패턴을 파악하기 어렵도록 url 암호화한 사이트는 다른 방법을 찾아야 .
                (예를 들면 구글은 서치 결과에 해당하는 사이트 url을 암호화해서 그 주소들을 그대로 가져와서 사용할 수 없다. 내가 열심히 찾아낸 정보인데,,, 반드시 구글에 와서 찾아라는 아이디어다.)
            
 
Step 1: web text scraping시 항상 쓰는 library 설치 부르기
          (
필요한 function 포함된 라이브러리(=패키지(R), 모듈(Python)) 호출)
 
Python경우:
      from selenium import webdriver  # webdriver사용  (가상크롬 설정)
      from bs4 import BeautifulSoup   # 웹문자 추출 beautifulsoup
      import urllib.request           # url가져오기
      import re                       # request(url가져오기)
      import time                     # ...
      import numpy as np       # 과학 계산, 다차원 배열을 처리 참고 http://pythonstudy.xyz/python/article/402-numpy-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
         import csv                      # csv화일 저장용

R경우: 설치(package) 부르기 (library)
install.packages("httr")
install.packages("rvest")
library(httr)
library(rvest)

Step 2: 분석시 필요한 변수들 만들기(정의) 필요한 기초 정보 설정
             
변수: 크롤링할 url (복수이므로 이것 설정)
                     피싱키워스 입력
                     크롤링할 페이수 최대 설정
                     추출 데이터 저장할 화일명과 파 변수 생성

Loop(아래 반복 처리)
Step 3: 타겟 url html 소스코드 불러서 변수(sourcecode) 담자.

R 경우   sourcecode<-read_html("타겟 url"

Python경우  sourcecode.get("타겟url")

Step 4  (파싱): 가져온 소스코드 전체에서 수집하고자 하는 부분들(필드1, 필드2…라 하자)만 따로 뽑아서 해당 변수(field1, field2) 담아 넣자
      
Python경우:  
        
: soup = BeautifulSoup(driver.page_source, "html.parser")
                      #
전체 소스코드를 파싱하기 좋은 형태의 데이타변수에 넣고 (soup),
              field1 = soup.find_all("div", {"class":"list_search_post"})     
                        #
soup에서 특정 내용 추출해 link 담기

R 경우: html_nodes(sourcecode, find_class) sourcecode에서 특정 html클래스 ( field_class) 해당하는 내용 추출(파싱)해주는 용도의 함수가 따로 있다. 
              field1<-html_nodes(sroucecode, 'a') ( tag
                     * html_nodes(html, '.searchCont')
              (
특정 class 경우에는 해당 class이름 적기. '. 마침표 필요함)
              field2 <- html_attr(sourcecode'href') 
               (url
주소를 sourcecode내에서 찾아서 url1 저장하기)                        
              links <- html %>% html_nodes('a') %>% html_attr('href')
             
Step 5 : 마지막으로 텍스트 화일(csv형태)로 저장하자. (화일명은 예를 들어 CrwaledText.csv)  항목을  합쳐서 다른 변수에 담은 뒤 ( information) 만든 뒤 이것 파일로 저장)
 R 경우: write.csv(information, "CrwaledText.csv")
 Python경우: writer.writerow( [information] ) 
       (Python의 경우 writer는 사전에 
CrwaledText.csv로 지정해야 함. Python 예제 참고할 것.)


Share this post: