关于Python Selenium自动化导出新版WOS(web of science)检索结果的问题

作者:Parzival_ 时间:2022-12-15 02:20:56 

selenium 介绍

selenium 是一个 web 的自动化测试工具,不少学习功能自动化的同学开始首选 selenium ,因为它相比 QTP 有诸多有点:

  • 免费,也不用再为破解 QTP 而大伤脑筋

  • 小巧,对于不同的语言它只是一个包而已,而 QTP 需要下载安装1个多 G 的程序。

  • 这也是最重要的一点,不管你以前更熟悉 C、 java、ruby、python、或都是 C# ,你都可以通过 selenium 完成自动化测试,而 QTP 只支持 VBS

  • 支持多平台:windows、linux、MAC ,支持多浏览器:ie、ff、safari、opera、chrome

  • 支持分布式测试用例的执行,可以把测试用例分布到不同的测试机器的执行,相当于分发机的功能。

官方文档:

https://selenium-python.readthedocs.io/index.html
https://seleniumhq.github.io/selenium/docs/api/py/api.html

写在前面

有的时候需要某个领域的所有论文数据,此时web of science数据库检索的论文结果可能动辄上万甚至几十万,然而网站限制单次导出条数为1000(如果需要引文字段则仅500,仅导出为txt可包含引用详细信息),需要导出几十上百次,手动做太费神,因此写一个爬虫脚本自动导出。

2022.1.6旧版web of science正式下线了,这里是对新版网站重新开发的自动化导出代码。

使用本代码需要:

  • 国内大学学生账号(登录wos使用)

  • 火狐浏览器

  • geckodriver 0.24.0 (放在爬虫代码同一个文件夹下)

严格来说本代码属于半自动化导出,考虑到开发效率等因素,有两处在首次导出时需要手动操作,后文细说。

遇到“selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: …”的报错首先排查网络问题,可以把对应代码行之前的浏览器等待时间加长。

代码情况:

  • 输入:wos检索结果网址、需要导出的条数、导出结果存储路径

  • 输出:导出文件(格式自选,一般txt/excel)

1、需要导入的包,以及测试入口。

其中url是在完成wos检索之后的检索页面网址。

关于Python Selenium自动化导出新版WOS(web of science)检索结果的问题


from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import os
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

if __name__=='__main__':

'''WOS“检索结果”页面的网址'''
   url = 'https://www.webofscience.com/wos/woscc/summary/64c4e5ff-832d-476d-8112-51e908a600b1-1d5405d5/relevance/1'

startdownload(url,80195,'/Users/username/folder',False) # 主要函数
   print('Done')

2、主要函数

两次手动操作:

  • 首次打开wos必须登录, 在学校统一身份认证处需要手动输入信息并点击登录;

  • 第一次导出时需要手动修改文件处理方式为"保存文件", 并勾选"以后都采用相同动作处理此类文件"

输入参数见函数说明。

  • 选择导出格式处给出了excel和txt两种,默认excel,可自选。


def startdownload(url,record_num,SAVE_TO_DIRECTORY,record_format='excel',reverse=False):
   '''url -> 检索结果网址; \n
      record_num -> 需要导出的记录条数(检索结果数); \n
      SAVE_TO_DIRECTORY -> 记录导出存储路径(文件夹);\n
      record_format -> 导出记录格式, default='excel';\n
      reverse -> 是否设置检索结果降序排列, default=False \n
      ----------------------------------------------------
      tip1:首次打开wos必须登录,在学校统一身份认证处需要手动输入验证码并点击登录;
      tip2:第一次导出时需要手动修改文件处理方式为"保存文件",并勾选"以后都采用相同动作处理此类文件"
   '''
   # SAVE_TO_DIRECTORY = '/Users/chenzijing/Desktop/研/毕业论文/毕设研/代码/论文数据'#/firefox'
   fp = webdriver.FirefoxProfile()
   fp.set_preference('browser.download.dir', SAVE_TO_DIRECTORY)
   fp.set_preference("browser.download.folderList", 2)
   fp.set_preference("browser.download.manager.showWhenStarting", False)
   fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/plain")
   browser = webdriver.Firefox(executable_path=r'geckodriver',firefox_profile=fp)
   browser.get(url)
   time.sleep(3)
   login(browser)
   browser.get(url)
   time.sleep(5)
   '''获取需要导出的文献数量'''
   # record_num = int(browser.find_element_by_css_selector('.brand-blue').text)
   # 按时间降序排列
   if reverse:
       browser.find_element_by_css_selector('.top-toolbar wos-select:nth-child(1) button:nth-child(1) span:nth-child(2)').click()
       browser.find_element_by_css_selector("div.wrap-mode:nth-child(2) span:nth-child(1)").click()
       time.sleep(3)
   # 叉掉弹窗
   browser.find_element_by_css_selector('#onetrust-accept-btn-handler').click()
   time.sleep(1)
   browser.find_element_by_css_selector('#pendo-close-guide-7176fce7').click()
   # 开始导出
   start = 1 # 起始记录
   i = 0 # 导出记录的数字框id随导出次数递增
   while start<record_num:
       browser.find_element_by_css_selector('button.cdx-but-md:nth-child(2) span:nth-child(1)').click() # 导出
       # 选择导出格式
       if record_format=='excel':
           browser.find_element_by_css_selector('#exportToExcelButton').click() # 选择导出格式为excel
       else:
           browser.find_element_by_css_selector('#exportToFieldTaggedButton').click() # 选择导出格式为txt
       browser.find_element_by_css_selector('#radio3 label:nth-child(1) span:nth-child(1) span:nth-child(1)').click() # 选择自定义记录条数
       send_key(browser,'#mat-input-%d'%i,start)#mat-input-2
       send_key(browser,'#mat-input-%d'%(i+1),start+999)
       browser.find_element_by_css_selector('.margin-top-5 button:nth-child(1)').click() # 更改导出字段
       browser.find_element_by_css_selector('div.wrap-mode:nth-child(3) span:nth-child(1)').click() # 选择所需字段(3完整)(4自定义)
       browser.find_element_by_css_selector('div.flex-align:nth-child(3) button:nth-child(1)').click() # 点击导出
       time.sleep(10) # 等待下载完毕
       # 导出文件按照包含的记录编号重命名
       rename_file(SAVE_TO_DIRECTORY,'record-'+str(start)+'-'+str(start+999))
       start = start + 1000
       i = i + 2
   time.sleep(10)
   browser.quit()

3、主要函数中调用的其他函数

login函数中&ldquo;学校的统一身份验证&rdquo;部分可以选择手动,或者根据学校网站自行修改。
其他无需修改。


def login(browser):
   '''登录wos'''
   # 通过CHINA CERNET Federation登录
   browser.find_element_by_css_selector('.mat-select-arrow').click()
   browser.find_element_by_css_selector('#mat-option-9 span:nth-child(1)').click()
   browser.find_element_by_css_selector('button.wui-btn--login:nth-child(4) span:nth-child(1) span:nth-child(1)').click()
   time.sleep(3)
   login = browser.find_element_by_css_selector('#show')
   login.send_keys('xxxx大学') # 改成你的学校名
   time.sleep(0.5)
   browser.find_element_by_css_selector('.dropdown-item strong:nth-child(1)').click()
   browser.find_element_by_css_selector('#idpSkipButton').click()
   time.sleep(1)
   #! 跳转到学校的统一身份验证(想自动输入账号密码就把下面两行注释解除,按照自己学校的网址修改一下css选择器路径)
   # browser.find_element_by_css_selector('input#un').send_keys('你的学号') # 改成你的学号/账号
   # browser.find_element_by_css_selector('input#pd').send_keys('你的密码') # 改成你的密码
   time.sleep(20) #! 手动输入账号、密码、验证码,点登录
def send_key(browser,path,value):
   '''browser -> browser;\n
      path -> css选择器;\n
      value -> 填入值
   '''
   markto=browser.find_element_by_css_selector(path)
   markto.clear()
   markto.send_keys(value)
def rename_file(SAVE_TO_DIRECTORY,name,record_format='excel'):
   '''导出文件重命名 \n
      SAVE_TO_DIRECTORY -> 导出记录存储位置(文件夹);\n
      name -> 重命名为
   '''
   # files = list(filter(lambda x:'savedrecs' in x and len(x.split('.'))==2,os.listdir(SAVE_TO_DIRECTORY)))
   while True:
       files = list(filter(lambda x:'savedrecs' in x and len(x.split('.'))==2,os.listdir(SAVE_TO_DIRECTORY)))
       if len(files)>0:
           break
   files = [os.path.join(SAVE_TO_DIRECTORY, f) for f in files]  # add path to each file
   files.sort(key=lambda x: os.path.getctime(x))
   newest_file = files[-1]
   # newest_file=os.path.join(SAVE_TO_DIRECTORY,'savedrecs.txt')
   if record_format=='excel':
       os.rename(newest_file, os.path.join(SAVE_TO_DIRECTORY, name+".xls"))
   else:
       os.rename(newest_file, os.path.join(SAVE_TO_DIRECTORY, name+".txt"))

4、导出结果

部分结果,展示导出形式。

关于Python Selenium自动化导出新版WOS(web of science)检索结果的问题

来源:https://blog.csdn.net/Parzival_/article/details/122360528

标签:Python,Selenium,自动化
0
投稿

猜你喜欢

  • python绘制三维图的详细新手教程

    2022-03-19 14:23:52
  • 互联网产品设计师职业生涯

    2009-04-20 20:41:00
  • pytorch 如何使用amp进行混合精度训练

    2023-12-25 13:35:02
  • 深入了解MySQL的数据类型以及建库策略

    2008-12-17 16:16:00
  • Mysql数据库手动及定时备份步骤

    2024-01-27 10:43:15
  • 解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    2024-01-26 03:05:05
  • JavaScript 如何在线解压 ZIP 文件

    2024-04-22 22:14:58
  • python实现简单的飞机大战游戏

    2023-08-28 01:50:50
  • ASP调用数据库常见错误的解决

    2007-09-07 10:05:00
  • python io.BytesIO简介及示例代码

    2021-04-25 04:52:31
  • 简单瞅瞅Python vars()内置函数的实现

    2021-03-29 20:41:05
  • Python计算一个给定时间点前一个月和后一个月第一天的方法

    2023-11-26 13:50:26
  • 如何使用SQL Mail收发和自动处理邮件?

    2010-05-16 15:10:00
  • Python将视频或者动态图gif逐帧保存为图片的方法

    2022-08-08 00:50:17
  • JS实现jQuery的append功能

    2024-04-22 22:23:00
  • Python netmiko模块的使用

    2021-07-04 06:42:51
  • Go语言中错误处理实例分析

    2024-02-14 18:43:10
  • Python私有属性私有方法应用实例解析

    2022-11-08 05:09:03
  • MySQL Index Condition Pushdown(ICP)性能优化方法实例

    2024-01-19 20:08:25
  • Python sqlite3查询操作过程解析

    2023-11-23 18:37:21
  • asp之家 网络编程 m.aspxhome.com