关于使用selenium免登陆爬取网页时,自动跳转登录页面从而导致写cookie失败的解决办法

【问题描述】

在我想要用selenium写入cookie实现免登录爬取某个网页时,遇到了麻烦。因为这个网站的登录界面和登录后的界面的域名不一样。比如(举例非真实):
登录前的登录界面可能是>>>www.xxbaidu.com/
登录后的会变化成>>>www.baidu.com/
这就导致了一个问题,selenium写入cookie时必须先打开这个网页,然后再写入cookie,这样selenium才知道写入的是哪个域名的cookie。
而在我想要打开登录后的页面【baidu.com/】写入cookie时,页面会自动跳转【xxbaidu.com/】,这样cookie就被写入到登录前的域名里面,此时再刷新打开登录后的界面【baidu.com/】,由于cookie并没有写入这个域名里面,因此导致免登录失败,还是未登录状态!

【寻找解决方法】

我翻遍了国内外的论坛,有很多种思路,但是都没有好的解决办法,主要有以下几种:
1.禁止域名重定向
很可惜,selenium到目前为止的版本里面,并没有提供任何的设置选项来禁止重定向。(网上有的办法我都试了,根本不行。)

2.先打开一个错误网页,如404等
在selenium里面先打开一个登录后的错误页面,如:www.xxbaidu.com/404等不会重定向到登录界面的网址,从而实现写入cookie到正确的域名里面。
这个方法是可行的,可惜我要爬取的网站里面并没有找个这样一个错误网址,只能放弃!

3.使用多线程在selenium重新定向到登录界面前,中止selenium的动作,然后再写入
会的大神可以试试,我是觉得太过于复杂。

4.打开selenium后并不使用get()方法打开网址,而是把网址输入到地址栏
同样的我也并没有找到这样的selenium设置选项,并且也没有找到可以使用os等库可以实现的方法。

5.在selenium打开网址后手动在键盘上按ESC键中断浏览器加载
需要手动按键也就失去了免登录自动化的意义。况且如果要使用Python win32api模拟按键的话,依然需要使用多线程,不然没有意义,太过复杂。

6.超时自动中断加载
driver.set_page_load_timeout(2)
driver.set_script_timeout(2)
设置一个短的时间,超过这个时间自动中断加载,然后再写入cookie
该方法我试了,没有卵用!

【最终解决方法】

根据5和6的方法,我重新设计了一下,终于解决了这个问题。
思路:既然selenium只是通过地址栏里面的域名来写入cookie的,那么我们只需要通过某种方法来中断selenium 的加载使地址栏保持登录后的域名网址即可。这个方法就是python的try except的异常捕捉方法!
上代码:

    try:
        browser.set_page_load_timeout(2)
        # 设置cookies前必须访问一次登录的页面
        browser.get(base_url)
    except:
        browser.set_page_load_timeout(10)
        with open("cookies.txt", "r") as fp:
            cookies = json.load(fp)
            for cookie in cookies:
                cookie.pop('domain')  # 如果报domain无效的错误
                browser.add_cookie(cookie)

        browser.get(base_url)

在try里面:
用set_page_load_timeout(2)方法里面设置一个短时的时间,使selenium超过2s还没加载出来的时候直接报异常,中止程序,此时selenium地址栏里面就会保持登录后的域名地址
这个时间2s可以根据自己的电脑性能自行修改,太短可能还没打开网址就终止了,时间太长可能已经跳转到登录界面了。我用我的电脑经过测试,2s是最合适的时间。
在except里面:
刚才在地址栏里面保留我们想要的域名了,现在在这个里面才是我们想要运行的主程序,先写入cookie,然后在打开登录后的界面,发现免登录成功!

---- 完!----

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
Selenium是一个自动化测试工具,可以用来模拟用户在浏览器上的操作。通过使用Selenium,可以实现自动爬取网页数据的功能。 以下是使用Selenium自动爬取网页数据的步骤: 1. 安装Selenium Selenium可以使用Python的pip包管理工具进行安装,可以使用以下命令进行安装: ``` pip install selenium ``` 2. 安装浏览器驱动 Selenium需要使用浏览器驱动来控制浏览器。不同的浏览器需要不同的驱动程序。例如,如果要使用Chrome浏览器,需要下载Chrome驱动程序。 3. 启动浏览器 在Python代码中,可以使用Selenium来启动浏览器。例如,以下代码可以启动Chrome浏览器: ``` from selenium import webdriver driver = webdriver.Chrome() ``` 4. 访问网页 使用Selenium启动浏览器后,可以使用`get()`方法访问网页。例如: ``` driver.get("https://www.baidu.com") ``` 5. 查找元素 在访问网页后,可以使用Selenium查找网页上的元素。例如,可以使用`find_element_by_xpath()`方法查找页面上的元素。例如: ``` element = driver.find_element_by_xpath("//input[@name='wd']") ``` 6. 操作元素 找到元素后,可以使用Selenium来模拟用户在浏览器上的操作。例如,可以使用`send_keys()`方法来向输入框中输入文本: ``` element.send_keys("Python") ``` 7. 爬取数据 在操作完网页上的元素后,可以使用Selenium来爬取数据。例如,可以使用`find_element_by_xpath()`方法来查找页面上的数据,并使用`text`属性获取文本: ``` result = driver.find_element_by_xpath("//div[@class='result']") print(result.text) ``` 8. 关闭浏览器 在爬取完数据后,使用Selenium关闭浏览器: ``` driver.quit() ``` 以上就是使用Selenium自动爬取网页数据的步骤。需要注意的是,爬取网页数据需要遵守网站的爬虫协议,不要对网站造成过大的负担。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值