Selenium 突破网站反爬虫
今天在使用 Selenium以及谷歌浏览器进行爬虫的时候被拦截了。在查阅资料后得出解决方法如下:
方法一
换用火狐浏览器
from selenium import webdriver url = "SOME URL YOU WANT TO SCRAPE" user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15" profile = webdriver.FirefoxProfile() profile.set_preference("general.useragent.override", user_agent) driver = webdriver.Firefox(firefox_profile=profile) # Create a new instance of the Firefox driver driver = webdriver.Firefox() driver.get(url)
备注:
方法二
使用Chrome浏览器的开发者选项
from selenium import webdriver ua=Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A403 MicroMessenger/6.3.27 NetType/WIFI Language/zh_CN options=webdriver.ChromeOptions() options.add_argument(user-agent= + ua) options.add_experimental_option(useAutomationExtension, False) options.add_experimental_option(excludeSwitches, [enable-automation]) driver=webdriver.Chrome(options=options) driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, webdriver, { get: () => undefined }) """ }) driver.get(url)
关键部分是 driver.execute_cdp_cmd Selenium被监测出来一般是在JS代码里判断,加上execute_cdp_cmd后面的这句话就好了。
为什么这一段代码有用呢?这里简单做一下说明
最广为人知的识别是否是selenium的方法就是window.navigator.webdriver,当浏览器被打开后,js就会给当前窗口一个window属性,里面存放着用户的各种"信息"。 更多的,如果是用户访问,那么 window.navigator.webdriver的值就是 ‘undefined’。如果是selenium操纵浏览器访问,那么 window.navigator.webdriver的值就是 ’true’
明白了这个原理,我们可以轻松写出一段反爬程序:
<script> if(window.navigator.webdriver == true){ document.write("<span>看到这段就代表你是爬虫</span>") }else{ document.write("<span>真正的信息在这儿呢</span>") } </script>
而刚刚所说的爬虫的关键部分,就是更改了 true为 undefined,使得我们可以骗过浏览器。
结语
爬虫真的是如同任何一门学问,非常博大精深。入门很容易,但是想要学得好、能指哪里爬哪里,还有很长的路要修炼。感觉精通爬虫的人需要把网络TCP那一套和前后端的基础全部都练会吧。要学的库和用法也是非常多的。