【Python爬虫】动态网页爬虫构建,selenium库简单使用,PC端QQ腾讯文档自动打卡爬虫完整项目

提前了解

  • 开发者工具:windows系统下,浏览器一般都有开发者工具,这能帮助我们分析网页的元素、提取网页中的目标信息。在目标网页启用工具有两种方式,分别是鼠标右键“检查”选项三点菜单—更多工具—开发人员工具(F12键也行,读者可通过浏览器设置开启“开发人员模式”尝试,但我的好像坏了),如下图:

在这里插入图片描述
在这里插入图片描述
  启用开发者工具后如下图:

在这里插入图片描述

  • 动态网页:就是不对网页进行操作(点击、滚动等),网页上某些元素就处于隐藏状态,这时使用requests库无法获取这些隐藏信息。有些网页的结构是一个frame套着一个frame,比如进入QQ音乐官网就是一个frame,点击“登录”后出现小一点的登录界面,就是一个新frame嵌在里面,但是不点击“登录”开发者工具也看不到,
  • selenium库:可以模拟人完成一些对网页的事件,如点击、滚动、键入信息等。因此可以用来读取动态网页的信息。不过还需搭配浏览器驱动webdriver,需要下载的读者请点击:selenium库支持的几种浏览器。对于其他浏览器,读者可以利用代码提示功能在语句“webdriver”后查看,如果没有,自行搜索如何下载对应驱动。
  • 使用selenium库做爬虫的常用语句:
    • 打开浏览器(Edge为例)
      from selenium import webdriver
      browser = webdriver.Edge()
      
    • 访问url
      browser.get(url)
      
    • 找目标元素
      from selenium.webdriver.common.by import By
      element = browser.find_element(By.CLASS_NAME, 'qq')
      # By里面有XPATH、ID、NAME等其他匹配方式
      
    • 转换frame
      browser.switch_to.frame(new_frame) 
      
    • 回到父frame
      browser.switch_to.parent_frame()
      
    • 关闭浏览器
      browser.quit()
      

分析

  逐步分析PC端QQ腾讯文档打卡的网页,与在QQ直接打开打卡链接不同的是,使用selenium打开的网页需要登录腾讯文档。由此,以Edge浏览器为例,启动开发者工具,开始分析打卡过程中网页内容的变化。
  首先使用selenium和安装的浏览器驱动打开QQ腾讯文档打卡链接,如下图:

图1
  使用开发者工具分析如下:
图3

注意:可以点击黑色圆圈中的图标,再点击网页上的目标元素,即可迅速在工具中定位出目标代码,如红色圈住的部分!
  需要先登录才能打卡,因此需要点击“登录腾讯文档”,在工具中可以看出目标元素“登录腾讯文档”具有“id”和“class”等属性,可以用来定位代表“登录腾讯文档”的button。如果报错、定位不了,可以使用XPATH定位,在工具中使用快捷键“Ctrl + F”,出现搜索框,接着按照像“html”、“div”、“button”这样的元素标签,输入路径如下,相同的标签从1开始计使用“div[1]”表示,如下图:

图3

  在工具中XPATH路径正确,则目标元素如上图高亮,该路径就能在代码中用来定位。以上就是利用开发者工具定位目标元素的方法,后面不再赘述。
  点击“登录腾讯文档”,接着出现下图:

图2
  需要选择登录方式,我们选择点击中间的“QQ登录”,于是出现下图:

图3
  这里需要注意,下图中,在工具中出现两个红圈中的“iframe”标签,表明就是依次嵌套的两个子frame,因此必须转换frame才能定位到大红圈中的“密码登录”链接元素。当然,如果后面需要操作最外面的主frame的元素,必须回到主frame才能定位。

图

  点击“密码登录”,出现下图:

图2
  我们键入自己的QQ账号与密码,接着点击“登录”,出现下图:

图3
  此时点击“获取定位”,并点击“提交”,还会出现最后的确认界面如下:

图3
  点击“确认”,完成打卡。

代码

  以下代码非完整项目代码,不可直接复制使用,但“分析”部分提到的操作都实现了,读者需要定义代码中字符大写的变量并且也是同样的QQ腾讯文档打卡才可以直接使用。此外,我将代码包装成了PC-Windows版exe应用文件,可以实现每天自动打卡(我以前总是忘记打卡,就搞了个这么小东西),需要的读者可以看向源码部分,但是这里事先说明:因为个人能力有限且是在本人设备上(Windows11+Edge浏览器)开发的,所以我自己用的十分顺利;给我同学测试后,有不少问题,首先浏览器推荐Edge,其他的不建议,其次,前面提到的QQ登录极有可能因为网络环境、浏览器、设备等复杂原因导致登录出现验证码环节,然后失败,这里建议自己尝试登录,让浏览器“熟悉熟悉”你的QQ登录,记住快捷登录方式,这样就能自动登录打卡了。总之,还是我自己用的最没毛病,读者可能要“看运气”,哈哈哈

def login(browser=BROWSER):
    '''登录'''
    browser.get(URL)
    sleep(SLEEP_TIME)
    # 根据打卡url进入打卡网页
    button = browser.find_element(By.XPATH, 'html/body/div[9]/div[1]/div[1]/div[9]/div[1]/button')
    button.click()
    sleep(SLEEP_TIME)
    # 找到“登录腾讯文档”按钮并点击
    link1 = browser.find_element(By.CLASS_NAME, 'qq')
    link1.click()
    sleep(SLEEP_TIME)
    # 找到“QQ登录”选项并点击
    new_f = browser.find_element(By.ID, 'login_frame')
    browser.switch_to.frame(new_f)
    new_ff = browser.find_element(By.ID, 'ptlogin_iframe')
    browser.switch_to.frame(new_ff)
    sleep(SLEEP_TIME)
    # 通过开发者工具查看网页,下面的QQ“密码登录”选项在第三层frame
    # 将frame转换到第三层frame,不然找不到QQ登录界面的元素
    link2 = browser.find_element(By.ID, 'switcher_plogin')
    link2.click()
    sleep(SLEEP_TIME)
    # 找到QQ的“密码登录”选项并点击
    accout_in = browser.find_element(By.ID, 'uinArea')
    accout_in.click()
    sleep(SLEEP_TIME)
    # 找到账户名输入框并点击
    accout_in = browser.find_element(By.CLASS_NAME, 'inputstyle')
    accout_in.send_keys(ACCOUNT)
    sleep(SLEEP_TIME)
    # 进入账户输入框后输入账户名
    pass_in = browser.find_element(By.ID, 'pwdArea')
    pass_in.click()
    sleep(SLEEP_TIME)
    # 找到密码输入框并点击
    password_in = browser.find_element(By.ID, 'p')
    password_in.send_keys(PASSWORD)
    sleep(SLEEP_TIME)
    # 进入密码输入框后输入密码
    login_b = browser.find_element(By.CLASS_NAME, 'login_button')
    login_b.click()
    # 找到QQ的“登录按钮”并点击
    browser.switch_to.parent_frame()
    sleep(SLEEP_TIME)
    browser.switch_to.parent_frame()
    sleep(SLEEP_TIME)
    # 前面转换过两次frame,因此需要回退两次父frame
    link3 = browser.find_element(By.CLASS_NAME, 'location-btn')
    link3.click()
    sleep(5)
    # 点击“获取定位”
    link4 = browser.find_element(By.CLASS_NAME, 'question-commit')
    link4.click()
    sleep(5)
    # 点击“提交”
    link5 = browser.find_element(By.XPATH, '/html/body/div[16]/div/div[4]/button[2]')
    link5.click()
    # 点击最后的“确认”
    sleep(5)
    browser.quit()
    # 终止webdriver和一切网页进程

源码

  完整的项目源码

             创作不易,如果有所帮助,求点赞收藏!谢谢!

图3

  • 66
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值