第一部分:客户端重定向VS服务器端重定向
客户端重定向是在服务器将页面内容发送到浏览器页面之前,由浏览器执行JavaScript完成的页面跳转,而不是服务器完成的跳转。当使用浏览器访问页面的时候,有时候很难区分这两种跳转。由于客户端重定向执行很快,加载页面是你甚至感觉不到任何延迟,所以会让你觉得这个重定向就是一个服务器端重定向。
但是,在进行网络数据采集的时候,这两种重定向的差异是非常明显的。根据具体情况,服务器端重定向一般都可以轻松地通过Python的urllib库解决,不需要使用Selenium。客户端重定向却不能这样处理,除非你有工具可以执行JavaScript。
第二部分:实战
Selenium可以执行这种JavaScript重定向,和它处理其他JavaScript的方式一样;但是这类重定向的主要问题是什么时候停止页面监控,也就是说,怎么识别一个页面已经完全重定向。在http://pythonscraping.com/pages/javascript/redirectDemo2.html的示例页面是客户端重定向的例子,有两秒的延迟。
我们可以用一种智能的方法来检测客户端重定向是否完成,首先从页面开始加载时就“监视”DOM中的一个元素,然后重复调用这个元素直到Selenium抛出一个StaleElementReferenceException异常;也就是说,元素不在页面的DOM里了,说明这是网站已经跳转。
实例代码如下:
from selenium import webdriver
import time
from selenium.webdriver.rem