학습한 내용
#BeautifulSoup :웹페이지의 정보를 쉽게 스크랩 할 수 있도록 기능을 제공
from dataclasses import dataclass
from selenium import webdriver
from bs4 import BeautifulSoup as bs
import time
import pandas as pd
search_keyword='메론','라면','쥐포'
for i in search_keyword:
#chromedriver 이용
driver=webdriver.Chrome('./chromedriver.exe')
driver.implicitly_wait(3)
time.sleep(5)
#사이트 접속
driver.get("http://www.gmarket.co.kr/")
time.sleep(5)
#검색창에 키워드 입력
#개발자도구(f12)에서 위치찾고 copy xpath
driver.find_element_by_xpath("//*[@id='skip-navigation-search']/span/input").send_keys(i)
time.sleep(2)
#버튼클릭
driver.find_element_by_xpath("//*[@id='skip-navigation-search']/span/button").click()
# 상품 리스트 정보 가져오기 (묶인태그, class명 찾아야됌)
html=driver.page_source
soup=bs(html,'html.parser')
itemlist = soup.findAll('div',{"class": "box__item-container"})
time.sleep(5)
# 가져온 상품리스트에서 필요한 상품명, 가격, 상품링크를 출력
data={'상품명':[],'가격':[],'상품링크':[]}
for item in itemlist :
title = item.find("span", {"class": "text__item"}).text
price = item.find("strong", {"class": "text text__value"}).text
link = item.find("span", {"class": "text__item-title text__item-title--ellipsis"}).a['href']
data['상품명'].append(title)
data['가격'].append(price)
data['상품링크'].append(link)
time.sleep(3)
#csv 저장
data=pd.DataFrame(data)
data.to_csv(f'{i}.csv',index=False)
driver.close()
실행결과
학습한 내용
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
import pandas as pd
import os
from urllib.request import (urlopen, urlparse, urlretrieve)
# 구글 이미지 URL
chrome_path = "./chromedriver.exe"
base_url = "https://www.google.co.kr/imghp"
# 구글 검색 옵션
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("lang=ko_KR")# 한국어
chrome_options.add_argument("window-size=1920x1080")
def selenium_scroll_option() :
SCROLL_PAUSE_SEC = 1
# 현재 스크롤 높이 가져옴
last_height = driver.execute_script(
"return document.body.scrollHeight")
while True :
# 스크롤 다운 반복
driver.execute_script(
"window.scrollTo(0, document.body.scrollHeight);")
time.sleep(SCROLL_PAUSE_SEC)
# 스크롤 다운 후 스크롤 높이 다시 가져옴
new_height = driver.execute_script(
"return document.body.scrollHeight")
# 같으면 break (다 내렸을 때)
if new_height == last_height :
break
last_height = new_height
# 검색할 자료명과 이미지저장할 이름
a = "상어",'돌고래','고래'
image_name = "shark",'dolphin','whale'
for i in range(0,3):
driver = webdriver.Chrome(chrome_path)
driver.get("http://www.google.co.kr/imghp?hl=ko")
browser = driver.find_element_by_name('q')
browser.send_keys(a[i])
browser.send_keys(Keys.RETURN)
selenium_scroll_option()
driver.find_element_by_xpath(
'//*[@id="islmp"]/div/div/div/div[1]/div[2]/div[2]/input').click()
selenium_scroll_option()
#스크롤내리기 검색결과 더보기버튼 클릭후 한번더 스크롤내리기
# 이미지 저장 src 요소를 리스트업 해서 이미지 url 저장
image = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
# 클래스 네임에서 공백은 . 을 찍어줌
image_url = []
for j in image:
if j.get_attribute("src") != None :
image_url.append(j.get_attribute("src"))
else :
image_url.append(j.get_attribute("data-src"))
#url이 들어가는 클래스는 src, data-src 두가지
# 전체 이미지 개수
print(f"전체 다운로드한 이미지 개수 : {len(image_url)}")
image_url = pd.DataFrame(image_url)[0].unique()
# 해당하는 파일에 이미지 다운로드
os.makedirs(f"./{image_name[i]}", exist_ok=True)
for t, url in enumerate(image_url, 0) :
print(t)
print(url)
urlretrieve(url, f"./{image_name[i]}/" + image_name[i] + "_" + str(t) + ".png")
driver.close()
print("완료")
실행결과
학습한 내용 중 어려웠던 점 또는 해결못한 것들
크롤링이후 대량의 이미지와 글을 어떻게 정제할까
해결방법 작성
일단 노가다
학습 소감
인터넷에서 데이터를 긁어오는게 재미있었다.
하지만 이 데이터를 정제해서 쓸 수 있게하려면 굉장히 어려울것같다.