实例是一个把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
把复制下来的路径直接粘贴在对应方法的单引号内(建议单引号内,否则还要重新更改引号)
这里面有几点注意事项
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
请往上找是否可以看到这个 #document,这个说明你XPATH的地址在别一个子网页里面
问题1 解决方法
# 切换次页面,更多说明可直接百度方法名switch_to.frame
web.switch_to.frame("mainFrame")
# 退出次页面的方法
web.switch_to.parent_frame()
问题2
发现复制了id以后,这个数字是随机的,class也是相同的
问题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配置方法指导
完整代码地址
本人的经验分享,希望可以帮助到你们,如何不对的地方,可以评论留言,帮我指正一下,如果帮助了你,请给我点个赞吧