2022.5.23 crawling

정성우·2022년 5월 23일
0

학습한 내용

#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("완료")

실행결과

학습한 내용 중 어려웠던 점 또는 해결못한 것들
크롤링이후 대량의 이미지와 글을 어떻게 정제할까

해결방법 작성
일단 노가다

학습 소감
인터넷에서 데이터를 긁어오는게 재미있었다.
하지만 이 데이터를 정제해서 쓸 수 있게하려면 굉장히 어려울것같다.

0개의 댓글