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那一套和前后端的基础全部都练会吧。要学的库和用法也是非常多的。
