컴퓨터/Python
이제 크롤링 실습의 마지막입니다.
이 시리즈 포스트의 목적은 Python을 통해서 간단하게 크롤러와 유사한 기능을 구현하며 예제로서 참고하기 위해서 작성했습니다. 그래서 이 이상 소스코드가 길어진다면, 너무 비효율적이고 점점 광범위해 지기 때문에 추우에 프로젝트의 개념으로 다시 다루도록 하겠습니다.
자 어찌 됐든 이제 해당 소스코드에 약간의 구조화를 거친 다음 몇 가지 질의를 통해 결과물을 얻어보면서 이 시리즈를 마무리하도록 하겠습니다.
사실 크롤러(Selenium)이 동작하는 과정을 볼 필요가 없습니다 따라서, 백그라운드에서 구동하기 위해서 옵션을 설정하도록 하겠습니다.
#Selenium 구동
# 크롤링 옵션 생성
options = webdriver.ChromeOptions()
# 백그라운드 실행 옵션 추가
options.add_argument("headless")
크롤링이 완료되었다면 이제 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("정확한 값을 입력해주세요.")
Python - Numpy를 배우기 전 ( 정의, 사용하는 이유 ) (0) | 2023.02.08 |
---|---|
Python - 파이썬과 아나콘다 그리고 가상환경 (0) | 2022.11.09 |
Python -[Pandas] 조건 검색하기 (query함수) (0) | 2022.08.13 |
Python - [크롤링 실습] selenium으로 번개장터 조회하기 4 (엑셀로 출력 및 데이터 조회하기) (0) | 2022.08.03 |
Python - [크롤링 실습] selenium으로 번개장터 조회하기 3 (Pandas로 정제) (0) | 2022.08.02 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet