Python - [크롤링 실습] selenium으로 번개장터 조회하기 3 (Pandas로 정제)

컴퓨터/Python

728x90
반응형

서론

지난 실습에 이어서 번개장터에서 selenium을 통해 크롤링을 진행했습니다. 이 정보들을 그냥 출력을 해서 사용하는 것은 크롤러가 대신해서 정보를 구해와서 얻어오기는 하지만, 정보들을 효율적으로 사용하는 데에는 한계가 있습니다.

본문에서는 Pandas를 이용해 데이터를 정제하기 위한 과정을 준비해 보도록 하겠습니다.

 

 

Python - [크롤링 실습] selenium으로 번개장터 조회하기 2 (페이지 순환)

서론 지난 포스트에서는 단순하게 번개장터에서 검색 후 데이터를 취득하는 과정을 가지고 왔습니다. 단순히 처음 검색해서 나온 결과의 페이지에서만 데이터를 취득했습니다. 본문에서는 많

blog-of-gon.tistory.com

 

 

Python - [Pandas]자료 분석을 위한 Pandas 기초

서론 Python을 이용하여 어떠한 데이터를 처리하는 과정에서 기본적으로 제공하는 리스트나, 딕셔너리등으 자료구조만으로는 생각보다 한계점이 많습니다.  조금 더 손쉽게 데이터를 다루기 위

blog-of-gon.tistory.com

 

지난 소스코드 분석

우선 지난 실습시간에 진행했던 결과물을 살펴보면, 객체지향적인 소스코드가 아닌 단순히 의식의 흐름대로 진행되는 소스코드 였습니다. 

아마, 이 실습은 계속해서 이런식으로 소스코드를 작성하고 수정할 듯싶습니다.

 

각설하고, 소스코드의 흐름을 살펴보면 다음과 같이 정리할 수 있습니다.

  • 셀레늄을 구동시킨다.
  • 특정 페이지에 방문하고 원하는 페이지의 소스를 취득한다.
  • 취득한 소스코드에서 필요한 부분을 받아 출력한다.

Pandas를 이용해서 데이터를 정제하기 위해서는 어떻게 해야 될까요?

출력하는 부분을 Pandas에 입력하기만 하면 될 것입니다.

 

  • 셀레늄을 구동시킨다.
  • 특정 페이지에 방문하고 원하는 페이지의 소스를 취득한다.
  • 취득한 소스코드에서 필요한 부분을 받아 Pandas에 정리한다.
#탐색중 혹시모를 error 처리 (Pandas로 수정될 부분)
        try:
            print("제목 : ", infor[0])
            print("가격 : ", infor[1])
            if infor[2] is None:
                infor[2] = "미 확인"
            print("시간 : ", infor[2])
            print("위치 : ", Location)
            print("링크 : ", "https://m.bunjang.co.kr{}".format(aTag.attrs['href']))
            st = item.parent.parent.get_text(separator=';;;')

            #판매 가능 여부 확인
            status = aTag.find(attrs={'alt': '판매 불가 아이콘'})
            if status is not None:
                status = status.parent.get_text()
            else:
                status = "판매 중"
            print("상태 : ",status)
        except:
            print("error!!")

전체적인 소스코드

더보기
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.ui import WebDriverWait
from bs4 import BeautifulSoup

#Selenium 구동
browser = webdriver.Chrome()
browser.implicitly_wait(time_to_wait=10)
browser.get('https://m.bunjang.co.kr/')

#검색 입력
itemname = input("검색어 입력 : ")

#페이지 순환을 위한 준비 및 Get요청 쿼리
page = 1
url = "https://m.bunjang.co.kr/search/products?order=score&page={}&q={}".format(page,itemname)

#페이지 순환
while True:
    url = "https://m.bunjang.co.kr/search/products?order=score&page={}&q={}".format(page, itemname)
    browser.get(url)
    print("*************",page,"번 Page**********************")
    # wating
    WebDriverWait(browser, 10).until(expected_conditions.visibility_of_element_located((By.CLASS_NAME, "app")))
    # html parsing
    html = browser.page_source
    html_parser = BeautifulSoup(html, features="html.parser")
    list = html_parser.find_all(attrs={'alt': '상품 이미지'})

    if list.__len__() == 0 :
        break

#페이지당 모든 아이템 탐색
    for item in list:
        aTag = item.parent.parent
        for i,c  in enumerate(aTag.children,0):
            if i == 1 :
                infor = c.get_text(separator=';;;')
                infor = infor.split(sep=';;;')
            if i == 2 :
                Location = c.get_text()
#탐색중 혹시모를 error 처리 (Pandas로 수정될 부분)
        try:
            print("제목 : ", infor[0])
            print("가격 : ", infor[1])
            if infor[2] is None:
                infor[2] = "미 확인"
            print("시간 : ", infor[2])
            print("위치 : ", Location)
            print("링크 : ", "https://m.bunjang.co.kr{}".format(aTag.attrs['href']))
            st = item.parent.parent.get_text(separator=';;;')

            #판매 가능 여부 확인
            status = aTag.find(attrs={'alt': '판매 불가 아이콘'})
            if status is not None:
                status = status.parent.get_text()
            else:
                status = "판매 중"
            print("상태 : ",status)
        except:
            print("error!!")
    page = page+1

우선 List에 데이터를 저장하자

출력을 하던  부분을 조금 수정하여, List의 형태로 저장하도록 합시다.

 

우선 상단에 정보를 저장해  둘 List를 선언해  두도록 합시다.

#정보를 저장할 list 생성해두기
Subject = []
Price = []
Date = []
Location = []
Link = []
Status = []

이후 출력되는 부분을  List에 담아보도록 하죠.

#탐색중 혹시모를 error 처리 (Pandas로 수정될 부분)
        try:
            Subject.append(infor[0])  #print("제목 : ", infor[0])
            Price.append(infor[1])  #print("가격 : ", infor[1])
            if infor[2] is None:
                infor[2] = "미 확인"
            Date.append(infor[2])#print("시간 : ", infor[2])
            Location.append(location)#print("위치 : ", Location)
            Link.append("https://m.bunjang.co.kr{}".format(aTag.attrs['href'])) #print("링크 : ", "https://m.bunjang.co.kr{}".format(aTag.attrs['href']))
            st = item.parent.parent.get_text(separator=';;;')
            #판매 가능 여부 확인
            status = aTag.find(attrs={'alt': '판매 불가 아이콘'})
            if status is not None:
                status = status.parent.get_text()
            else:
                status = "판매 중"
            Status.append(status)#print("상태 : ",status)
        except:
            pass
    page = page+1

 

Pandas 사용하여 데이터 정리하기

우선 Pandas 라이브러리를 설치해주고 라이브러리를 사용하기 위해 import 해주도록 합시다.

import pandas as ps

이후 DataFrame을 이용해서 데이터를 Pandas에 집어넣어보도록 합시다.

#pandas를 이용해서 데이터 정리하기
Datas = {
    "제목" : Subject,
    "가격" : Price,
    "등록일시" : Date,
    "위치" : Location,
    "상태" : Status
}
DataTable = ps.DataFrame(Datas)

 

동작 및 구현 확인

생각대로 Pandas에 잘 넣어서 출력을 하는지 살펴보도록 합시다. 

본 예시는 모든 페이지 순환을 하지 않고 첫 번째 페이지만 순환했습니다.

 

 

생각처럼 Pandas DataFrame 객체에 성공적으로 정보를 담았습니다.

자, 이제 크롤러에서 수집한 데이터를 단순히 출력하는 것이 아닌 정제하여 효율적으로 쓸 수 있는 첫 번째 준비가 완료됐습니다.

다음 포스트에서는 이 데이터를 분석하는 몇 가지 방법에 대해서 알아보고 실습해보도록 합시다.

 

전체 소스코드 보기

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.ui import WebDriverWait
from bs4 import BeautifulSoup
import pandas as ps

#정보를 저장할 list 생성해두기
Subject = []
Price = []
Date = []
Location = []
Link = []
Status = []


#Selenium 구동
browser = webdriver.Chrome()
browser.implicitly_wait(time_to_wait=10)
browser.get('https://m.bunjang.co.kr/')

#검색 입력
itemname = input("검색어 입력 : ")

#페이지 순환을 위한 준비 및 Get요청 쿼리
page = 1
url = "https://m.bunjang.co.kr/search/products?order=score&page={}&q={}".format(page,itemname)

#페이지 순환
while True:
    url = "https://m.bunjang.co.kr/search/products?order=score&page={}&q={}".format(page, itemname)
    browser.get(url)
    #print("*************",page,"번 Page**********************")
    # wating
    WebDriverWait(browser, 10).until(expected_conditions.visibility_of_element_located((By.CLASS_NAME, "app")))
    # html parsing
    html = browser.page_source
    html_parser = BeautifulSoup(html, features="html.parser")
    list = html_parser.find_all(attrs={'alt': '상품 이미지'})

    #if list.__len__() == 0 :
    #    break
    if page == 2 :
        break
#페이지당 모든 아이템 탐색
    for item in list:
        aTag = item.parent.parent
        for i,c  in enumerate(aTag.children,0):
            if i == 1 :
                infor = c.get_text(separator=';;;')
                infor = infor.split(sep=';;;')
            if i == 2 :
                location = c.get_text()
#탐색중 혹시모를 error 처리 (Pandas로 수정될 부분)
        try:
            Subject.append(infor[0])  #print("제목 : ", infor[0])
            Price.append(infor[1])  #print("가격 : ", infor[1])
            if infor[2] is None:
                infor[2] = "미 확인"
            Date.append(infor[2])#print("시간 : ", infor[2])
            Location.append(location)#print("위치 : ", Location)
            Link.append("https://m.bunjang.co.kr{}".format(aTag.attrs['href'])) #print("링크 : ", "https://m.bunjang.co.kr{}".format(aTag.attrs['href']))
            st = item.parent.parent.get_text(separator=';;;')
            #판매 가능 여부 확인
            status = aTag.find(attrs={'alt': '판매 불가 아이콘'})
            if status is not None:
                status = status.parent.get_text()
            else:
                status = "판매 중"
            Status.append(status)#print("상태 : ",status)
        except:
            pass
    page = page+1

#pandas를 이용해서 데이터 정리하기
Datas = {
    "제목" : Subject,
    "가격" : Price,
    "등록일시" : Date,
    "위치" : Location,
    "링크" : Link,
    "상태" : Status
}
DataTable = ps.DataFrame(Datas)

print(DataTable)
728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :