zoukankan      html  css  js  c++  java
  • python selenium模拟登陆163邮箱。

    selenium是可以模拟浏览器操作。

    有些爬虫是异步加载的,通过爬取网页源码是得不到需要的内容。所以可以模拟浏览器去登陆该网站进行爬取操作。

    需要安装selenium通过pip install xxx安装,如果你使用的Anaconda3,可以使用conda install xxx这些都是可以

    值得一提的是,需要下载chromdriver,就是chrome浏览器的驱动。百度搜索下载,下载之前看你的chrome的版本是几,应该下载比你浏览器的版本更高的驱动版本。

    比如:我的chrome是74,那么你可以下载74以后的,75等。

    然后把chromedriver放在python安装程序主目录下,

    也就是说,你的python.exe在哪个目录,你把chromedriver放在那就可以了。

    import time
    
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    """
    使用selenium进行模拟登陆
    1.初始化ChromDriver
    2.打开163登陆页面
    3.找到用户名的输入框,输入用户名
    4.找到密码框,输入密码
    5.提交用户信息
    """
    name = 'xxxxxxxx'
    passwd = 'xxxxxx'
    driver = webdriver.Chrome()
    driver.get('https://mail.163.com/')
    # 将窗口调整最大
    driver.maximize_window()
    # 休息5s
    time.sleep(5)
    current_window_1 = driver.current_window_handle
    print(current_window_1)
    button = driver.find_element_by_id('lbNormal')
    button.click()
    
    driver.switch_to.frame(driver.find_element_by_xpath("//iframe[starts-with(@id, 'x-URS-iframe')]"))
    email = driver.find_element_by_name('email')
    #email = driver.find_element_by_xpath('//input[@name="email"]')
    email.send_keys(name)
    password = driver.find_element_by_name('password')
    #password = driver.find_element_by_xpath("//input[@name='password']")
    password.send_keys(passwd)
    submit = driver.find_element_by_id("dologin")
    submit.click()
    time.sleep(10)
    print(driver.page_source)
    driver.quit()

    问题:

    在使用过程中,始终iframe这个元素,提示driver.find_element_by_name找不到。

    然后通过chrome的开发者工具,找了iframe.如下图:

    邮箱输入框和密码输入框在iframe中。但是这个iframe id="x-URS-iframe156xxxxxx"后面的数字是一个时间戳。是唯一的,而且name竟然也是设置为“”,

    所以通过driver.find_element_by_name通过属性获取或者driver.find_element_by_id通过id获取都是提示找不到。

    那该怎么办???

    driver.find_element_by_xpath("//iframe[starts-with(@id, 'x-URS-iframe')]")
    通过使用xpath获取,并且是ids属性是“x-URS-iframe”开头的,就可以动态的获取这个iframe。

    问题来了,为什么要获取iframe。

    因为看代码有一个

    driver.switch_to.frame()

    切换界面,因为通过开发者工具可以看到,输入密码和用户名都是在iframe下,如果不切换到这个iframe.那么始终是找不到。
    还有一个问题就是,
    通过浏览器登陆163,开始显示的是一个扫描QRcode二维码进入邮箱。我们想要的是输入邮箱和密码的界面。
    所以代码中:
    button = driver.find_element_by_id('lbNormal')
    button.click()
    

      这个就是获取切换的界面的按钮,点击切换到输入界面。

    以下是模拟,仅供参考

     

     
  • 相关阅读:
    x64共享库中的位置无关代码(PIC)
    windows库的创建和使用:静态库+动态库
    溃烂中的代码
    微信考勤玩法曝光!
    Android自己定义ViewGroup(二)——带悬停标题的ExpandableListView
    WPF对象级资源的定义与查找
    java List转换和数组互转
    maven 打包构建相关命令
    java8 lambda表达式
    Mysql INSTR函数
  • 原文地址:https://www.cnblogs.com/hamish26/p/11236355.html
Copyright © 2011-2022 走看看