문제 상황
Windows에서 정상적으로 실행되던 셀레니움을 linux환경으로 이식하면서 headless옵션으로 변경 시 다음과 같은 에러가 발생했다.
no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[1]/link[2]"}
→ Youtube 페이지의 정보를 정상적으로 읽어오지 못한 문제가 발생했다.
해결 시도
참고) 요소가 뜰 때까지 기다린다거나 time.sleep을 한다거나 하는 이슈는 모두 실패로 돌아갔습니다.
Change window size
linux에서 모바일 사이즈의 창으로 변경되면서 Window size에 영향을 받는 요소들이 나타났다.
따라서 윈도우 사이즈를 조정해서 해결을 시도하였다.
chrome_options.add_argument("--window-size=1920,1080")
→ 결과는 실패.. 다른 원인이 있는 것 같다.
참고로 linux에서는 chrome_options.add_argument("--start-maximized") 옵션이 적용되지 않는다고 한다.
Blocks ‘headless’ mode
headless모드로 크롤링을 수행하면 user_agent가 자동으로 HeadlessChrome으로 변경되어 수행된다고 한다.
그런데 특정사이트에서는 이를 막아두는 경우가 발생한다고 하니.. 다음 블로그를 참고하여 user_agent를 하드코딩 해주었다.
user_agent = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36
chrome_options.add_argument(f'user-agent={user_agent}')
[Debuging] Selenium을 이용한 자동 로그인 모듈에서 Headless 모드에서만 No Such Element 에러 날 때
[Debuging] Selenium 을 이용한 자동 로그인 모듈에서 Headless 모드에서만 No Such Element 에러 날때
Selenium을 이용해서 구글에 자동로그인을 하는 프로그램을 만들던 도중 그냥 할때는 잘되는데, Headless 설정만 해주면 Element들을 못 찾는 문제가 발생했다 . 왜 그런지 검색을하다가 알게된 사실은
devkingdom.tistory.com
→ 이것도 실패했다..
SSL 인증서 무시
잘못된 ssl 인증서가 원인이 될 수 있다는 글을 보았다. 따라서 다음 옵션으로 인증서를 무시하고 진행하도록 했다.
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--allow-running-insecure-content')
→ 실패
Proxy 적용(추가)
Azure에서 크롤링이 안되면 프록시를 사용해서 우회해보자 라는 생각으로 도전했습니다.
무료 프록시를 넣어서 수행해 보았으나..
https 접속을 막은 프록시들도 많았으며, 구글에서도 대부분의 프록시 접속을 제한해 둔 상태였습니다.
chrome_options.add_argument("--proxy-server='proxy_ip:port'")
→ 실패!
추가적으로 적용 가능한 옵션들
연이은 실패에 힘입어..(?) extension을 사용하지 않는다던가 프록시서버 옵션을 넣어준다던가 추가적으로 다른 사람들이 진행했다는 옵션들을 모두 가져와 넣어주었다..
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--proxy-bypass-list=*")
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--no-sandbox')
→ 실패..
결과적으로 시도한 모든 방법들이 실패했다…
결과
로컬에서 진행 시 무리없이 작동하였으나, ec2나 azure VM에서 에러가 발생했다.
IP주소가 원인이라 생각하는데 프록시까지 사용해서 크롤링을 수행하기에는 무료 프록시의 경우 대다수가 막혀있어 의미가 없다.
youtube의 경우 API를 지원하니 이를 이용해서 데이터를 수집하면 될것같다.
셀레니움에서 적용가능한 옵션들을 나열해두어 나중에 사용할 기회가 있다면 위 옵션들을 참고하면 좋을 듯 하다.
참고 문헌
[Debuging] Selenium 을 이용한 자동 로그인 모듈에서 Headless 모드에서만 No Such Element 에러 날때
[Debuging] Selenium 을 이용한 자동 로그인 모듈에서 Headless 모드에서만 No Such Element 에러 날때
Selenium을 이용해서 구글에 자동로그인을 하는 프로그램을 만들던 도중 그냥 할때는 잘되는데, Headless 설정만 해주면 Element들을 못 찾는 문제가 발생했다 . 왜 그런지 검색을하다가 알게된 사실은
devkingdom.tistory.com
Making Chrome Headless Undetectable
Making Chrome Headless Undetectable
Using MitmProxy and injected JavaScript feature mocks to bypass Headless Chrome detection tests.
intoli.com
Headless is Going Away!
Now that we got your attention, headless is not actually going away, just the convenience method to set it in Selenium
www.selenium.dev
Unable to locate elements on webpage with headless chrome
Unable to locate elements on webpage with headless chrome
I have a script that's accessing printers, and my code works totally fine when chrome is run normally, but when it's run headless, selenium can't seem to find elements on the webpage. Here's the
stackoverflow.com
'Python' 카테고리의 다른 글
Web Scraping - python (1) | 2024.03.15 |
---|