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

经验分享 程序员 微信小程序 职场和发展