🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    업무 자동화

  • 해결 여부

    미해결

제품 링크를 타고 들어가야 원하는 정보가 나오는 사이트

24.05.24 23:42 작성 24.05.24 23:44 수정 조회수 99

0

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# from selenium.webdriver.chrome.service import Service
# from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import requests
from bs4 import BeautifulSoup
import time

options = Options()

user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

options.add_argument(f"user-agent={user_agent}")

options.add_experimental_option("detach", True)

driver = webdriver.Chrome(options=options)

url = "https://kream.co.kr/search?shop_category_id=34"

driver.get(url)
time.sleep(2)

for i in range(1):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    time.sleep(2)

html = driver.page_source

soup = BeautifulSoup(html, "html.parser")

items = soup.select(".product_card")

for item in items:
    brand = item.select_one(".product_info_brand.brand")
    name = item.select_one(".translated_name")
    link = item.select_one(".item_inner").attrs['href']

    click = name.text
    driver.find_element(By.PARTIAL_LINK_TEXT, click).send_keys(Keys.CONTROL+Keys.ENTER)
    time.sleep(1)

    driver.switch_to.window(driver.window_handles[-1])

    html = driver.page_source

    soup2 = BeautifulSoup(html, "html.parser")

    model_num = soup2.select_one("div:nth-child(3) > div.product_info")

    print(brand.text.strip())
    print(name.text)
    print(model_num.text.strip())
    print(f"https://kream.co.kr{link}")
    print()
       
    driver.close()
    driver.switch_to.window(driver.window_handles[0])

 

아무것도 모르는 상태에서 시작했는데 좋은 강의 올려주신 덕분에 크롤링을 조금이나마 맛보게 된 것 같습니다.

 

어설프게나마 완성은 한거 같은데 궁금한게 있어서 질문 남깁니다.

상품 링크를 타고 들어가야 원하는 정보를 긁어올 수 있는 사이트인데, 자바스크립트로 동작하게끔 되어 있습니다.

시행착오 끝에 셀레니움으로 동작을 시켜봤는데

제품 하나하나마다 새창을 열어서 정보를 가져온 후에 창을 닫고.. 다시 새창을 열어서 정보를 가져온 후에 창을 닫고..

하다보니 시간도 너무 오래 걸리고 이렇게 하는게 맞는 건지 의구심이 듭니다.

어떻게 해야 속도를 높힐 수 있을까요?

 

 

 

답변 2

·

답변을 작성해보세요.

0

link_list = []
for item in items:

반복문이 시작하기 전에 link_list = []

이런식으로 빈 리스트를 만들어놓고

반복문안에서

link = item.select_one(".item_inner").attrs['href'] 이 코드 아래에

link_list.append(f"https://kream.co.kr{link}") 이런식으로 코드를 추가해서 link_list에 모든 링크를 담습니다.

그다음 그 리스트를 반복문으로 돌리면 됩니다.

for url in link_list:

driver.get(url)

cdi2201님의 프로필

cdi2201

질문자

2024.05.30

말씀대로 하니 처리속도가 빨라졌네요. ㅎㅎ

셀레니움에서는 무조건 클릭해서 이동하는 방법만 생각했었는데 생각이 짧았습니다.

답변 주셔서 감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.05.24

안녕하세요, 인프런 AI 인턴입니다.

cdi2201님의 상황을 고려했을 때, 링크를 타고 들어가 정보를 수집하는 방식에서 속도를 향상시키고자 하실 때 고려할 수 있는 몇 가지 방법이 있습니다.

  1. 병렬 처리: 각 페이지를 병렬로 처리하여 정보를 수집하는 방법입니다. Python에서는 threading 또는 concurrent.futures 모듈을 사용하여 여러 사이트에 대한 웹 크롤링을 동시에 수행할 수 있습니다. 이 방법은 각 페이지 처리 시간이 길 때 유용합니다.

  2. 셀레니움 옵션 최적화: 셀레니움 작업에서 더 빠른 페이지 로딩을 위해 필요 없는 이미지나 자바스크립트 로딩을 차단할 수 있습니다. 예를 들어, 셀레니움 Chrome 옵션에 --blink-settings=imagesEnabled=false를 추가하여 이미지 로딩을 끄거나, --disable-javascript으로 자바스크립트를 비활성화하는 것입니다. 단, 일부 사이트 기능은 자바스크립트에 의존하기 때문에 이 방법이 항상 적합하지는 않습니다.

  3. 헤드리스 모드 사용: 셀레니움을 헤드리스 모드로 실행하여 브라우저 UI를 렌더링하지 않고 작업을 수행하면 속도를 향상시킬 수 있습니다. options.add_argument("--headless")를 코드에 추가하여 활용해 볼 수 있습니다.

비슷한 상황에 대한 질문이 여러 개 있어서래 두 가지 유사 질문 링크를 남깁니다. 직접적인 답변이나 해결책이 될 수는 없지만, 방법론적인 아이디어를 제공할 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

채널톡 아이콘