본문 바로가기
Log/Trouble shoot

Selenium_객체 변환 누락으로 인한 웹사이트 방문 문제

by RIEM 2023. 3. 29.

Time: 2023-03-29 20:26
doc-id : tsl-management-v1.2- 20230329

Problem

Selenium으로 크롤링을 하던 중 메인 페이지에서 추출한 게시글의 url들을 driver.get()으로 방문을 하려는데, 정상적으로 진행이 안되는 문제가 발생했다.

Cause

Selenium 객체에서 href 어트리뷰트 추출하지 않아서 발생한 문제다.

# Selenium version 3.141.0
# pip install selenium==3.141.0

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import time
import os

...

# 🦉 Listening Stage ----------------------------------------

# Infinite Scroll until touch down to the bottom
last_height = driver.execute_script("return document.body.scrollHeight")
scrolling = True

# while scrolling:

for x in range(3):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    print('🦉 Moved to next scroll')
    time.sleep(3)
    new_height = driver.execute_script("return document.body.scrollHeight")

    if new_height == last_height:
        scrolling = False
        break
    else:
        last_height = new_height

# url_resources = driver.find_elements_by_xpath("//a[contains(@href, '/companies-to-app')]")
# Get all urls from main page
url_resources = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//a[contains(@href, '/companies-to-app')]")))
print(url_resources)
print('🦉 All urls are extracted')


#... [<selenium.webdriver.remote.webelement.WebElement (session="cdc031942cee967dd13c1e0a1b0d31bb", element="591d46e9-4bd0-4e10-8aac-f1cbd194d845")>, <selenium.webdriver.remote.webelement.WebElement (session="cdc031942cee967dd13c1e0a1b0d31bb", element="e3a0c398-eff0-4c50-bd99-627ffad6dea5")>, <selenium.webdriver.remote.webelement.WebElement (session="cdc031942cee967dd13c1e0a1b0d31bb", element="7104b4bf-e44b-4357-89dc-254e1e84261e")>, ...

Solution

...

# url_resources = driver.find_elements_by_xpath("//a[contains(@href, '/companies-to-app')]")
# Get all urls from main page

url_resources = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//a[contains(@href, '/companies-to-app')]")))
url_list = [url.get_attribute('href') for url in url_resources]
print(url_list)
print('🦉 All urls are extracted')
...

url_resources는 Selenium의 인스턴스인 것으로 보인다. 여기에서 href 정보를 get_attribute() 메소드로 추출해주는 작업을 해준 뒤 list로 만들어야 정상적으로 link를 뽑을 수 있다.

Insight

Related articles

댓글