2020/04/22 - [개발자/Python] - Python (파이썬) 웹 크롤링 기초 - Spark 퀴즈 정보 긁어오기

 

Python (파이썬) 웹 크롤링 기초 - Spark 퀴즈 정보 긁어오기

1. 페이지 저장하기 import requests, bs4 # 비슷한 애들 끼리는 콤마(,)로 한 번에 선언해도 된다. requests : 웹페이지 긁어옴. bs4 : 파이썬의 IDE import pandas as pd # 얘도 한 번에 선언할 수는 있지만 그..

greendreamtrre.tistory.com

지난번에 했던 웹 크롤링(Selenium, 셀레니움) 없이 했던 것을 이번에는 셀레니움을 활용해서 크롤링 하는 방법입니다.

 

1번은 셀레니움을 통한 이동, 2번은 크롤링을 해 .csv 파일로 담아내는 과정.

import requests, bs4
import pandas as pd
from selenium import webdriver

# 1. 셀레니움을 이용해 목적지로 이동하기.

from selenium import webdriver

# Step 1. 크롬 드라이버 위치 설정.
chr_driver_path = '/Applications/chromedriver'

# Step 2. 크롬 드라이버가 사용할 크롬 브라우저의 옵션을 설정.
options = webdriver.ChromeOptions()
options.add_argument('window-size=5120x2880')

# Step 3. 위에 옵션을 활용하여 드라이버를 만든다.
driver = webdriver.Chrome(chr_driver_path, options=options)
# 혹시라도 창이 작아서 안 보이는 일이 없도록 최대화로 열기. -> 이걸 아래에 예외처리로 할거다.
# driver = webdriver.Chrome(chr_driver_path)
# driver.maximize_window()

# Step 4. 스파크 홈페이지로 이동하기.
spark_url = 'https://sparkkorea.com/'
driver.get(spark_url)    # URL을 가지고 이동하는 방법. driver.get()
# driver.current_url # 디버깅용.

# Step 5. 스파크 홈페이지 내에서 퀴즈로 이동하기. (반응형 웹 예외처리 적용 버전)
spark_main_xpath = '//*[@id="site-navigation"]/button'
spark_quiz_xpath = '//*[@id="menu-item-382"]/a'
# xpath 요소를 가지고 마우스 클릭을 통해 이동하는 방법. driver.find_element_by_xpath().click()
try:
    #(모바일 접속시 퀴즈 버튼이 바로 안 보임)
    driver.find_element_by_xpath(spark_main_xpath).click()    # 메뉴를 먼저 찾고
    driver.find_element_by_xpath(spark_quiz_xpath).click()    # 퀴즈 버튼을 찾아라
    print("모바일 접근")
except Exception as e:
    driver.find_element_by_xpath(spark_quiz_xpath).click()    # 퀴즈 버튼을 찾아라
    print("PC 접근")

# driver.current_url # 디버깅용.

# 2. requests, bs4를 이용해 원하는 요소를 추출해서 pandas를 이용해 담아내기.

# Step 1. requests 모듈로 웹페이지 긁어와 저장하기.
response = requests.get(driver.current_url)   # requests 함수를 이용해 서버를 get(얻어낸다)!
response.encoding = 'UTF-8'

# Step 2. bs4(BeautifulSoup) 모듈로 웹페이지를 예쁘게 담기.
spark_html = response.text    # spark_html이란 변수에 위에서 불러온 response를 text로 담아라.
spark_html_bs = bs4.BeautifulSoup(spark_html, "html.parser")    # spark_html에 대해서 "html.parser" 파싱하겠다. ("html.parser"는 안 써도 잘 돌아가긴 한다.)
# spark_html_bs라는 변수에 bs4(BeautifulSoup)모듈의 BeautifulSoup 함수를 이용해 예쁘게 담아라.
# 우리가 코드를 짤 때 IDE(이클립스, 아톰 등)을 사용하듯이 BeautifulSoup가 파이썬 내에서 코드를 예쁘게 보여준다.
# 앞으로 모든것은 bs4를 이용해 담은 이 'spark_html_bs'를 이용해 bs4의 다른 함수를 이용해 분석할거다.
# spark_html_bs # 디버깅용.

# Step 3. (범위 좁히기) 수많은 'div 태그' 구역 중 원하는 구역의 'div 태그' 구역만 골라서 추출해보자. (개발자 도구로 미리 확인하기.)
# div 태그 : 속성 (i.e. id, class, etc...) 별로 구역을 나눈다. 이를 이용해 특정 구역에 특정 조건을 넣어 검색할 수 있다.
# name = "태그명", attrs = {"속성명":"속성값"} 으로 찾는다. 여기서 attrs(파라미터)는 "id명":"id값" 또는 "class명":"class값"이다.
# divTags_including_aTags에 spark_html_bs에서 찾아라.
# 태그 이름이 div인데 그 중에서 {}"속성명":"속성값"}은 {"class":"class_spark_quiz", "id":"id_spark_quiz"}다.
divTags_including_aTags = spark_html_bs.find\
(name = "div", attrs = {"class":"class_spark_quiz", "id":"id_spark_quiz"}) # find_all도 가능.
# divTags_including_aTags # 디버깅용.

# Step 4. (범위 좁히기) 추출한 'div 태그' 구역 중 원하는 'a 태그'만 다시 추출하자.
aTags = divTags_including_aTags.find_all(name = "a")
# aTags # 디버깅용. (리스트는 아니지만 인덱스를 가져 리스트처럼 사용할 수 있다.)

# Step 5. 태그 범위 좁히기가 완료되면 원하는 요소만 뽑아서 매트릭스 리스트로 담아보자.
rowList = []    # 행을 만들어줄 바깥 리스트 생성하기.

aTagsLen = len(aTags)
for i in range(0, aTagsLen,):
    eachText = aTags[i].text               # i번째 객체 데이터에 넣을 'spark 퀴즈 타이틀'을 추출.
    eachTitle = aTags[i].attrs["href"]     # i번째 객체 데이터에 넣을 'spark 퀴즈 링크'을 추출.
        
    # [eachText,eachTitle]을 하나의 객체 데이터 리스트로 만들어 바깥 리스트(rowList)에 넣어 매트릭스 만들기.
    rowList.append([eachText,eachTitle])
    
# Step 6. 위에서 만든 매트릭스 리스트를 DataFrame으로 만들어보자.
rowList_DF = pd.DataFrame(rowList, columns = ["spark 퀴즈 타이틀","spark 퀴즈 링크"])
# rowList_DF # 디버깅용.

rowList_DF.to_csv("./QuizScrap.csv", index=False)

 

 

완성본

import requests, bs4
import pandas as pd
from selenium import webdriver

# 1. 셀레니움을 이용해 목적지로 이동하기.

from selenium import webdriver

# Step 1. 크롬 드라이버 위치 설정.
chr_driver_path = '/Applications/chromedriver'

# Step 2. 드라이버를 만든다.
driver = webdriver.Chrome(chr_driver_path)
# driver.maximize_window()    # 최대화 대신 반응형 웹 예외처리로 적용.

# Step 4. 스파크 홈페이지로 이동하기.
spark_url = 'https://sparkkorea.com/'
driver.get(spark_url)    # URL을 가지고 이동하는 방법. driver.get()
# driver.current_url # 디버깅용.

# Step 5. 스파크 홈페이지 내에서 퀴즈로 이동하기. (반응형 웹 예외처리 적용 버전)
spark_main_xpath = '//*[@id="site-navigation"]/button'
spark_quiz_xpath = '//*[@id="menu-item-382"]/a'
# xpath 요소를 가지고 마우스 클릭을 통해 이동하는 방법. driver.find_element_by_xpath().click()
try:
    #(모바일 접속시 퀴즈 버튼이 바로 안 보임)
    driver.find_element_by_xpath(spark_main_xpath).click()    # 메뉴를 먼저 찾고
    driver.find_element_by_xpath(spark_quiz_xpath).click()    # 퀴즈 버튼을 찾아라
    print("모바일 접근")
except Exception as e:
    driver.find_element_by_xpath(spark_quiz_xpath).click()    # 퀴즈 버튼을 찾아라
    print("PC 접근")

# driver.current_url # 디버깅용.

# 2. requests, bs4를 이용해 원하는 요소를 추출해서 pandas를 이용해 담아내기.

# Step 1. requests 모듈로 웹페이지 긁어와 bs4(BeautifulSoup) 모듈로 예쁘게 담기.
response = requests.get(driver.current_url).text.encode('utf-8')
spark_html_bs = bs4.BeautifulSoup(response, "html.parser")

# Step 3. (범위 좁히기) 영역 구하기.
divTags_including_aTags = spark_html_bs.find\
(name = "div", attrs = {"class":"class_spark_quiz", "id":"id_spark_quiz"}) # find_all도 가능.
# divTags_including_aTags # 디버깅용.

# Step 4. (범위 좁히기) 영역 내에서 원하는 태그 추출하기.
aTags = divTags_including_aTags.find_all(name = "a")
# aTags # 디버깅용.

# Step 5. 태그 범위 좁히기가 완료되면 원하는 요소만 뽑아서 매트릭스 리스트로 담아보자.
rowList = []    # 행을 만들어줄 바깥 리스트 생성하기.

aTagsLen = len(aTags)
for i in range(0, aTagsLen,):
    eachText = aTags[i].text               # i번째 객체 데이터에 넣을 'spark 퀴즈 타이틀'을 추출.
    eachTitle = aTags[i].attrs["href"]     # i번째 객체 데이터에 넣을 'spark 퀴즈 링크'을 추출.
        
    # [eachText,eachTitle]을 하나의 객체 데이터 리스트로 만들어 바깥 리스트(rowList)에 넣어 매트릭스 만들기.
    rowList.append([eachText,eachTitle])
    
# Step 6. 위에서 만든 매트릭스 리스트를 DataFrame으로 만들어보자.
rowList_DF = pd.DataFrame(rowList, columns = ["spark 퀴즈 타이틀","spark 퀴즈 링크"])
# rowList_DF # 디버깅용.

rowList_DF.to_csv("./QuizScrap.csv", index=False)

 

위에서 만든 'QuizScrap.csv'파일을 메일로 발송하는 것을 연습하는 것은 다음 글로 이어집니다.

2020/04/22 - [개발자/Python] - Python (파이썬) 메일 보내기

 

+ Recent posts