python爬虫(switch_to.frame、find_elements_by_tag_name等方法)新手分享,经验证可用

序言

实例是一个把QQ企业邮箱的发件箱转至收件箱的脚本,对中间一些自己刚学习到的方法进行分享

包引用

import time
from selenium import webdriver

登陆

这个函数是进行登陆操作,中间的减速,是为了让程序看起来更像是人在操作,服务器不会立刻判定你为爬虫;或因为爬虫运行是速度太快了,有时服务器会没反应过来(个人经验,不知道是否正确)

def mail_test(ip):

    # 用谷歌浏览器开启
    driver = webdriver.Chrome()
    # 进入指定QQ企业邮箱
    driver.get(ip)
    time.sleep(2)
    driver.find_element_by_xpath('//*[@id="loginForm"]/div[3]/div[4]/a').click()
    time.sleep(1)
    # 清空帐号框内的内容
    driver.find_element_by_xpath('//*[@id="inputuin"]').clear()
    time.sleep(1)
    # 输入指定帐号 user="abc"自己定义
    driver.find_element_by_xpath('//*[@id="inputuin"]').send_keys(user)
    time.sleep(1)
    # 输入密码 pwd="123"
    driver.find_element_by_xpath('//*[@id="pp"]').send_keys(pwd)
    time.sleep(2)
    # 点击登陆
    driver.find_element_by_xpath('//*[@id="btlogin"]').click()

	# 返回爬虫的内存地址
	return driver

关于xpath地址的提取
先按步骤操作找到对应的HTML的位置,然后点鼠标右键copy->Copy XPath
python爬虫(switch_to.frame、find_elements_by_tag_name等方法)新手分享,经验证可用_第1张图片
把复制下来的路径直接粘贴在对应方法的单引号内(建议单引号内,否则还要重新更改引号)
在这里插入图片描述

进行发件箱到收件箱的转移

这里面有几点注意事项

def mail_fa2shou(web):
    time.sleep(1)
    # 点击左侧发件箱
    web.find_element_by_xpath('//*[@id="folder_3"]').click()
    time.sleep(1)
    # 切换次页面
    web.switch_to.frame("mainFrame")
    # 下面的函数是判断收件箱是否还有邮件,返回True或False
    res = mail_count(web)
    while res:
        time.sleep(1)
        # 选择当页所有邮件
        web.find_element_by_xpath('//*[@id="frm"]/table/tbody/tr/td[1]/input').click()
        time.sleep(1)
        # 打开“移动至”下拉框
        web.find_element_by_xpath('//*[@id="selmContainer"]/div').click()
        time.sleep(1)
        # 选择收件箱
        web.find_element_by_xpath('//*[@id="select_s__menuitem_fid_1"]').click()
        time.sleep(1)
        # 重新判断收件箱是否还有邮件,返回True或False
        res = mail_count(web)
    # 退出浏览器
    web.quit()

问题解决讲解

你确定无误的找到了指定按键的XPATH的地址,但是程序始终报错,你还不是的寻找新的方法找寻指定按键的地址,其实问题的方向错了

Traceback (most recent call last):
  File "D:/STUDY/TestCode/爬虫测试/mail_test1.py", line 68, in 
    mail_fa2shou(wb)
  File "D:/STUDY/TestCode/爬虫测试/mail_test1.py", line 36, in mail_fa2shou
    res = mail_count(web)
  File "D:/STUDY/TestCode/爬虫测试/mail_test1.py", line 54, in mail_count
    table = web.find_element_by_xpath('//*[@id="frm"]/div[3]')
  File "D:\Program Files (x86)\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "D:\Program Files (x86)\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
    'value': value})['value']
  File "D:\Program Files (x86)\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "D:\Program Files (x86)\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="frm"]/div[3]"}
  (Session info: chrome=71.0.3578.98)
  (Driver info: chromedriver=70.0.3538.67 (9ab0cfab84ded083718d3a4ff830726efd38869f),platform=Windows NT 10.0.14393 x86_64)

问题1
python爬虫(switch_to.frame、find_elements_by_tag_name等方法)新手分享,经验证可用_第2张图片
请往上找是否可以看到这个 #document,这个说明你XPATH的地址在别一个子网页里面

问题1 解决方法

# 切换次页面,更多说明可直接百度方法名switch_to.frame
web.switch_to.frame("mainFrame")  

# 退出次页面的方法
web.switch_to.parent_frame()

问题2
发现复制了id以后,这个数字是随机的,class也是相同的
python爬虫(switch_to.frame、find_elements_by_tag_name等方法)新手分享,经验证可用_第3张图片
问题2 解决方法
复制上一层的ID,然后输入他的路径问题就解决了

# 打开“移动至”下拉框
web.find_element_by_xpath('//*[@id="selmContainer"]/div').click()

进行发件箱邮件判断

    # 进入指定位置
    table = web.find_element_by_xpath('//*[@id="frm"]/div[3]')
    # 获取指定位置所有关于“table”的数据
    t_rows = table.find_elements_by_tag_name("table")
    # 判断t_rows是否为空
    if len(t_rows) > 0:
        return True
    else:
        return False

爬虫无法正常打开谷歌浏览器或打开后运行不正常

请对照是否配置webdriver或版本是否正常

webdriver配置方法指导

完整代码地址


本人的经验分享,希望可以帮助到你们,如何不对的地方,可以评论留言,帮我指正一下,如果帮助了你,请给我点个赞吧

你可能感兴趣的:(程序分享)