×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,588,317명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형

이번에는 Selenium을 이용하여 크롤링을 해보고자 한다.


셀레니움 도큐먼트는 아래와 같다.

https://selenium-python.readthedocs.io/api.html


티스토리를 운영하면 admin페이지에 유입검색 경로가 나타난다.


이 내용을 크롤링하여 필자는 Crocus 블로그 메인에 인기검색어 같이 출력을 해보고자 한다.


코드는 아래와 같다.


#-*- coding: utf-8 -*-
import os
import re
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

chrome_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'chromedriver')
driver = webdriver.Chrome(chrome_path)

driver.get('https://www.tistory.com/auth/login/?redirectUrl=https://www.crocus.co.kr/manage/')

id = input("input your id : ")
pw = input("input your pwd : ")
driver.find_element_by_name('loginId').send_keys(id)
driver.find_element_by_name('password').send_keys(pw)


driver.find_element_by_class_name('btn_login').click()

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
keywordRank = soup.select('.wrap_box .box_keyword')

keywordRank = str(keywordRank)
regex = r'>[가-힣a-zA-Z\s]+<'
ret = re.findall(regex, keywordRank)
for i in range(0, len(ret)):
ret[i] = ret[i][1:len(ret[i]) - 1]
if i != 0:
ret[i] = str(i) + ' ' + ret[i]
print('i :: ', i, " ret :: ", ret[i])

print(ret)

print("\n".join(ret))

driver.get('https://programbasic.tistory.com/manage/design/skin/edit#/source/html/')


htmlXpath=driver.find_elements_by_xpath('//*[@id="skin-editor"]/div/div[3]/div/div[1]/ul')[0]

action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(htmlXpath, 50, 500)
action.click()
action.perform()
action.key_down(Keys.CONTROL).send_keys('f').key_up(Keys.CONTROL).perform()
action.send_keys('/keywordRankList.*/').key_down(Keys.ENTER).perform()

for i in range(0,len(ret)):
ret[i] = '"' + ret[i] + '"'

ret = ','.join(ret)
print("ret : ", ret)
action.send_keys('keywordRankList:[').send_keys(ret).send_keys('],').perform()

driver.find_element_by_xpath('//*[@id="skin-editor"]/div/div[3]/div/div[1]/button[3]').click()



#-*- coding: utf-8 -*-
import os
import re
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys


우선 위와같이 import를 해준다.


os는 chromedriver path를 찾기 위해 필요하고 re는 regular expression(정규표현식)에 필요하다.


beautifulsoup는 크롤링에 필요하고 아래 3개는 selenium에 필요하다.



chrome_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'chromedriver')
driver = webdriver.Chrome(chrome_path)


크롬드라이버라는 파일의 위치가 어디있는지 path를 찾아주고 driver를 설정해준다.


driver.get('https://www.tistory.com/auth/login/?redirectUrl=https://www.crocus.co.kr/manage/')

id = input("input your id : ")
pw = input("input your pwd : ")
driver.find_element_by_name('loginId').send_keys(id)
driver.find_element_by_name('password').send_keys(pw)


드라이버가 탐색할 첫 페이지를 설정해주고 id와 pw를 직접 입력받는다.


그리고 난 뒤 loginId에라는 name이 있는 곳과 password라는 name이 있는 곳에 각각 입력한 key를 보내준다.

(loginId와 password는 자신의 티스토리 홈페이지 주소/manage 부분에 있다.)


driver.find_element_by_class_name('btn_login').click()

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')


그 후 btn_login을 클릭하게 만들고 beautifulsoup이 html을 파싱하도록 한다.



keywordRank = soup.select('.wrap_box .box_keyword')

keywordRank = str(keywordRank)
regex = r'>[가-힣a-zA-Z\s]+<'
ret = re.findall(regex, keywordRank)
for i in range(0, len(ret)):
ret[i] = ret[i][1:len(ret[i]) - 1]
if i != 0:
ret[i] = str(i) + ' ' + ret[i]
print('i :: ', i, " ret :: ", ret[i])

print(ret)

print("\n".join(ret))


.wrap_box .box_keyword라는 부분이 유입검색어 순위를 포함하고 있으니 그 부분을 크롤링하고


keywordRank에 정규표현식을 이용하여 값을 넣어준다.



아래부터는 사용자의 기호에 맞게 이용하면 되는데 필자는 직접 스킨 수정->html 부분에서 직접 셀레니움이 입력하도록 만들었다.


driver.get('https://programbasic.tistory.com/manage/design/skin/edit#/source/html/')


htmlXpath=driver.find_elements_by_xpath('//*[@id="skin-editor"]/div/div[3]/div/div[1]/ul')[0]

action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(htmlXpath, 50, 500)
action.click()
action.perform()
action.key_down(Keys.CONTROL).send_keys('f').key_up(Keys.CONTROL).perform()
action.send_keys('/keywordRankList.*/').key_down(Keys.ENTER).perform()


html 수정부분란으로 driver가 가도록 하고 수동으로 셀레니움이 html 수정 부분을 클릭 할 수 있도록 만들었다.


그리고 keywordRankList라는곳에 필자가 지금까지 받아온 값을 넣기위해 ctrl + f를 눌러 keywordRankList를 정규표현식으로 찾도록 했다.



for i in range(0,len(ret)):
ret[i] = '"' + ret[i] + '"'

ret = ','.join(ret)
print("ret : ", ret)
action.send_keys('keywordRankList:[').send_keys(ret).send_keys('],').perform()

driver.find_element_by_xpath('//*[@id="skin-editor"]/div/div[3]/div/div[1]/button[3]').click()


ret에 들어있던 유입 검색어 목록에 "내용"으로 변환시키도록 했고 join을 이용하여 ,로 나타낼 수 있도록 했다.


오늘자 결과는 아래와 같이 나타나게 된다.


"유입 키워드 순위","1 블록체인 이란","2 확장 유클리드 알고리즘","3 유클리드 알고리즘","4 파이썬 scanf","5 타원 곡선 암호 방식"


이제 마지막으로 모든 값을 수정시키도록 하고 저장버튼을 click을 하도록하여 저장시킨다.






반응형