크롬드라이버 자동 오류 해결(115버전부터 사이트가 바꼈어요)

반응형
    반응형

    There is no such driver by url

    오랜만에 셀레니움을 써야해서 크롬드라이버 자동으로 받게 했는데 안되네요. 크롬 드라이버 매니저가 되지 않습니다. 'There is no such driver by url' 이라고 합니다. 즉, 이런 다운로드 링크 없다는 얘기입니다.(정말...구글...이럴거야?)

    왜그런가 하니 사이트를 바꿔놨습니다. 그걸 chromemaneger는 인지하지 못한 것 같습니다.
    그래서 115 버전부터는 다른 사이트에서 운영하니 그 사이트를 가서 받아주어야 합니다. (짜증...)

    그럼 최신버전은 더이상 최신버전이 아니니
    더이상 chromemaneger는 쓸 수 없게 되는 것... 또르르륵....

    여태 chromemaneger로 해놨던거 다 바꾸게 생겼습니다.

    그래서 어느 사이트로 바뀌면 옮겨서 찾아줘야 하는데 여간 귀찮네요. 파이썬으로 자동 다운로드 해서 일단 위기를 넘겨야겠습니다.

     

    이번 포스팅에서 파이썬으로 매번 받게 만들려고 하는데요. 이건 정말 임시로 하는 것이라서 사이트가 또 바뀌면 안 먹힙니다. 사이트 구조가 바껴도 안 먹힙니다. 그래서 매번 코드를 바꾸는 작업을 하고 싶지 않다면 그때 그때 받아서 옛날처럼 path 정해서 실행하면 됩니다. 아래 사이트 가서 다운받아주면 됩니다.

     

    https://googlechromelabs.github.io/chrome-for-testing/#stable

     

    Chrome for Testing availability

    chrome-headless-shellmac-arm64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/120.0.6099.5/mac-arm64/chrome-headless-shell-mac-arm64.zip200

    googlechromelabs.github.io

    다운로드 링크처리도 안해놔서 복사해서 주소창에 직접 넣어야 합니다.(아무리 임시사이트라도 하이퍼 링크는 넣어주지...)

    하지만 저는 코드로 만들어야겠습니다. 버전 오류 발생하면 저기를 갔다가 다운로드 하는 반복을 하고 싶지 않네요. (크롬 매번 업데이트할텐데.... 매번 받아? 하...)

    소문을 들어보니 이 웹사이트는 임시로 만든 사이트라고 합니다. 언제라도 구조가 바뀔 수 있으니 쪼개서 코드진행을 하겠습니다.

    html 파싱

    이 사이트가 유지되는 한 그냥 받기 귀찮으니 파이썬으로 chromemanager처럼 자동으로 다운받는 툴을 만들까 합니다.

    version 추출

    이 사이트의 구조를 보면 Stable, Beta, Dev, Canary 마다 버전이 다릅니다. 저는 보통 크롬을 쓰니깐 Stable의 버전을 추출합니다. html을 BeatifulSoup으로 파싱애서 가져옵니다.
    'status-ok'라는 class의 code라는 곳의 text가 stable의 버전입니다.

    import requests
    from bs4 import BeautifulSoup
    
    url = 'https://googlechromelabs.github.io/chrome-for-testing/#stable'
    res_text = requests.get(url).text
    soup = BeautifulSoup(res_text)
    tr_element = soup.find(class_='status-ok')
    code_elements = tr_element.find_all('code')
    version = code_elements[0].get_text()
    print(version)

    다운로드 링크 추출

    이 버전에 맞는 다운로드 링크를 추출합니다.

    status_ok_tr = soup.find_all('tr', class_='status-ok')
    code_elements = []
    for i in status_ok_tr:
        code = i.find_all('code')
        code_elements.append(code)
    download = ''
    for j in code_elements:
        if j[0].get_text() == 'chromedriver' and j[1].get_text() == 'win32':
            #print(j[2].get_text())
            if version in j[2].get_text():
                download += f'{j[2].get_text()}'
    print(download)

    저는 윈도우를 쓰니 win32와 같은 경우의 링크를 가져왔습니다. mac 이면 mac-arm64, 리눅스면 linux64로 바꿔서 진행합니다.

    다운로드

    이제 다운로드 합니다.
    chromedriver는 zip파일로 받아지므로 그에 맞게 파일이름을 설정합니다.

    import requests
    
    # 다운로드할 파일의 URL
    download_url = download
    
    # 로컬에 저장할 파일 경로와 이름
    local_file_path = '파일경로'
    local_file_name = 'file.zip'  # 파일이름
    save_file_path = f'{local_file_path}\{local_file_name}'   #파일경로와 파일이름 합치기
    # HTTP GET 요청을 보내서 파일 다운로드
    response = requests.get(download_url)
    
    if response.status_code == 200:
        # 파일을 로컬에 저장
        with open(save_file_path, 'wb') as file:
            file.write(response.content)
        print(f'다운로드 완료: {local_file_path}')
    else:
        print(f'다운로드 실패. 상태 코드: {response.status_code}')

    다운로드가 완료되면 경로가 뜨게 했습니다. 별의미는 없지만 잘됐는지는 봐야하니까요.

    압축파일 풀기

    다 왔습니다. zipfile 모듈을 이용해 압축파일을 원하는 경로에 풀어줍니다. 저는 local_file_path와 동일한 곳에 압축을 풀었습니다. 다르게 하신다면 zip_file_path를 변경해주면 됩니다.

    import zipfile
    
    # 압축 해제할 zip 파일의 경로
    zip_file_path = local_file_path
    
    # 압축 해제될 디렉토리 경로
    extracted_dir = 'extracted_contents'
    
    # Zip 파일 열기
    with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
         # 압축 해제
         zip_ref.extractall(extracted_dir)
    
    print(f'압축 해제 완료: {extracted_dir}')
    
    from selenium import webdriver
    
    # 크롬 드라이버 경로 설정 (드라이버의 경로를 적절하게 수정해야 합니다)
    driver_path = rf'{zip_file_path}\{extracted_dir}\chromedriver-win32\chromedriver.exe'
    
    
    # 크롬 드라이버 실행
    driver = webdriver.Chrome(executable_path=driver_path)
    
    # 웹 페이지 열기
    driver.get('https://www.google.com')
    
    # 웹 브라우저 조작 및 웹 스크래핑 코드를 추가할 수 있습니다.
    
    # 브라우저 닫기
    driver.quit()

    드디어 나왔습니다. 하... 진짜... 임시 홈페이지니까 잘 안알리는건 알겠는데 다운로드 링크는 좀 달았으면 좋겠습니다.
    클릭하면 되는걸 오른쪽 클릭하고 이동 클릭. 한번 클릭할것을 두번클릭하게 만들다니... 그래도 글씨 드래그는 알아서 되니깐... 그럴거면 하이퍼링크로 해놓으면 되지 않나? 자꾸 훅 올라오네요.

     

    어쨋든 이렇게 완성이 됐습니다. 버전이 안맞으면 오류가 어떻게 나왔는지 알 수가 없으니 try 걸어놓고 그냥 실행하다가 안되면 다운받으라는 식으로 해놔야겠습니다.

    댓글

    Designed by JB FACTORY

    ....