이번 일주일 동안은 지금까지 배운 내용을 바탕으로 작은 프로젝트를 진행한다. 목표는 기본적인 개발환경 구축과 간단한 서비스 제작을 통해 파이썬 프로그래밍 기본역량과 Git/Github 사용법 익히기, REST API와 Django 활용이다. 우리 팀은 가상화폐 뉴스 크롤링과 가상화폐 거래 데이터 시각화라는 주제로 진행하기로 했다. 여기서 내가 담당한 부분은 가상화폐 관련 뉴스를 크롤링 하는 것이였고, 오랜만에 크롤링한다는 점과 깃헙으로 협업 프로젝트를 처음 진행한다는 점에서 많이 막히고 많이 배웠다.
먼저, 셀레니움으로 크롤링을 하기 위해 해당 라이브러리를 import 하고 크롬드라이버 파일을 크롤링 파일과 같은 경로에 설치해두었다.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import pandas as pd
driver = webdriver.Chrome('/Users/Name/Downloads/chromedriver')
driver.get('https://cointelegraph.com/magazine/')
여기서 내가 크롤링하고자 하는 사이트가 크롤링이 가능한지 확인이 필요한데 크롤링하고자 하는 사이트뒤에 /robots.txt를 붙여 확인할 수 있다.
이 사이트의 경우, 아래 경로에서만 가능하다는 것을 알 수 있다.
- /magazine/wp-content
- /magazine/wp-admin/admin-ajax.php
- /magazine/wp-includes/js
이제 엘레먼트를 찾을 건데 selenium By를 사용하는 것이 굉장히 유용하고 간단하다고 생각한다. By에는 아래와 같은 종류가 있다.
element(단일) , elements(복수) | 설명 |
By.NAME | 태그의 name 값으로 추출 |
By.LINK_TEXT | 링크 텍스트값으로 추출 |
By.PARTIAL_LINK_TEXT | 링크 텍스트의 자식 텍스트 값을 추출 |
By.TAG_NAME | 태그 이름으로 추출 |
By.CLASS_NAME | 태그의 클래스명으로 추출 |
By.CSS_SELECTOR | css선택자로 추출 |
By.XPATH | 태그의 경로로 추출 |
By.ID | 태그의 id값으로 추출 |
나는 해당기사로 들어가는 링크 텍스트의 feature이라는 텍스트가 포함되어 있으면 크롤링하고자 하는 기사만 선택되므로 아래와 같이 작성했다.
# 기사 관련 내용만 선택
features = driver.find_elements(By.PARTIAL_LINK_TEXT, "Features")
사실 여기까지가 제일 오래 걸렸고 해당 기사들을 찾은 후 각 기사를 클릭하여 본문을 크롤링하는 것은 어렵지 않게 작성했다. 다만, 수집 중 몇가지 변수가 있었는데 본문 내용 내에 트위터 기사(?), 광고(?)와 같이 불필요한 내용이 포함되어 있다는 점, 그리고 Features를 포함하는 링크 텍스트지만 기사가 아닌 그저 카테고리의 이름이 Features인 링크가 발견 되었다. 이는 미래의 내가 해결할 거라 믿고 일단 초안 작성을 완료하였다.
# news_urls = []
titles = []
contents = []
for feature in features:
feature.send_keys(Keys.ENTER)
# current_url = driver.current_url
# news_urls.append(current_url)
current_title = driver.title
titles.append(current_title)
current_content = driver.find_element(By.CLASS_NAME, "article__inner.body-l").text
contents.append(current_content)
# 추가되는 페이지에 대해 코드 추가해야 함
driver.back()
추가로 해야할 일
- Features 카테고리는 크롤링에서 제외
- I want more을 클릭하여 더 많은 기사 크롤링