컴퓨터/Python
지난 실습에 이어서 번개장터에서 selenium을 통해 크롤링을 진행했습니다. 이 정보들을 그냥 출력을 해서 사용하는 것은 크롤러가 대신해서 정보를 구해와서 얻어오기는 하지만, 정보들을 효율적으로 사용하는 데에는 한계가 있습니다.
본문에서는 Pandas를 이용해 데이터를 정제하기 위한 과정을 준비해 보도록 하겠습니다.
Python - [크롤링 실습] selenium으로 번개장터 조회하기 2 (페이지 순환)
서론 지난 포스트에서는 단순하게 번개장터에서 검색 후 데이터를 취득하는 과정을 가지고 왔습니다. 단순히 처음 검색해서 나온 결과의 페이지에서만 데이터를 취득했습니다. 본문에서는 많
blog-of-gon.tistory.com
Python - [Pandas]자료 분석을 위한 Pandas 기초
서론 Python을 이용하여 어떠한 데이터를 처리하는 과정에서 기본적으로 제공하는 리스트나, 딕셔너리등으 자료구조만으로는 생각보다 한계점이 많습니다. 조금 더 손쉽게 데이터를 다루기 위
blog-of-gon.tistory.com
우선 지난 실습시간에 진행했던 결과물을 살펴보면, 객체지향적인 소스코드가 아닌 단순히 의식의 흐름대로 진행되는 소스코드 였습니다.
아마, 이 실습은 계속해서 이런식으로 소스코드를 작성하고 수정할 듯싶습니다.
각설하고, 소스코드의 흐름을 살펴보면 다음과 같이 정리할 수 있습니다.
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