컴퓨터/Python
지난 실습에 이어서 번개장터에서 selenium을 통해 크롤링을 진행했습니다. 이 정보들을 그냥 출력을 해서 사용하는 것은 크롤러가 대신해서 정보를 구해와서 얻어오기는 하지만, 정보들을 효율적으로 사용하는 데에는 한계가 있습니다.
본문에서는 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 생성해두기
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 라이브러리를 설치해주고 라이브러리를 사용하기 위해 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)
Python -[Pandas] 조건 검색하기 (query함수) (0) | 2022.08.13 |
---|---|
Python - [크롤링 실습] selenium으로 번개장터 조회하기 4 (엑셀로 출력 및 데이터 조회하기) (0) | 2022.08.03 |
Python - [Pandas]자료 분석을 위한 Pandas 기초 (0) | 2022.08.01 |
Python - [크롤링 실습] selenium으로 번개장터 조회하기 2 (페이지 순환) (0) | 2022.07.07 |
Python - [크롤링 실습] selenium으로 번개장터 조회하기 1 (접속,검색,취득) (0) | 2022.07.02 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet