개요
- 23.09.13.~23.09.16. 간 독일에서 진행되는 레하케어 박람회 참가업체(737개) 정보 크롤링
- 참가업체목록 url로 접근 후 shadow-dom 구조로 된 accept 버튼 클릭해줘야함
- shadow host에 먼저 접근한뒤, shadow root 설정 후 선택자에 접근해줘야함.
- 여러 선택자 다 접근해보고, 마우스도 이동시켜보고, send key로도 해보면서 해매다 html 뜯어보고 구글링해서 발견...
- 스크롤을 100회 자동 설정
- 목록에서 추출 가능한 정보 추출 (기업명, 위치, 업체별 url)
- 업체별 url을 for문으로 돌려서 개별 기업정보 추출
- 처음 창 띄우고 accept 버튼 클릭시 계속 에러가 났는데 창 열린 뒤 time.sleep(5) 설정 후 정상작동
- 내용 중 반복되는 불필요한 텍스트는 삭제하고, DF 만들고 csv 파일로 변환함
- csv 파일은 구글시트로 옮겨서 활용
import sys
import os
import time
import warnings
warnings.filterwarnings('ignore')
import chromedriver_autoinstaller
import pandas as pd
import numpy as np
from selenium import webdriver
from selenium.webdriver.common.by import By
url = 'https://www.rehacare.com/vis/v1/en/search?oid=43530&lang=2&_query=&f_type=profile'
path = chromedriver_autoinstaller.install()
driver = webdriver.Chrome(path)
driver = webdriver.Chrome()
driver.get(url)
time.sleep(1)
shadow_host = driver.find_element(By.CSS_SELECTOR, '#usercentrics-root')
shadow_root = shadow_host.shadow_root
shadow_content = shadow_root.find_element(By.CSS_SELECTOR, 'button.sc-eDvSVe.dkEaVU')
shadow_content.click()
def scroll_down(driver):
driver.execute_script("window.scrollTo(0, 21431049)")
n = 100
i = 0
while i < n:
scroll_down(driver)
i = i+1
time.sleep(0.5)
names = driver.find_elements(By.CSS_SELECTOR, "h3")
len(names)
738
name_list = []
for a in names:
name = a.text
name_list.append(name)
del name_list[0]
len(name_list)
737
nations = driver.find_elements(By.CSS_SELECTOR, "h5")
len(nations)
737
nation_list = []
for b in nations:
nation = b.text
nation_list.append(nation)
urls = driver.find_elements(By.CLASS_NAME, "media-module__link")
len(urls)
737
url_list = []
for c in urls:
url = c.get_attribute("href")
url_list.append(url)
len(url_list)
737
phone_list = []
web_list = []
email_list = []
for url in url_list[205:]:
path = chromedriver_autoinstaller.install()
driver = webdriver.Chrome(path)
driver = webdriver.Chrome()
driver.get(url)
time.sleep(5)
shadow_host = driver.find_element(By.CSS_SELECTOR, '#usercentrics-root')
shadow_root = shadow_host.shadow_root
shadow_content = shadow_root.find_element(By.CSS_SELECTOR, 'button.sc-eDvSVe.dkEaVU')
shadow_content.click()
time.sleep(0.5)
driver.find_element(By.CSS_SELECTOR, 'div.profile__cta-buttons > button').click()
time.sleep(0.5)
try:
phone = driver.find_element(By.CSS_SELECTOR, 'div.exh-contact-phone').text
phone_list.append(phone)
except:
phone_list.append('none')
try:
web = driver.find_element(By.CSS_SELECTOR, 'div.link-list.link-list--slim > ul > li > a').get_attribute("href")
web_list.append(web)
except:
web_list.append('none')
try:
email = driver.find_element(By.CSS_SELECTOR, 'div.exh-contact-email').text
email_list.append(email)
except:
email_list.append('none')
driver.close()
df = pd.DataFrame({'name':name_list, 'nation':nation_list, 'url':url_list, 'phone':phone_list, 'web':web_list, 'email':email_list})
df['phone']=df['phone'].str.strip()
df['phone']=df['phone'].str.replace('Phone:','')
df['phone']=df['phone'].str.replace('+','')
df['email']=df['email'].str.strip()
df['email']=df['email'].str.replace('E-mail:','')
df1 = df[~df['nation'].str.contains('china', na=False, case=False)]
os.chdir('C:\gino dev')
df.to_csv('23_reha_list.csv')
df1.to_csv('23_reha_list_notChina.csv')