파이썬 Selenium 나무위키 크롤링해보기
안녕하십니까. 오늘은 여러분들께 나무 위키를 파이썬의 셀레늄이라고 있습니다. 이거를 통해서 크롤링을 한번 해볼 건데요. 많은 분들이 많이 맡기시는 그런 분들이 로봇인지 사람인지 구분하는 이런 거에서 많이 막힌다 이렇게 얘기를 하시더라고요 그런 의미에서 제대로 크롤링할 수 있는 방법이 뭐가 있을까라는 것을 공유를 드리고자 오늘 이렇게 썼습니다.
그렇게 어려운 내용들은 없고요. 전체 파이썬 코드를 완성본도 공유를 드릴께요. 파이썬 셀레늄으로 나무 위키를 크롤링할 수 있는 방법에 대해서 시작을 해보도록 하겠습니다. 먼저 첫 번째로 보시는 바와 같이 이거를 보시면 파이썬에서 필요한 라이브러리에요. 그래서 어느 정도 조금 있기는 하는데 이 부분들은 다 파이썬에서 설치가 조금 필요합니다. 파이썬 라이브러리 리스트를 한 번 확인해 보시고요.
import warnings
import subprocess
import time
import json
import html
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.chrome.service import Service
from bs4 import BeautifulSoup
import chromedriver_autoinstaller
두 번째로 들어가는 부분들은 크롬 브라우저를 드라이버를 끌어올리기는 하는 건데 이게 법칙이 있습니다. 이 밑에 코딩을 보시면 아시겠지만 이게 그 쿠키를 다 삭제를 해주는 거예요. 그래서 쿠키를 쿠키가 없는 상태에서 파이썬 크롬 브라우저가 디버깅 형식으로 구동이 되는 겁니다. 그래서 캐시 파일을 다 삭제를 한다는 거보시면 되겠고요.
warnings.filterwarnings('ignore')
try:
Shutil.rmtree(r"c:\chrometemp") #Cookie/Delete CacheFile
except FileNotFoundError:
pass
세 번째로 보시면 본격적으로 크롬 브라우저를 구동을 해야겠죠. 해서 밑에 거는 그냥 크롬 브라우저를 구동을 하는 거라고 보시면 됩니다.
subprocess.Popen(r'C:\Program Files\Google\Chrome\Application\chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\chrometemp"')
근데 네 번째로 제가 본격적으로 조금 어려우실 수 있습니다. 이 디버깅 모드로 나는 크롬 브라우저를 실행할 거야 하는 것을 집어넣어 줍니다. 이 디버깅 모드가 이러한 것들이 있다는 것을 조금 보시면 알 것 같고요. 크롬 브라우저 안에서 옵션 부분을 집어넣어서 나는 이렇게 할 거야 하는 것을 넣었다고만 보시면 될 것 같습니다.
option = Options()
option.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
chrome_ver = chromedriver_autoinstaller.get_chrome_version().split('.')[0]
근데 네 번째로 제가 본격적으로 조금 어려우실 수 있습니다. 이 디버깅 모드로 나는 크롬 브라우저를 실행할 거야 하는 것을 집어넣어 줍니다. 이 디버깅 모드가 이러한 것들이 있다는 것을 조금 보시면 알 것 같고요. 크롬 브라우저 안에서 옵션 부분을 집어넣어서 나는 이렇게 할 거야 하는 것을 넣었다고만 보시면 될 것 같습니다.
try:
s = Service(f'./{chrome_ver}/chromedriver.exe')
driver = webdriver.Chrome(service=s, options=option)
except:
chromedriver_autoinstaller.install(True)
s = Service(f'./{chrome_ver}/chromedriver.exe')
driver = webdriver.Chrome(service=s, options=option)
여섯 번째는 크롬 브라우저가 커지겠죠. 커지는데 저는 최대 창을 열어놓고 진행을 합니다 해서 최대 창을 열어놓은 거기 때문에 아래와 같은 코딩을 집어넣었다고 보시면 될 것 같고요.
driver.maximize_window()
time.sleep(3)
driver.implicitly_wait(10)
action = ActionChains(driver)
본격적으로 크롬 브라우저를 열었으면 7번째로 나무 위에 사이트로 한 번 들어가 봐야겠죠. 제가 들어갔던 그 사이트는 강동원 강동 원할 겁니다. 이거 url로 한번 찾아들어가 보시면 해서 강동원과 관련된 나무 위키의 텍스트를 한 번 긁어보고자 그걸로 열었었고요.
url ='https://namu.wiki/w/%EA%B0%95%EB%8F%99%EC%9B%90'
여덟 번째로 들어가 보시면 크롬에서 강동원 사이트가 보일 겁니다. 그 사이트가 보이면 그것에 htm l의 코드를 가지고 와야겠죠. 그래서 가져오는 코드라고 보시면 될 것 같습니다.
driver.get(url)
time.sleep(3)
driver.implicitly_wait(10)
raw = driver.page_source
9번째는 그거를 저희의 뷰티 폴스프 죠 이걸로 html 그것을 htm l 코드를 파싱 해서 가지고 오는 부분이라고 보면 될 것 같습니다.
raw = BeautifulSoup(raw, 'lxml')
본격적으로 중요한 10번째가 될 것 같은데요. 이 열 번째에서는 여기서 스크립트라는 코드가 있습니다. 그래서 그 코드를 찾아보는 거예요. 그 코드를 텍스트 타입으로 가지고 옵니다. 가지고 와서 어느 정도 단어를 필터링해 놓은 다음에 이거를 json 형식으로 가지고 와요 그래서 제이스 형식으로 한번 가지고 오고 키 넘버를 찾아야 되거든요. 그래서 키 넘버를 뭐 하나 둘 셋 이렇게 해서 계속 찾아놓고 나와서 했었던 그 결과로 최종적으로 아래로 내려가서 보시면 주요 텍스트 형식으로만 된 나무 위키의 정보 텍스트 정보를 가지고 올 수 있습니다.
content = raw.find_all('script') #Script
text = str(content[4])
text = text.replace("<script>window.INITIAL_STATE=", "")
text = text.replace("</script>", "")
text_json_1 = json.loads(text) #json화
keys_1 = list(text_json_1.keys()) #Find key number
text_json_2 = text_json_1[keys_1[2]] #2번째
keys_2 = list(text_json_2.keys()) #Find key number
text_json_3 = text_json_2[keys_2[2]] #2번째
keys_3 = list(text_json_3.keys())
text_json_4 = text_json_3[keys_3[6]]
#text_json_4[2] #html 화
for i in range(1, len(text_json_4) : Start from #1
html_string = html.unescape(text_json_4[i])
#html_string = html.escape(text_json_4[2], quote=False)
#html_string = Markup(html_string)
content_text = BeautifulSoup(html_string, 'html.parser')
print(content_text.text) #완료
그래서 이게 최종적으로 완료됐었던 이 내용들이고요 그렇게 어려운 내용들이 있느냐라고 보시면 그렇게 어려운 내용은 없습니다. 왜냐하면 제가 이거 웬만한 그런 것들은 다 추려서 가지고 왔었기 때문에 여기서 한 가지 키포인트는 그게 있습니다. 나무 위키 사이트는 db 형식으로 해서 가지고 오는 방식입니다. 스크립트라는 html 코드를 스크립트로 돌아가는 부분을 찾았었고 그 안에 어떤 내용들이 있는지 이걸 확인을 한 다음에 그거를 어느 정도 정규화된 데이터를 파싱해 놔서 json 파일로 최종적으로 가지고 온 것이라고 보시면 될 것 같네요.
그래서 밑에 내용은 아랫부분이 이렇게 서 있고 요 근데 이미 다들 아시겠지만 이거를 불법으로 너무 남용하면 안 되겠죠.
그렇기 때문에 그냥 참고만 해두시고 요 너무 남의 저작권을 그렇게 위배를 하면 안 됩니다. 참고하시고 오늘은 여기 또 마무리 짓도록 하겠습니다.
댓글