반응형

0. 웹 크롤링이 뭐야?

 

크롤링은 인터넷 상에서 웹 페이지를 순회하고, 웹 사이트에서 정보를 추출하는 자동화된 프로세스를 말합니다. 크롤링은 웹 크롤러 또는 스파이더라고 불리는 소프트웨어를 사용하여 이루어집니다. 이러한 소프트웨어는 웹 페이지의 내용을 다운로드하고 분석하여 원하는 정보를 추출하거나 웹 사이트의 구조와 링크를 파악하는 역할을 합니다.

크롤링의 주요 단계는 다음과 같습니다:

  1. 웹 페이지 다운로드: 크롤러는 웹 페이지의 HTML 코드를 다운로드하여 로컬로 저장합니다. 이 과정에서 웹 사이트의 서버에 부하를 주지 않도록 주의해야 합니다.
  2. HTML 분석: 다운로드한 HTML 코드를 파싱하여 웹 페이지의 구조와 내용을 분석합니다. 이를 통해 웹 페이지의 제목, 본문 내용, 이미지, 링크 등을 식별할 수 있습니다.
  3. 정보 추출: 분석한 HTML 코드에서 원하는 정보를 추출합니다. 예를 들어, 뉴스 웹사이트에서는 제목과 내용을 추출하거나, 제품 판매 사이트에서는 상품명과 가격을 추출할 수 있습니다.
  4. 링크 추출: 웹 페이지 내에 포함된 링크를 추출하여 다음에 크롤링할 페이지를 결정합니다. 이를 통해 웹 사이트 전체를 순회할 수 있습니다.
  5. 데이터 저장: 추출한 정보를 데이터베이스나 파일로 저장하여 나중에 활용할 수 있도록 합니다.

크롤링은 정보 수집이나 분석에 유용하지만, 합법적인 용도로 사용되어야 합니다. 일부 웹 사이트는 크롤링을 제한하기 위해 로봇 배제 표준(robots.txt) 파일을 사용하거나, 서비스 이용 약관에서 크롤링을 금지하는 조항을 포함할 수 있습니다. 합법성과 예의를 지키며 웹 크롤링을 수행하는 것이 중요합니다.

 

 

1.  올리브영 랭킹 크롤링

한국 올리브영은 주로 화장품, 스킨케어 제품, 메이크업 제품, 향수, 건강 보조제 등의 뷰티 제품을 판매하는 대형 뷰티 및 화장품 전문 매장 체인이다. 올리브영은 한국을 비롯한 다양한 국가에서 전 세계적으로 유명한 뷰티 브랜드의 제품을 한 자리에서 쉽게 구매할 수 있는 공간을 제공하며, 소비자들에게 다양한 제품 선택지와 트렌드에 맞는 뷰티 상품을 제공한다. 올리브영은 뷰티 제품에 초점을 맞추어 운영되는 브랜드로, 다양한 브랜드와 제품을 한 자리에서 만나보고 구매할 수 있는 공간으로 많은 사람들에게 이용되고 있다.

 

올리브영에서는 실시간 랭킹 정보를 제공해주고 있다. 이를 통해 현재 카테고리 별로 어느 제품들이 판매가 잘 되고 있는지 쉽게 알 수 있고, 썸네일을 클릭만 하면 쉽게 제품을 구매할 수 있어 제품 검색 시 큰 도움을 받고 있다. 이 글을 쓰고 있는 지금 현재 에스트라의 아토베리어 수딩크림이 1위를 달리고 있다.

올리브영 랭킹 바로가기 클릭
 
오늘은 이 올리브영 랭킹 정보를 크롤링 해보려 한다. 아래는 전체 코드이다.


1. 전체 코드 
import requests
import pandas as pd
from bs4 import BeautifulSoup

dic = {'user-agent' : 'Mozilla/5.0'}

url = requests.get('https://www.oliveyoung.co.kr/store/main/getBestList.do?dispCatNo=900000100100001&fltDispCatNo=10000010001&pageIdx=1&rowsPerPage=8',headers = dic)
html = BeautifulSoup(url.text)

brand = []
for i in html.find_all('span',class_='tx_brand'):
    brand.append(i.text)

product = []
for i in html.find_all('p',class_='tx_name'):
    product.append(i.text)

price = []
for i in html.find_all('span',class_='tx_cur'):
    price.append(i.find('span',class_='tx_num').text)
    
df = pd.DataFrame({'브랜드':brand, '상품':product,'가격':price})
df
2. 상세 코드

requests와 BeautifulSoup은 둘 다 파이썬을 이용하여 웹 크롤링 및 웹 스크레이핑을 수행할 때 사용되는 라이브러리이다.

  1. requests 라이브러리: requests는 HTTP 요청을 보내고 응답을 받는 작업을 처리하기 위한 라이브러리입니다. 웹 사이트의 데이터를 가져오기 위해 사용됩니다. 주로 웹 페이지의 HTML 코드를 가져오는 역할을 수행합니다. GET 또는 POST와 같은 HTTP 메서드를 사용하여 웹 서버로 요청을 보내고, 서버로부터 받은 응답을 받아서 처리합니다. 이러한 기능을 통해 웹 페이지의 내용을 다운로드하거나, API 엔드포인트로부터 데이터를 가져올 수 있습니다.
  2.  BeautifulSoup 라이브러리: BeautifulSoup은 파이썬의 HTML 및 XML 문서를 파싱하고 검색/조작하기 위한 라이브러리입니다. 주로 웹 페이지의 HTML 코드를 분석하고 원하는 정보를 추출하는 역할을 수행합니다. BeautifulSoup를 사용하여 웹 페이지의 태그, 클래스, 아이디 등을 기반으로 데이터를 필터링하거나 추출할 수 있습니다. 일반적으로, requests를 사용하여 웹 페이지의 내용을 가져온 후에는, 이를 BeautifulSoup로 파싱하여 원하는 정보를 추출하고 처리합니다. 즉, requests로 데이터를 가져오고, 그 후에 BeautifulSoup로 데이터를 다루는 것이 일반적인 크롤링 및 스크레이핑 작업의 흐름입니다.

# brand라는 빈 공간을 만들어 주고, 여기에 태그 정보 확인을 한다. 아래 사진 처럼 span이라는 태그 아래 tx_brand를 입력하면 된다.

brand = []
for i in html.find_all('span',class_='tx_brand'):
    brand.append(i.text)
 
# 상품정보도 위 브래드 정보를 넣는 방법과 유사하게 진행하면 된다.

product = []
for i in html.find_all('p',class_='tx_name'):
    product.append(i.text)
 
#가격 정보는 조금 달랐다. 왼쪽 썸네일에서 보는 것 처럼 할인 전 가격과 할인 후 가격 2개가 존재하였다. 
tag 정보에도 tx_org 아래 tx_num이 할인 전 가격이, tx_cur 아래 tx_num은 할인 후 가격이 나왔다.

price = []
for i in html.find_all('span',class_='tx_cur'):
    price.append(i.find('span',class_='tx_num').text)
 
 
# 데이터 프레임으로 만들기. 크롤링 된 모든 정보를 데이터 프레임으로 만드는 코드는 아래와 같다.
df = pd.DataFrame({'브랜드':brand, '상품':product,'가격':price})
df
 

짧다면 짧고 길다면 긴 파이썬 코드이다. 랭킹 정보를 직접 볼수도 있는데 이러한 파이썬 코드로 원하는 랭킹을 한 번에 볼 수 있는 내용이다. 추가적으로 썸네일 정보도 크롤링 하는 것을 공부 중인데, 공부가 완료되면 추가적으로 올릴 예정이다.

 

크롤링은 유용한 정보를 수집하고 가공하는 강력한 도구이지만, 몇 가지 어려움과 도전이 존재하기도 한다. 웹 사이트 구조의 변경: 웹 사이트는 자주 디자인 및 구조를 변경할 수 있습니다. 이로 인해 크롤러가 작동하지 않을 수 있거나, 이전에 동작하던 코드가 업데이트되어야 원하는 내용을 볼 수 있다. 혹시 그렇게 되면 블로그 내용도 업데이트 하려고 한다.

반응형
Posted by 마르띤
,
반응형

http://www.yes24.com/24/goods/7123016?scode=032&OzSrank=1




어느 기업이든 크고 작은 리스크를 한번씩 경험해 봤을 것이다. 언론에 노출 된 것도 있을 것이며, 소비자의 고발로 인해 정부 처벌도 받았을 것이고, 발생은 하지 않았지만 내부 임직원들은 알고 있는 잠재 리스크도 있을 것이고. 


이 책은 위기 관리 컨설팅사인 스트래티지샐러드의 대표 컨설턴트 겸 CEO인 정용민님이 쓴 책으로, 가상인물을 내세운 소설 형태의 일화 위주로 내용을 쓰고 있다.


현대캐피탈 고객 정보 해킹, 한진해운 소말리아 해적 납치, 식중독 유발 성분이 검출된 매일 유업, 채선당의 임산부 폭행, TV 고발 프로에 노출된 웅진코웨이의 실제 사례도 언급하면서 현실성도 더 하였다.


가끔은 과할 정도로 이런 리스크도 있나? 생각도 들지만, 리스크는 결국 발생 했을 때 어떻게 신속하게 대응하고 또 재발을 막기 위한 예방 체계를 짜는 것이니 이런 사례가 만약 우리 회사에 발생한다면이라는 전제하에 고민해볼 만 문제이다.


저자가 말한 위기 관리 시스템 구축 방안

 1. 전 직원들을 대상으로 예상할 수 있는 위기 예측

 2. 예측된 위기를 발생 빈도와 발생 시 위해도를 기준으로배열

 3. 가장 고위험군에 든 예측된 위기를 하나씩 들여다 봄

 4. 고위험군 위기를 관련 부서에 각각 할당해 나누어 줌

 5. 각 부서에 해당 위기의 예방 및 관리 방안을 제출

 6. 부서에서 받은 위기 관리 방안을 잘 결합


그 외 기업이 리스크 관리를 잘 운영하기 위한 몇 가지 방안으로 아래와 같은 방법을 고민해 볼 만하다.

1. CEO를 포함한 전사 임직원의 미디어 트레이닝

2. 매뉴얼은 구축하되 현실성 있게 업데이트

3. 위기 관리 TFT의 운영과 긴급 사건 대비 시나리오 구축

4. M&A같이 침묵해야할 이슈가 있고, 리콜같이 정직하게 대응해야 할 이슈 구분

5. 위기 관리는 홍보팀 혼자 하는 것이 아니라 전사의 협업이 필요하고 경영진의 관심과 지지가 필요


그리고 너무 위기 관리를 잘 해버리면 관련 부서 아마 CPR 등 홍보팀의 필요성을 못 느끼기 때문에, 리스크가 발생되어 어느정도 진행될 때 긴급 투수로 투입되어야지 홍보팀의 소중함을 안다는 이야기는 리스크 관리 부서의 고충을 잘 말 해준다.


저자 홈페이지: www.jameschung.kr

저자가 쓴 책 목록: www.jameschung.kr/books

반응형
Posted by 마르띤
,
반응형



1. 자료 가져오기 

> setwd(choose.dir()) #대화형으로 폴더를 지정할 수 있음

> getwd()

[1] "C:/Users/amore/Documents/FOR ME/Data Scientist/KNOU/2017년 2학기/고급R활용"

> setwd("C:/Users/amore/Documents/FOR ME/Data Scientist/KNOU/2017년 2학기/고급R활용")

> getwd()

[1] "C:/Users/amore/Documents/FOR ME/Data Scientist/KNOU/2017년 2학기/고급R활용"

> savehistory(file='mywork.Rhistory')

> history()

> history(max.show=10)




2. 다양한 형태의 자료 가져오기

> insurance.data2 = read.table('insurance2.txt', header=T)

> insurance.data2[c(15:16),]

   id sex job religion edu amount salary

15 15   m  -9        3   4      6    110

16 16   f   1        3  -9      7     88


#-9를 NA로 설정

> insurance.data2 = read.table('insurance2.txt', header=T, na.strings = '-9')

> insurance.data2[c(15:16),]

   id sex job religion edu amount salary

15 15   m  NA        3   4      6    110

16 16   f   1        3  NA      7     88

> csv.data = read.csv('csv.txt',header=T) #구분자가 콤마

> tab.data = read.table('tab.txt', header=T,sep='\t') #구분자가 탭

> write.table(tab.data, file='C:/Rwork/tab.txt') #Rwork 폴더에 저장


#고정형식 텍스트 파일 읽기 

> fwf.data = read.fwf('insurance3.txt',

+                     widths=c(2,2,3,3,3,6,6),

+                     col.names=c('id','sex','job','religion','edu','amount','salary'))

> fwf.data[fwf.data$job==-9, 'job']=NA

> fwf.data[fwf.data$edu==-9, 'edu']=NA

> fwf.data[fwf.data$salary==-9, 'salary']=NA

> head(fwf.data)

  id sex job religion edu amount salary

1  1   m   1        1   3    7.0    110

2  2   m   2        1   4   12.0    135

3  3   f   2        3   5    8.5    127

4  4   f   3        3   5    5.0    150

5  5   m   1        3   3    4.5    113

6  6   m   2        1   2    3.5     95


> fwf2.data = read.fwf('insurance3.txt',

+                     widths=c(2,-2,-3,3,3,6,6),

+                     col.names=c('id','religion','edu','amount','salary'))

> head(fwf2.data)

  id religion edu amount salary

1  1        1   3    7.0    110

2  2        1   4   12.0    135

3  3        3   5    8.5    127

4  4        3   5    5.0    150

5  5        3   3    4.5    113

6  6        1   2    3.5     95





3. 통계 패키지 자료 가져오기

> library(foreign) #spss 파일

> ex1 = read.spss('ex1-1.sav',

+                 to.data.frame=T, use.value.labels = T)

Warning message:

In read.spss("ex1-1.sav", to.data.frame = T, use.value.labels = T) :

  ex1-1.sav: Unrecognized record type 7, subtype 18 encountered in system file

> ex1

  shock response count

1   yes      yes    25

2   yes       no    19

3    no      yes    31

4    no       no   141

> dim(ex1)

[1] 4 3

> mouse.data = ex1[rep(1:nrow(ex1),ex1$count),] #가중치

> head(mouse.data)

    shock response count

1     yes      yes    25

1.1   yes      yes    25

1.2   yes      yes    25

1.3   yes      yes    25

1.4   yes      yes    25

1.5   yes      yes    25

> dim(mouse.data)

[1] 216   3

> mouse.table=table(mouse.data$shock,mouse.data$response)

> mouse.table

     

      yes  no

  yes  25  19

  no   31 141

> summary(mouse.table)

Number of cases in table: 216 

Number of factors: 2 

Test for independence of all factors:

Chisq = 27.458, df = 1, p-value = 1.605e-07


 - 카이제곱 = 27.458 , p - value = 1.6 X 10마이너스 7승. 자극과 반응간의 유의한 관계가 있음.




4. RData 저장 및 가져오기

> save(ex1, file='c:/Rwork/ex1.Rdata')

> rm(ex1)

> load('C:/Rwork/ex1.Rdata')

> ex1

  shock response count

1   yes      yes    25

2   yes       no    19

3    no      yes    31

4    no       no   141

> load(file=file.choose()) #대화








참고문헌: 

[1] 고급 R 활용 (심송용, 이윤동, 이은경, 김성수 공저, KNOU PRESS)


반응형
Posted by 마르띤
,