Python - [크롤링 실습]seleniu으로 번개장터 조회하기5 (몇가지 질의 해보기)

컴퓨터/Python

728x90
반응형

서론

이제 크롤링 실습의 마지막입니다.

이 시리즈 포스트의 목적은 Python을 통해서 간단하게 크롤러와 유사한 기능을 구현하며 예제로서 참고하기 위해서 작성했습니다. 그래서 이 이상 소스코드가 길어진다면, 너무 비효율적이고 점점 광범위해 지기 때문에 추우에 프로젝트의 개념으로 다시 다루도록 하겠습니다.

 

자 어찌 됐든 이제 해당 소스코드에 약간의 구조화를 거친 다음 몇 가지 질의를 통해 결과물을 얻어보면서 이 시리즈를 마무리하도록 하겠습니다.

 

 

 

Python - [크롤링 실습] selenium으로 번개장터 조회하기 4 (엑셀로 출력 및 데이터 조회하기)

서론 지난 포스트에서 Pandas에 데이터를 넣어보았습니다. 이제 Pandas를 통해서 정리된 데이터를 효율적으로 사용하는 방법에 대해서 알아봅시다. 본문에서는 Pandas의 몇 가지 기능을 알아보도록

blog-of-gon.tistory.com

 

크롤러 백그라운드 구동

사실 크롤러(Selenium)이 동작하는 과정을 볼 필요가 없습니다 따라서, 백그라운드에서 구동하기 위해서 옵션을 설정하도록 하겠습니다.

#Selenium 구동
# 크롤링 옵션 생성
options = webdriver.ChromeOptions()
# 백그라운드 실행 옵션 추가
options.add_argument("headless")

 

크롤링 후 Data 검색

크롤링이 완료되었다면 이제 Pandas에 저장한 데이터를 가지고 결과를 얻어와야 됩니다.

간단하게 반복문으로 형태를 만들어 보도록 하겠습니다.

while True:
    print("최저가격: ", MinPrice,"원")
    print("최대가격: ", MaxPrice,"원")
    print("평균가격: ", AvgPrice,"원")
    menuinput = input("1.가격대 상품 전체보기 \n2.엑셀로 저장하기\n3.종료\n입력해주세요:")
    menuinput = int(menuinput)
    if menuinput == 1:
        costlevel = int(input("검색할 최대 가격을 입력하세요 :"))
        query = "가격 <= @costlevel"
        print(DataTable.query(query))
    elif menuinput == 2 :
        DataTable.to_excel("Datas.xlsx")
        print("엑셀로 저장 하였습니다.")
    elif menuinput == 3 :
        break
    else :
        print("정확한 값을 입력해주세요.")

 

전체 소스코드

이제 여태까지 실습했던 소스코드를 살펴보고 구동해 봅시다.

여기서 조금 더 여러갖지 기능을 추가한다면 조금 더 그럴듯한 동작이 될 수 있습니다.

 

참고로 해당 소스코드는 2개의 페이지만을 순환합니다.!

 

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 구동
# 크롤링 옵션 생성
options = webdriver.ChromeOptions()
# 백그라운드 실행 옵션 추가
options.add_argument("headless")

browser = webdriver.Chrome(chrome_options= options)
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)

#가격란의 문자열 데이터를 숫자로 변경하기
DataTable["가격"] = ps.to_numeric(DataTable["가격"].str.replace(",",""))

MinPrice = DataTable['가격'].min()
MaxPrice = DataTable['가격'].max()
AvgPrice = DataTable['가격'].mean()

while True:
    print("최저가격: ", MinPrice,"원")
    print("최대가격: ", MaxPrice,"원")
    print("평균가격: ", AvgPrice,"원")
    menuinput = input("1.가격대 상품 전체보기 \n2.엑셀로 저장하기\n3.종료\n입력해주세요:")
    menuinput = int(menuinput)
    if menuinput == 1:
        costlevel = int(input("검색할 최대 가격을 입력하세요 :"))
        query = "가격 <= @costlevel"
        print(DataTable.query(query))
    elif menuinput == 2 :
        DataTable.to_excel("Datas.xlsx")
        print("엑셀로 저장 하였습니다.")
    elif menuinput == 3 :
        break
    else :
        print("정확한 값을 입력해주세요.")
728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

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

TODAY :

YESTER DAY :

TOTAL :