언어/Python

[Python] CES 2021 Awards 수상작 크롤링

함부작 2021. 1. 7. 22:29

CES 준비를 하는데 너무 리스트도 많고 힘이 들어서, 수상작 리스트 크롤링을 해봤다.

너무 오랜만에 하는지라 ^_^

 

1. 설치 및 import

#셀레니움,크롬드라이버 설치
!pip install selenium
!apt-get update # to update ubuntu to correctly run apt install
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin
import sys
sys.path.insert(0,'/usr/lib/chromium-browser/chromedriver')
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
wd = webdriver.Chrome('chromedriver',chrome_options=chrome_options)
#wd.get("https://www.webite-url.com")

#필요한 패키지들 import
import requests
from selenium import webdriver
from bs4 import BeautifulSoup #bs4는 안쓰긴했음..
import pandas as pd
import time
import re
import csv

 

2. url 지정

webdriver를 wd로 가져왔으므로 wd.get('url')로 url 접속

# url 가져오기
wd.get('https://www.ces.tech/Innovation-Awards/Honorees.aspx')

 

3. 목표

i) 수상작 카테고리를 선택하고 제일 아래까지 스크롤한다

ii) 스크롤한 상태에서 회사명, 제품명, 제품상세 url을 가져온다

iii) 제품상세 url에 접속하여 제품 간략 설명 가져온다

 

4. 작업 코드 

#코드 설명

## 데이터 리스트 만들어준다
data=[]
## 카테고리의 option이 [3]~[29]까지 유효해서 i구간을 이렇게 정했다
for i in range(3,30):
### 카테고리 클릭
  wd.find_element_by_xpath('//*[@id="cat-sel"]').click()
### i번째 카테고리 클릭
  wd.find_element_by_xpath(f'//*[@id="cat-sel"]/option[{i}]').click() #카테고리 클릭
### 로딩을 위해 5초 쉬고, 스크롤 좀 하고~ 5초 쉬고 스크롤 좀 하고
  time.sleep(5)
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  time.sleep(5)
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  time.sleep(5)
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  wd.execute_script("window.scrollTo(0, window.scrollY + 100);")
  wd.execute_script("window.scrollTo(0, document.body.scrollHeight);")
  time.sleep(5)
### 현재 데이터를 가져오는 카테고리명
  cat_nm = wd.find_element_by_xpath(f'//*[@id="cat-sel"]/option[{i}]').text
### 가져온 회사명
  comp_nm = wd.find_elements_by_class_name('company-name') #회사 이름을 가져옵니다
### 수집된 회사수 만큼의 list를 만들어준다
  comp_nm_dt = [None]*len(comp_nm) # 회사이름 리스트
  prod_nm_dt = [None]*len(comp_nm) # 상품명 리스트
  url_dt = [None]*len(comp_nm) # url 리스트
  cat_dt = [None]*len(comp_nm) # 카테고리명 리스트
  for rk in range(0,len(comp_nm)): # 회사이름 수 만큼 반복하여 상품명 및 url수집해보자
    comp_nm_dt[rk] = comp_nm[rk].text #회사이름을 순서대로 리스트에 할당
    prod_nm = wd.find_element_by_xpath(f'//*[@id="ia-items"]/picture[{rk+1}]/footer/div[2]/a') #xpath를 활용해 상품명 획득
    prod_nm_dt[rk] = prod_nm.text #상품명을 리스트에 할당
    url = wd.find_element_by_xpath(f'//*[@id="ia-items"]/picture[{rk+1}]/footer/div[2]/a').get_attribute('href') #xpat를 활용해 href의 링크 정보 획득
    url_dt[rk] = url #링크 정보를 리스트에 할당
    cat_dt[rk] = cat_nm #카테고리명 할당 (어차피 1턴당 카테고리명은 같긴함)
    data.append([cat_dt[rk],comp_nm_dt[rk],prod_nm_dt[rk],url_dt[rk]]) #데이터에 카테고리명, 회사명, 상품명, url 추가해줌

4-1. 1차 결과 확인

fin_data = pd.DataFrame(data,columns=['category','company_nm','product_nm','url'])
fin_data

4-2. 수집한 url에 접속하여 설명 정보 획득 

desc_dt =[None]*len(fin_data) #fin_data길이로 리스트 만들어주고

for i in range(0,len(fin_data)):
  wd.get(fin_data.url[i]) #순서대로 url 바꿔가며 접속
  desc = wd.find_element_by_xpath('//*[@id="content"]/section/aside[2]/p[2]')
  desc_dt[i] = desc.text # 수집한 데이터 할당

4-3. 1차 데이터 + url 설명 데이터 합치기 

fin_data2 = fin_data
fin_data2['desc'] = desc_dt

4-4. 데이터 확인

 

5. csv 저장하기

fin_data2.to_csv('awards_list_f2.csv')

 

6. 결과 필요하신 분은 다운받아가세용 ㅎ_ㅎ ! 

awards_list_f2.csv
0.19MB