요 며칠간 골머리쓰던 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
'NaverBoost Camp 4기 > [P stage] Final Project' 카테고리의 다른 글
[P stage][Final Proj] Something went wrongcannot get client for: Jira (0) | 2023.01.27 |
---|---|
[P stage][Final Proj] 캡슐화 관련 Error 분석 (0) | 2023.01.11 |
[P stage][Final Proj] Data Prepare (gdown, ZipFile) (0) | 2023.01.10 |
[P stage][Final Proj] 환경설정 (0) | 2023.01.10 |