본문 바로가기
NaverBoost Camp 4기/[P stage] Final Project

[P stage][Final Proj] selenium invalid session id error

by 하람 Haram 2023. 1. 25.
728x90

요 며칠간 골머리쓰던 Error를 탐구해보고자 한다

 

데이터 스크래핑과정에서 생긴 에러

 

selenium.common.exceptions.InvalidSessionIdException: Message: invalid session id

https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors/InvalidSessionID

 

Invalid session ID - WebDriver | MDN

The invalid session ID error is a WebDriver error that occurs when the server does not recognize the unique session identifier. This happens if the session has been deleted or if the session ID is invalid.

developer.mozilla.org

여길 먼저 참고해보자

The invalid session ID error is a WebDriver error that occurs when the server does not recognize the unique session identifier. This happens if the session has been deleted or if the session ID is invalid.

 

Session이 deleted 되거나 session ID가 올바르지 않으면 생긴다고 한다 -> 추가로 드라이버 문제

 

User_agent

='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0Safari/537.36'

 

로 User_agent는 해결을 했으니 session ID가 올바르지 않다는 것은 일단 치워두고

 

Session이 deleted 되었나??

try:
    session.get("https://mozilla.org")
except exceptions.InvalidSessionIdException as e:
    print(e.message)

으로 해결이 가능하다해서

 

 

다음 오류를 잡으면 그냥 다음 이미지로 pass 하도록 코딩을 하여도 되었지만 좀 더 근본 적인 해결을 하기위해

다시 돌려서 어떤 부분에서 에러가 나는지를 확인한 결과

 

내가 작성한 코드는 새탭으로 열기로 이미지 원본을 새탭으로 연다음 저장을 하고 열었던 탭을 닫히는 과정 

 

즉 다음과 같은 과정을 거친다

1. 작은 이미지 클릭하기
2. 큰 이미지를 새탭으로 열기
3. 새탭에서 이미지를 저장하기
4. 열었던 탭을 닫기

를 계속 반복하지만

 

가끔 다음과 같은 링크

https://www.google.com/search?q=%EC%B0%B8%EB%8F%94%ED%9A%8C&tbm=isch&tbs=isz:l&hl=ko&sa=X&ved=0CAIQpwVqFwoTCMCTwZDx4vwCFQAAAAAdAAAAABAD&biw=1519&bih=722#imgrc=VOpfqzdDhOi56M

를 새탭으로 열기를 하면 새탭은 열리지 않고

이렇게 다운로드 되는 현상이 생겼다

 

이를 해결하기 위해 2번과 3번 과정 사이에 탭의 개수를 파악하는 코드를 짜서 해결하였다

 

해결 코드

driver.execute_script('window.open("'+img_url+'");')  #구글 창 새 탭으로 열기
time.sleep(DELAY)

#이 부분에서 다운로드가 받아지고 탭이 안열리는 현상이 발생
if len(driver.window_handles) <= 1: # 탭이 안 열림
    print("## 탭이 닫혔습니다")
    driver.switch_to.window(driver.window_handles[-1]) # 마지막 탭으로 이동
    time.sleep(DELAY)
    count += 1
    count_list["link"]+=1
    pbar.update(1)
    continue #다음 loop로

전체 코드

print("## [",keyword,"] 에 대한 이미지 다운로드 시작합니다 (최대 이미지 개수 : ",max_img_num,")\n")
    print("## 크롤링된 이미지 개수 : ",len(images),"\n")
    with tqdm(total=len(images)) as pbar:
        for image in images:
            if count == max_img_num:
                break
            try:
                image.click()
                #만약 실행이 잘 안되면 이미지 로드 문제 일수도 있어서 지연을 조금주자
                time.sleep(DELAY)
                
                #큰 이미지를 누르는 코드 
                img_url = driver.find_element_by_css_selector(".n3VNCb.KAlRDb").get_attribute("src")
                #img_url = driver.find_element_by_xpath('/html/body/div[2]/c-wiz/div[3]/div[2]/div[3]/div[2]/div/div[2]/div[2]/div[2]/c-wiz/div[2]/div[1]/div[1]/div[2]/div/a/img').get_attribute("src")

                #print(img_url)
                driver.execute_script('window.open("'+img_url+'");')  #구글 창 새 탭으로 열기
                time.sleep(DELAY)

                #이 부분에서 다운로드가 받아지고 탭이 안열리는 현상이 발생
                if len(driver.window_handles) <= 1: # 탭이 안 열림
                    print("## 탭이 닫혔습니다")
                    driver.switch_to.window(driver.window_handles[-1]) # 마지막 탭으로 이동
                    time.sleep(DELAY)
                    count += 1
                    count_list["link"]+=1
                    pbar.update(1)
                    continue #다음 loop로

                else:

                    driver.switch_to.window(driver.window_handles[-1])  #새로 연 탭으로 이동
                    time.sleep(DELAY)
                    #이제 src 링크를 가져오는 코드를 짜자
                    urllib.request.urlretrieve(img_url, tmp_save_path + "\\" + str(output_name).zfill(4) +".jpg")
                    size_lst.append(driver.title.split()[-1][1:-1])
                    driver.close()  #링크 이동 후 탭 닫기

                    driver.switch_to.window(driver.window_handles[0])  #다시 이전 창(탭)으로 이동
                    time.sleep(DELAY)
                    count += 1
                    count_list["normal"]+=1
                    print("\n## ",max_img_num,"(",len(images),")","개의 이미지 중 ",output_name,"번째 이미지 저장완료")
                    pbar.update(1)
                    output_name += 1

 

 

728x90