0%

用Selenium绕过反爬机制登录知乎

很久很久很久之前写过一个把知乎的收藏夹里面的回答用邮件的方式发送到Evernote/印象笔记/OneNote/有道云笔记的功能;
后来一直没有维护、最近发现在Github上有留言、希望能继续维护、因为知乎改版之后那个功能就不能用了。

以前的版本我是用RequestsBeautifulSoup来抓取数据、最近在重新写的时候发现用requests访问知乎时、直接返回个status_code 400; 一点数据都拿不到、应该是做了反爬处理了。

该selenium上场了

Selenium是一款用于做Web测试自动化的框架、也就是软件测试工程师用来测试网页在浏览器上是否正常;
大部分时候用于做Web的回归测试自动化。
只要人在浏览器上能做的事情、都可以用selenium来实现

第一个selenium登录版本

思路很简单
访问:https://www.zhihu.com/signin?next=%2F
输入帐号和密码
点击登录按钮就可以了

具体代码、很简单的几行代码就能搞定

from selenium import webdriver
url = 'https://www.zhihu.com/signin?next=%2F'
br = webdriver.Chrome()
br.get(url)
# 定位帐号密码以及登录按钮位置
br.find_element_by_name('username').send_keys('sam.hxq@gmail.com')
br.find_element_by_name('password').send_keys('密码')
br.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[2]/div[1]/form/button').click()

当运行代码的时候发现、帐号密码输入正常、但是点击登录按钮后、一直没有登录上去
selenium登录知乎失败

我们来解释一下什么原理

当我们用selenium访问网站的时候、其实只要简单的一行JS代码就能知道、访问客户端是否是真人;

window.navigator.webdriver

我们在Console下运行上面的代码、看返回值就能知道、如果返回Ture那么说明是用selenium访问;否则会返回undefined

这个是用selenium访问的网站

下面这张是正常打开的

从上面的图片可以看出来、用一行JS代码就可以辨别是否是selenium了、当然就可以很简单的对这些用selenium的请求进行处理。

下面我们来说说解决方案

这个时候就需要祭出我们的杀器chromeOptions

chromeOptions是啥?

chromeOptions是一个配置Chrome启动属性的类;
对应的也有`FirefoxOptions`;就是配置Firefox启动属性的类、大家举一反三的去找selenium支持的浏览器

我们看看chromeOptions能做啥?

  • 添加扩展应用 (add_extension)
  • 添加启动参数 (add_argument)
  • 配置代理(setHttpProxy)
  • 具体支持的功能可以看ChromeDriver官网

第二个知乎登录代码版本

from selenium import webdriver

url = 'https://www.zhihu.com/signin?next=%2F'
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])   # 设置浏览器为开发者模式
br = webdriver.Chrome(options=options)
br.get(url)
# 定位帐号密码以及登录按钮位置
br.find_element_by_name('username').send_keys('sam.hxq@gmail.com')
br.find_element_by_name('password').send_keys('密码')
br.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[2]/div[1]/form/button').click()

运行上面的代码、我们就能开开心心的登录知乎了

从截图我们看到 Chrome会提示你在用开发者模式运行、不要管他;

总结一下

  • 当我们用selenium打开浏览器去访问网站的时候、是带着标识过去的
  • 网站可以用简单的JS代码就能判别出来是否是selenium
  • 所以我们可以用chromeOptions配置开发者模式跳过这个问题
  • 到目前为止 2019-04-19 可以通过此方式登录知乎

相关网站