python网络数据采集-处理重定向问题

来源:互联网 发布:监测游戏帧数软件 编辑:程序博客网 时间:2024/06/11 00:42

第一部分:客户端重定向VS服务器端重定向    

        客户端重定向是在服务器将页面内容发送到浏览器页面之前,由浏览器执行JavaScript完成的页面跳转,而不是服务器完成的跳转。当使用浏览器访问页面的时候,有时候很难区分这两种跳转。由于客户端重定向执行很快,加载页面是你甚至感觉不到任何延迟,所以会让你觉得这个重定向就是一个服务器端重定向。

        但是,在进行网络数据采集的时候,这两种重定向的差异是非常明显的。根据具体情况,服务器端重定向一般都可以轻松地通过Python的urllib库解决,不需要使用Selenium。客户端重定向却不能这样处理,除非你有工具可以执行JavaScript。

第二部分:实战

       Selenium可以执行这种JavaScript重定向,和它处理其他JavaScript的方式一样;但是这类重定向的主要问题是什么时候停止页面监控,也就是说,怎么识别一个页面已经完全重定向。在http://pythonscraping.com/pages/javascript/redirectDemo2.html的示例页面是客户端重定向的例子,有两秒的延迟。

      我们可以用一种智能的方法来检测客户端重定向是否完成,首先从页面开始加载时就“监视”DOM中的一个元素,然后重复调用这个元素直到Selenium抛出一个StaleElementReferenceException异常;也就是说,元素不在页面的DOM里了,说明这是网站已经跳转。

    实例代码如下:

from selenium import webdriverimport timefrom selenium.webdriver.remote.webelement import WebElementfrom selenium.common.exceptions import StaleElementReferenceExceptiondef waitForLoad(driver):    elem=driver.find_element_by_tag_name("html")    count=0    while True:        count +=1        if count >20:            print("Timing out afer 10 seconds and returning")            return        time.sleep(.5)        try:            elem=driver.find_element_by_tag_name("html")        except StaleElementReferenceException:            returndriver=webdriver.PhantomJS(executable_path='/usr/bin/phantomjs')driver.get("http://pythonscraping.com/pages/javascript/redirectDemo2.html")waitForLoad(driver)print(dirver.page_source)                
执行结果如下:


这个程序没半秒钟检查一次网页,看看html标签还在不在,时限为10秒钟,不过检查时间间隔和时限都可以根据实际情况随意调整。

原创粉丝点击