使用python来完成对QQ邮箱文件中转站的文件下载链接的获取

使用python来完成对QQ邮箱文件中转站的文件下载链接的获取,第1张

文章目录
  • 前言
  • 一、所使用的工具
  • 二、明确目标以及分析步骤
    • 1.明确目标
    • 2.分析步骤
  • 三、开始写代码
    • 0.引入库+创建csv文件
    • 1.登陆QQ邮箱
    • 2.进入文件中转站
    • 3.进入新标签页
    • 4.进入分享页面获取文件下载地址
    • 5.关闭分享页面,返回文件中转站
    • 6.合并小步骤,增加一些细节,得到完整代码
  • 总结


前言

最近使用QQ邮箱中的文件中转站来生成一些文件的外部链接,然后发现,在中转站中下载文件容易,但是想要取得它的外部链接就有些困难,而且文件数量还挺多,所以我就想使用python来对文件中转站的文件下载地址进行批量获取。


一、所使用的工具

1.python3.9
2.pycharm2021
3.Chrome浏览器+对应版本的驱动

谷歌浏览器下载:
[https://www.google.cn/intl/zh-CN/chrome/]
如果有chrome驱动安装有问题的可以浏览下面网站:
https://blog.csdn.net/n123456uo/article/details/91412740
如果没有找到自己谷歌浏览器对应驱动版本,可以访问下面链接来查找与自己浏览器版本对应的驱动版本:
https://chromedriver.storage.googleapis.com/LATEST_RELEASE_+自己谷歌浏览器的版本号码
例如:谷歌浏览器版本号码为88.0.4324,就访问https://chromedriver.storage.googleapis.com/LATEST_RELEASE_88.0.4324

二、明确目标以及分析步骤 1.明确目标


目标:将上图的88份文件的下载地址爬取下来存放在csv表格中

2.分析步骤

三、开始写代码 0.引入库+创建csv文件

库代码如下:

import selenium
from selenium import webdriver
import pyperclip
import os
import time
import warnings
import csv

创建csv文件代码如下:


# <--------------------0.新建一个表格‘文件中转站下载链接’-------------------->
f=open('文件中转站下载链接.csv',mode='w',encoding='utf-8',newline='')
# 设置好列名
csv_writer=csv.DictWriter(f,fieldnames=['序号','标题','链接'])
csv_writer.writeheader()#自动写入表头

1.登陆QQ邮箱

两种方式(推荐下面两位大神的博客):
方式1:填充账号密码
方式2:使用cookie免密登陆
我使用的是方式1,因为在使用方式2的时候发现当天使用正常,但隔天就无法登陆,又需要重新获取一次cookie(不知道是啥原因)

具体代码如下(下方代码借鉴自:https://blog.csdn.net/zhengyizyp/article/details/103508939):


browser = webdriver.Chrome()
# <--------------------1.登陆qq邮箱------------------------------>
browser.get('https://mail.qq.com/')
# 定位login_frame
browser.switch_to.frame("login_frame")

# 定位账号、密码,并输入
browser.find_element_by_xpath('//*[@id="u"]').send_keys("qq号")
browser.find_element_by_xpath('//*[@id="p"]').send_keys("qq密码")
# 定位登录按钮
browser.find_element_by_xpath('//*[@id="login_button"]').click()
# 离开login_frame
# browser.switch_to.parent_frame()
browser.switch_to.default_content()
# 等待一秒
time.sleep(1)


2.进入文件中转站

在输入完账号密码之后,qq邮箱有可能会进行身份核验,如下图:

对于出现这种情况,我在代码中使用了异常处理,使得当此情况出现使用者可以在60s之内完成手机验证码输入或者刷新页面之后使用手机qq扫码登陆。代码如下

try:
   #点击文件中转站按钮来进入文件中转站
   browser.find_element_by_css_selector('#folder_ftn').click()
   #以下四行异常处理代码是为了应对有些时候QQ邮箱在qq号和密码登陆后出现身份验证的情况,
   #所以留出60s的时间来完成人工的登陆,60s之后程序会继续运行
except selenium.common.exceptions.NoSuchElementException:
   print('请输入手机验证码或刷新页面使用qq扫码登陆')
   time.sleep(60)
   browser.find_element_by_css_selector('#folder_ftn').click()

在登陆完成之后,我们就可以正式进入‘文件中转站’了(在邮箱首页点击文件中转站)

在此页面,虽然可以看到每个文件都有一个下载按钮,但是在浏览器‘检查’中并没有能够在此页面找到这些文件的下载地址,所以我们需要进入到每个文件的分享页面来获取其对应的下载地址。

得到分享页面的链接的具体步骤
1.点击‘更多’按钮
2.点击d出的复制链接按钮(复制链接成功网页会有提示)


具体代码如下

 for i in range(len(lis)):

      time.sleep(2)
      # 此处每一次循环都要定位到文件栏中的‘更多’按钮,是因为后面步骤会进入新的标签页,然后再回来文件中转站,
      # 在回来的时候文件中转站进行了刷新,之前定位到信息的已经无法再找到对应的按钮了,所以需要每一次循环定位一次
      list_li = browser.find_elements_by_css_selector('.ftn_content_table_tbody_row .ftn_content_table_tbody_operationTd .xm_dropdown i')
      temp_lis=list_li[i]
      # 点击‘更多’按钮
      temp_lis.click()
      # 打开每一个文件的分享链接
      #点击完成后网页会提示链接已复制到剪切板
      browser.find_element_by_css_selector('#dropdownInner > div:nth-child(2) > div:nth-child(1) > div').click()
    


3.进入新标签页

在复制链接后,我们需要新建标签页,然后访问链接

 
      # <--------------------3.进入新标签页------------------------------>
       #点击完成后网页会提示链接已复制到剪切板,所以我需要新建一个标签页(随便啥网站都行,这里就选了百度)
      browser.execute_script('window.open("https://www.baidu.com/")')
      # 进入新标签页
      browser.switch_to.window(browser.window_handles[1])
      # 从剪切板里获取分享链接
      v=clipboard_get()
      print('第',number,'个分享链接为:'+v)
      #前往分享界面
      browser.get(v)
      time.sleep(1)
4.进入分享页面获取文件下载地址

进入到文件分享页面后,我们就可以非常容易地取得文件的下载地址了。

具体代码如下


      # <--------------------4.进入分享链接页面------------------------------>
      #在分享页面获取真正的下载地址
      dizhi=browser.find_element_by_css_selector('.ftn_content_file_operation > a').get_attribute('href').replace('https://wx.mail.qq.com/ftn/%3C*@HtmlEncode(','')
      dizhi=dizhi.replace(')*%3E','')#获取时需要处理一下
      #获取文件的标题
      biaoti=browser.find_element_by_css_selector('.ftn_content_file_name').text
      # 打印一下文件情况
      print("第",number,"个的标题是:"+biaoti+",下载地址是:"+dizhi)
      # 将数据写入csv中
      dit={
         '序号':number,
         '标题':biaoti,
         '链接':dizhi
      }
      csv_writer.writerow(dit)
5.关闭分享页面,返回文件中转站

具体代码如下

 # <--------------------5.关闭分享链接页面,返回文件中转站------------------------------>

      browser.close()#关闭分享页面
      browser.switch_to.window(browser.window_handles[0])#回到文件中转站页面
      time.sleep(1)
      browser.switch_to.frame("mainFrame")#回到文件中转站页面的mainFrame框架中
      time.sleep(1)
      number=number+1#文件序号加一

6.合并小步骤,增加一些细节,得到完整代码

完整代码如下

# -*- codeing = utf-8 -*-
# @Author :howeverkeep
# @Time : 2022/5/7 14:41
# @Software: PyCharm
import selenium
import pyperclip
from selenium import webdriver
import os
import time
import warnings
import csv

# 获取剪贴板数据
def clipboard_get():
   data = pyperclip.paste()
   return data

#忽略‘DeprecationWarning’警告
warnings.filterwarnings("ignore",category=DeprecationWarning)

# <--------------------0.新建一个表格‘文件中转站下载链接’-------------------->
f=open('文件中转站下载链接.csv',mode='w',encoding='utf-8',newline='')
# 设置好列名
csv_writer=csv.DictWriter(f,fieldnames=['序号','标题','链接'])
csv_writer.writeheader()#自动写入表头


browser = webdriver.Chrome()
# <--------------------1.登陆qq邮箱------------------------------>
browser.get('https://mail.qq.com/')
# 定位login_frame
browser.switch_to.frame("login_frame")

# 定位账号、密码,并输入
browser.find_element_by_xpath('//*[@id="u"]').send_keys("qq号")
browser.find_element_by_xpath('//*[@id="p"]').send_keys("qq密码")
# 定位登录按钮
browser.find_element_by_xpath('//*[@id="login_button"]').click()
# 离开login_frame
# browser.switch_to.parent_frame()
browser.switch_to.default_content()
# 等待一秒
time.sleep(1)


# <--------------------2.进入文件中转站------------------------------>
try:
   #点击文件中转站按钮来进入文件中转站
   browser.find_element_by_css_selector('#folder_ftn').click()
except selenium.common.exceptions.NoSuchElementException:
   print('请输入手机验证码或刷新页面使用qq扫码登陆')
   time.sleep(60)
   browser.find_element_by_css_selector('#folder_ftn').click()

# 您想要获取的页面的数量
pagenuber=2
#文件序号,方便整理
number=1
#每一文件栏的更多按钮位于‘mainFrame’框架中,需要切换到‘mainFrame’中
browser.switch_to.frame("mainFrame")

for page in range(pagenuber):
   # 获取当前页面的文件数量
   time.sleep(2)#注意!要等待页面加载出来,否则会出现元素找不到的错误
   #定位到文件栏中的‘更多’按钮,通过页面中‘更多’按钮的个数来知道本页面存有多少文件
   lis=browser.find_elements_by_css_selector('.ftn_content_table_tbody_row .ftn_content_table_tbody_operationTd .xm_dropdown i')
   print('此页面有'+str(len(lis))+'个文件')


   for i in range(len(lis)):

      time.sleep(2)
      # 此处每一次循环都要定位到文件栏中的‘更多’按钮,是因为后面步骤会进入新的标签页,然后再回来文件中转站,
      # 在回来的时候文件中转站进行了刷新,之前定位到信息的已经无法再找到对应的按钮了,所以需要每一次循环定位一次
      list_li = browser.find_elements_by_css_selector('.ftn_content_table_tbody_row .ftn_content_table_tbody_operationTd .xm_dropdown i')
      temp_lis=list_li[i]
      # 点击‘更多’按钮
      temp_lis.click()
      # 点击每一个文件的分享链接
      browser.find_element_by_css_selector('#dropdownInner > div:nth-child(2) > div:nth-child(1) > div').click()
      
       # <--------------------3.进入新标签页------------------------------>
      #点击完成后网页会提示链接已复制到剪切板,所以我需要新建一个标签页(随便啥网站都行,这里就选了百度)
      browser.execute_script('window.open("https://www.baidu.com/")')
      # 进入新标签页
      browser.switch_to.window(browser.window_handles[1])
      # 从剪切板里获取分享链接
      v=clipboard_get()
      print('第',number,'个分享链接为:'+v)
      #前往分享界面
      browser.get(v)
      time.sleep(1)


      # <--------------------4.进入分享链接页面------------------------------>
      #在分享页面获取真正的下载地址
      dizhi=browser.find_element_by_css_selector('.ftn_content_file_operation > a').get_attribute('href').replace('https://wx.mail.qq.com/ftn/%3C*@HtmlEncode(','')
      dizhi=dizhi.replace(')*%3E','')#获取时需要处理一下
      #获取文件的标题
      biaoti=browser.find_element_by_css_selector('.ftn_content_file_name').text
      # 打印一下文件情况
      print("第",number,"个的标题是:"+biaoti+",下载地址是:"+dizhi)
      # 将数据写入csv中
      dit={
         '序号':number,
         '标题':biaoti,
         '链接':dizhi
      }
      csv_writer.writerow(dit)
      # <--------------------5.关闭分享链接页面,返回文件中转站------------------------------>

      browser.close()#关闭分享页面
      browser.switch_to.window(browser.window_handles[0])#回到文件中转站页面
      time.sleep(1)
      browser.switch_to.frame("mainFrame")#回到文件中转站页面的mainFrame框架中
      time.sleep(1)
      number=number+1#文件序号加一

   try:
      #点击下一页按钮进行翻页
      browser.find_element_by_css_selector('.xm_icons.xm_icons_RightArrow.ftn_content_toolbar_pageNav_next').click()
   except selenium.common.exceptions.NoSuchElementException:
      print("已经到达最后一页")
      break

# browser.quit()#退出浏览器
#这里退出浏览器可以使用browser.quit(),也可以用下面两行代码
os.system('taskkill /im chromedriver.exe /F')#关闭谷歌浏览器驱动
os.system('taskkill /im chrome.exe /F')#关闭谷歌浏览器

f.close()#关闭.csv文件
print("程序运行完毕")

等待程序执行完毕,然后就可以看到文件夹里有了一份csv表格


总结

这次的代码虽然不长,但还是需要注意框架的切换和标签页,以及等待网页加载的时间这些细节。

然后,非常感谢https://blog.csdn.net/zhengyizyp/article/details/103508939这篇文章,它给了我许多的启发与想法。

最后,希望这篇博客能给同学们带来一点收获,感谢阅读~

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/943429.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-18
下一篇 2022-05-18

发表评论

登录后才能评论

评论列表(0条)

保存