2020/04/22 - [개발자/Python] - Python (파이썬) 웹 크롤링 기초 - Spark 퀴즈 정보 긁어오기
지난번에 했던 웹 크롤링(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 (파이썬) 메일 보내기
'개발자 > Python' 카테고리의 다른 글
Python (파이썬) 메일 보내기 (0) | 2020.05.04 |
---|---|
Python (파이썬) Selenium 셀레니움 (0) | 2020.05.04 |
Python (파이썬) 크롤링 - 한국 홀리데이 스크랩 (1) | 2020.05.04 |
Python (파이썬) while(True) (0) | 2020.04.29 |
Python (파이썬) select 함수 (0) | 2020.04.29 |