關(guān)于Python?Selenium自動(dòng)化導(dǎo)出新版WOS(web?of?science)檢索結(jié)果的問(wèn)題
selenium 介紹
selenium 是一個(gè) web 的自動(dòng)化測(cè)試工具,不少學(xué)習(xí)功能自動(dòng)化的同學(xué)開(kāi)始首選 selenium ,因?yàn)樗啾?QTP 有諸多有點(diǎn):
- 免費(fèi),也不用再為破解 QTP 而大傷腦筋
- 小巧,對(duì)于不同的語(yǔ)言它只是一個(gè)包而已,而 QTP 需要下載安裝1個(gè)多 G 的程序。
- 這也是最重要的一點(diǎn),不管你以前更熟悉 C、 java、ruby、python、或都是 C# ,你都可以通過(guò) selenium 完成自動(dòng)化測(cè)試,而 QTP 只支持 VBS
- 支持多平臺(tái):windows、linux、MAC ,支持多瀏覽器:ie、ff、safari、opera、chrome
- 支持分布式測(cè)試用例的執(zhí)行,可以把測(cè)試用例分布到不同的測(cè)試機(jī)器的執(zhí)行,相當(dāng)于分發(fā)機(jī)的功能。
官方文檔:
https://selenium-python.readthedocs.io/index.html
https://seleniumhq.github.io/selenium/docs/api/py/api.html
寫(xiě)在前面
有的時(shí)候需要某個(gè)領(lǐng)域的所有論文數(shù)據(jù),此時(shí)web of science數(shù)據(jù)庫(kù)檢索的論文結(jié)果可能動(dòng)輒上萬(wàn)甚至幾十萬(wàn),然而網(wǎng)站限制單次導(dǎo)出條數(shù)為1000(如果需要引文字段則僅500,僅導(dǎo)出為txt可包含引用詳細(xì)信息),需要導(dǎo)出幾十上百次,手動(dòng)做太費(fèi)神,因此寫(xiě)一個(gè)爬蟲(chóng)腳本自動(dòng)導(dǎo)出。
2022.1.6舊版web of science正式下線了,這里是對(duì)新版網(wǎng)站重新開(kāi)發(fā)的自動(dòng)化導(dǎo)出代碼。
使用本代碼需要:
- 國(guó)內(nèi)大學(xué)學(xué)生賬號(hào)(登錄wos使用)
- 火狐瀏覽器
- geckodriver 0.24.0 (放在爬蟲(chóng)代碼同一個(gè)文件夾下)
嚴(yán)格來(lái)說(shuō)本代碼屬于半自動(dòng)化導(dǎo)出,考慮到開(kāi)發(fā)效率等因素,有兩處在首次導(dǎo)出時(shí)需要手動(dòng)操作,后文細(xì)說(shuō)。
遇到“selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: …”的報(bào)錯(cuò)首先排查網(wǎng)絡(luò)問(wèn)題,可以把對(duì)應(yīng)代碼行之前的瀏覽器等待時(shí)間加長(zhǎng)。
正文
代碼情況:
- 輸入:wos檢索結(jié)果網(wǎng)址、需要導(dǎo)出的條數(shù)、導(dǎo)出結(jié)果存儲(chǔ)路徑
- 輸出:導(dǎo)出文件(格式自選,一般txt/excel)
1、需要導(dǎo)入的包,以及測(cè)試入口。
其中url是在完成wos檢索之后的檢索頁(yè)面網(wǎng)址。
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“檢索結(jié)果”頁(yè)面的網(wǎng)址''' url = 'https://www.webofscience.com/wos/woscc/summary/64c4e5ff-832d-476d-8112-51e908a600b1-1d5405d5/relevance/1' startdownload(url,80195,'/Users/username/folder',False) # 主要函數(shù) print('Done')
2、主要函數(shù)
兩次手動(dòng)操作:
- 首次打開(kāi)wos必須登錄, 在學(xué)校統(tǒng)一身份認(rèn)證處需要手動(dòng)輸入信息并點(diǎn)擊登錄;
- 第一次導(dǎo)出時(shí)需要手動(dòng)修改文件處理方式為"保存文件", 并勾選"以后都采用相同動(dòng)作處理此類文件"
輸入?yún)?shù)見(jiàn)函數(shù)說(shuō)明。
- 選擇導(dǎo)出格式處給出了excel和txt兩種,默認(rèn)excel,可自選。
def startdownload(url,record_num,SAVE_TO_DIRECTORY,record_format='excel',reverse=False): '''url -> 檢索結(jié)果網(wǎng)址; \n record_num -> 需要導(dǎo)出的記錄條數(shù)(檢索結(jié)果數(shù)); \n SAVE_TO_DIRECTORY -> 記錄導(dǎo)出存儲(chǔ)路徑(文件夾);\n record_format -> 導(dǎo)出記錄格式, default='excel';\n reverse -> 是否設(shè)置檢索結(jié)果降序排列, default=False \n ---------------------------------------------------- tip1:首次打開(kāi)wos必須登錄,在學(xué)校統(tǒng)一身份認(rèn)證處需要手動(dòng)輸入驗(yàn)證碼并點(diǎn)擊登錄; tip2:第一次導(dǎo)出時(shí)需要手動(dòng)修改文件處理方式為"保存文件",并勾選"以后都采用相同動(dòng)作處理此類文件" ''' # SAVE_TO_DIRECTORY = '/Users/chenzijing/Desktop/研/畢業(yè)論文/畢設(shè)研/代碼/論文數(shù)據(jù)'#/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) '''獲取需要導(dǎo)出的文獻(xiàn)數(shù)量''' # record_num = int(browser.find_element_by_css_selector('.brand-blue').text) # 按時(shí)間降序排列 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() # 開(kāi)始導(dǎo)出 start = 1 # 起始記錄 i = 0 # 導(dǎo)出記錄的數(shù)字框id隨導(dǎo)出次數(shù)遞增 while start<record_num: browser.find_element_by_css_selector('button.cdx-but-md:nth-child(2) span:nth-child(1)').click() # 導(dǎo)出 # 選擇導(dǎo)出格式 if record_format=='excel': browser.find_element_by_css_selector('#exportToExcelButton').click() # 選擇導(dǎo)出格式為excel else: browser.find_element_by_css_selector('#exportToFieldTaggedButton').click() # 選擇導(dǎo)出格式為txt browser.find_element_by_css_selector('#radio3 label:nth-child(1) span:nth-child(1) span:nth-child(1)').click() # 選擇自定義記錄條數(shù) 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() # 更改導(dǎo)出字段 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() # 點(diǎn)擊導(dǎo)出 time.sleep(10) # 等待下載完畢 # 導(dǎo)出文件按照包含的記錄編號(hào)重命名 rename_file(SAVE_TO_DIRECTORY,'record-'+str(start)+'-'+str(start+999)) start = start + 1000 i = i + 2 time.sleep(10) browser.quit()
3、主要函數(shù)中調(diào)用的其他函數(shù)
login函數(shù)中“學(xué)校的統(tǒng)一身份驗(yàn)證”部分可以選擇手動(dòng),或者根據(jù)學(xué)校網(wǎng)站自行修改。
其他無(wú)需修改。
def login(browser): '''登錄wos''' # 通過(guò)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大學(xué)') # 改成你的學(xué)校名 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) #! 跳轉(zhuǎn)到學(xué)校的統(tǒng)一身份驗(yàn)證(想自動(dòng)輸入賬號(hào)密碼就把下面兩行注釋解除,按照自己學(xué)校的網(wǎng)址修改一下css選擇器路徑) # browser.find_element_by_css_selector('input#un').send_keys('你的學(xué)號(hào)') # 改成你的學(xué)號(hào)/賬號(hào) # browser.find_element_by_css_selector('input#pd').send_keys('你的密碼') # 改成你的密碼 time.sleep(20) #! 手動(dòng)輸入賬號(hào)、密碼、驗(yàn)證碼,點(diǎn)登錄 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'): '''導(dǎo)出文件重命名 \n SAVE_TO_DIRECTORY -> 導(dǎo)出記錄存儲(chǔ)位置(文件夾);\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、導(dǎo)出結(jié)果
部分結(jié)果,展示導(dǎo)出形式。
到此這篇關(guān)于Python Selenium自動(dòng)化導(dǎo)出新版WOS(web of science)檢索結(jié)果的文章就介紹到這了,更多相關(guān)Python Selenium自動(dòng)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- selenium+python自動(dòng)化測(cè)試之使用webdriver操作瀏覽器的方法
- python基于Selenium的web自動(dòng)化框架
- Python結(jié)合Selenium簡(jiǎn)單實(shí)現(xiàn)Web自動(dòng)化測(cè)試
- docker利用selenium+testng實(shí)現(xiàn)web自動(dòng)化的方法
- python+selenium的web自動(dòng)化上傳操作的實(shí)現(xiàn)
- selenium+unittest實(shí)現(xiàn)web自動(dòng)化的示例代碼
- Web自動(dòng)化之Selenium常用操作方法大全
相關(guān)文章
使用Python對(duì)微信好友進(jìn)行數(shù)據(jù)分析
這篇文章主要介紹了使用Python對(duì)微信好友進(jìn)行數(shù)據(jù)分析的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06Python數(shù)據(jù)結(jié)構(gòu)列表
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)列表,本文重點(diǎn)內(nèi)容主要是對(duì)列表數(shù)據(jù)結(jié)構(gòu)的使用,在Python中,序列是一組按順序排列的值。Python?有?3?種內(nèi)置的序列類型:字符串、?元組和列表,下面一起進(jìn)入文章了解更詳細(xì)內(nèi)容吧,需要的小伙伴可以參考一下</P><P>2021-12-12Python+Selenium鍵盤(pán)鼠標(biāo)模擬事件操作詳解
這篇文章主要帶大家一起學(xué)習(xí)一下Selenium的元素的基本操作與鼠標(biāo)鍵盤(pán)模擬事件的操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-06-06python 爬取京東指定商品評(píng)論并進(jìn)行情感分析
本文主要講述了利用Python網(wǎng)絡(luò)爬蟲(chóng)對(duì)指定京東商城中指定商品下的用戶評(píng)論進(jìn)行爬取,對(duì)數(shù)據(jù)預(yù)處理操作后進(jìn)行文本情感分析,感興趣的朋友可以了解下2021-05-05Python基于DB-API操作MySQL數(shù)據(jù)庫(kù)過(guò)程解析
這篇文章主要介紹了Python基于DB-API操作MySQL數(shù)據(jù)庫(kù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04jupyter 使用Pillow包顯示圖像時(shí)inline顯示方式
這篇文章主要介紹了jupyter 使用Pillow包顯示圖像時(shí)inline顯示方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python+Selenium實(shí)現(xiàn)短視頻熱點(diǎn)爬取
隨著短視頻的大火,不僅可以給人們帶來(lái)娛樂(lè),還有熱點(diǎn)新聞時(shí)事以及各種知識(shí),刷短視頻也逐漸成為了日常生活的一部分。本文將通過(guò)Pyhton依托Selenium來(lái)爬取短視頻熱點(diǎn),需要的可以參考一下2022-04-04Python字符串特性及常用字符串方法的簡(jiǎn)單筆記
這篇文章主要介紹了Python字符串特性及常見(jiàn)字符串方法的簡(jiǎn)單筆記,為一些Pyhton入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01