文章目錄
太長不看
WOS_Crawler是一個Web of Science核心集合爬蟲。
- 支持爬取任意合法高級檢索式的檢索結果(題錄信息)
- 支持爬取給定期刊列表爬取期刊上的全部文章(題錄信息)
- 支持選擇目標文獻類型,如Article、Proceeding paper等
- 支持多種爬取結果的保存格式,如Plain text、Bibtex、HTML等,推薦使用Plain text,解析速度最快
- 支持將爬取結果解析、導入數據庫(目前支持Plain text、Bibtex、XML格式解析、導入),解析數據項除了基本的文獻信息外(標題、摘要、關鍵詞、被引量等),還包括作者機構、基金、分類、參考文獻等信息
WOS_Crawler基於Scrapy,使用PyQt5編寫了圖形界面,也有單獨的Python API
程序主要依賴:Scrapy、BeautifulSoup、PyQt5、SQLAlchemy、bibtexparser、qt5reactor
項目地址:https://github.com/tomleung1996/wos_crawler
筆者是編程新手,這個爬蟲能確保核心功能的正常使用,但肯定存在很多不人性化的地方和BUG,希望大家多多提意見!
0. 寫在前面
Web of Science的爬蟲我在一年多前就已經有寫過,但是那個時候並沒有考慮如何把程序寫得更靈活、人性化一些,更多地只是滿足自己學習科研上的需要。畢竟,采集Web of Science的題錄數據其實是一個相當冷門的需求了,估計寫出來也沒人用。
但是我把這個爬蟲整理一下放上GitHub,讓大家用一下吐槽一下,說不定能夠幫到一些和我一樣的人,順便提升我的編程能力。據我了解有不少同學面對老師的WoS文獻采集任務還是只能手動500條一次次下下來,這個時間說長不長,但是為什么不把它省下來呢?對吧。所以就有了這個項目了。
做了數據爬取,然后還得把文本項解析一下存到數據庫才能進行分析,我就索性把解析和導入功能也做了。后面希望還能把基本網絡分析的功能集成進來,比如關鍵詞共現、作者合著、引文網絡等等。
希望Web of Science的表單項和URL不要發生太大變化吧!(至少一年多沒變了)
1. WOS_Cralwer的使用方法
程序主要包含兩種使用方法,一種基於PyQt5編寫的圖形界面,另一種基於Python API
1.1 圖形界面使用方法
將工程中的main.py文件第36行的crawl_by_gui()取消注釋,執行程序啟動圖形界面
首先選擇是根據期刊列表還是高級檢索式進行爬取,然后選擇期刊列表或者輸入高級檢索式。選擇好保存路徑、導出文件類型、保存格式后,點擊開始爬取即可。爬取進度會在進度條顯示。
在爬取的同時會進行結果的解析和數據庫導入,默認的數據庫使用的是SQLite,保存於目標路徑的result.db文件中

1.2 Python API使用方法
將工程中的main.py文件第28-29行(按期刊列表)或第32-33行(按高級檢索式)取消注釋,傳遞合法的參數進去,執行程序即可。爬取進度會在終端顯示。
2. 注意事項
- 因為Web of Science本身的限制,單個檢索式如果結果數大於10萬的話,大於10萬的部分無法導出(即使手工也不行),此時可以通過年份划分來減少結果數,分批導出
- 導入數據庫后,查詢得到的結果條數可能會與網頁結果數有偏差,我在定位目標批次后使用瀏覽器手動導出的方式證實了是WoS的問題(手動導出結果不足500條)。1萬條結果會缺少5條左右
- 本程序雖不能通過WWS API獲取數據,但是支持解析WWS API獲得的XML文件
- 注重爬取道德,如有必要請設置合理的下載延遲
- 程序BUG在所難免,請在評論留言或提交ISSUE
3. Web of Science爬取邏輯
嚴格來講,Web of Science的文獻信息采集,是不需要“爬取”的,我們只是用到了它本身的導出功能(見下圖)。

這個導出功能一次最多只能導出500條,如果我們要采集的檢索結果多達數萬,那么就要重復操作很多次了。而且,WoS默認的導出文件名稱都叫savedrecs.xxx,手動改名字也是一個惡心的工作。
但既然WoS已經為我們提供了結構良好的數據導出功能,我們就無需再從頭開始寫我們的爬蟲了,只需要模仿我們的手工操作,不斷重復地導出500條結果即可。
3.1 抽象爬取邏輯
首先,我們比較抽象地定義我們的爬取步驟:
- 向Web of Science 提交檢索請求
- 反復導出文獻,直到全部結果導出完畢
3.2 具體爬取邏輯
然后,打開抓包工具Fiddler,人工走一遍文獻導出流程,完善爬取步驟:
值得一提的是,WoS的爬取可以說是特別簡單,了解流程之后就會明白本質上只是提交幾個表單即可,不同的導出配置可以通過修改表單項來實現,十分適合拿來練手
- 獲取
SID,SID是WoS用以辨識用戶合法權限的標志,可以通過訪問http://www.webofknowledge.com/,在跳轉后的URL中直接提取獲得(如果是校外等無權限用戶,SID將不會在URL中出現 - 獲取
本校已經購買的數據庫,如果爬蟲不需要在各校通用的話,可以把表單中的這一項寫死。本校已經購買的數據庫可以在第一步的頁面中提取id為ss_showsuggestions的元素內容得到 - 向指定的URL提交檢索請求,指定的URL是
http://apps.webofknowledge.com/WOS_AdvancedSearch.do,通過POST方式提交下面的表單,表單內容需要根據實際情況進行自動填充
| Key | Value | 備注 |
|---|---|---|
| product | WOS | |
| search_mode | AdvancedSearch | |
| SID | SID |
填入獲取到的SID |
| input_invalid_notice | Search Error: Please enter a search term. | |
| input_invalid_notice_limits | Note: Fields displayed in scrolling boxes must be combined with at least one other search field. |
|
| action | search | |
| replaceSetId | 留空 | |
| goToPageLoc | SearchHistoryTableBanner | |
| value(input1) | QUERY |
填入合法的高級檢索式,如:TS=INFORMATION SCIENCE |
| value(searchOp) | search | |
| value(select2) | LA | |
| value(input2) | 填入目標文獻語言,留空表示全部語言 | |
| value(select3) | DT | |
| value(input3) | 填入目標文獻類型,留空表示全部類型 | |
| value(limitCount) | 14 | |
| limitStatus | collapsed | |
| ss_lemmatization | On | |
| ss_spellchecking | Suggest | |
| SinceLastVisit_UTC | 留空 | |
| SinceLastVisit_DATE | 留空 | |
| period | Range Selection | |
| range | ALL | |
| startYear | 1900 | 這里其實應該填入學校購買的時間范圍,但是我嘗試過這個和實際不一致不影響,除非檢索式查詢的是范圍外的 |
| endYear | 2019 | 填入當前年份 |
| editions | 本校已購買的數據庫 |
以列表的形式填入,如["SCI", "SSCI", "AHCI", "ISTP", "ISSHP", "ESCI", "CCR", "IC"] |
| update_back2search_link_param | yes | |
| ss_query_language | 留空 | |
| rs_sort_by | PY.D;LD.D;SO.A;VL.D;PG.A;AU.A | 這里的A和D表示升序和降序,前面的字母表示字段,影響結果排序 |
- 提取
QID,QID和SID的結合是檢索結果集合的唯一標志。提交檢索請求和表單后,如果檢索式合法並且表單無誤,可以在URL中提取到QID - 提取
檢索結果數,以便計算循環導出所需要的次數,在提交表單后跳轉的頁面可以得到 - 提取
檢索結果頁面連接,在提交表單后跳轉的頁面可以得到 - 循環提交導出請求,假設500條一批,總共需要提交
檢索結果數除以500次,有余數則加1次,每次需要修改的只有START和END,即起止點。導出請求需要提交到http://apps.webofknowledge.com//OutboundService.do?action=go&&,表單格式如下所示:
| Key | Value | 備注 |
|---|---|---|
| selectedIds | 留空 | |
| displayCitedRefs | true | |
| displayTimesCited | true | |
| displayUsageInfo | true | |
| viewType | summary | |
| product | WOS | |
| rurl | response.url |
填寫當前的URL |
| mark_id | WOS | |
| colName | WOS | |
| search_mode | AdvancedSearch | |
| locale | en_US | |
| view_name | WOS-summary | |
| sortBy | PY.D;LD.D;SO.A;VL.D;PG.A;AU.A | |
| mode | OpenOutputService | |
| qid | QID |
填入獲取的QID |
| sid | SID |
填入獲取的SID |
| format | saveToFile | |
| filters | HIGHLY_CITED HOT_PAPER OPEN_ACCESS PMID USAGEIND AUTHORSIDENTIFIERS ACCESSION_NUM FUNDING SUBJECT_CATEGORY JCR_CATEGORY LANG IDS PAGEC SABBR CITREFC ISSN PUBINFO KEYWORDS CITTIMES ADDRS CONFERENCE_SPONSORS DOCTYPE CITREF ABSTRACT CONFERENCE_INFO SOURCE TITLE AUTHORS | 導出字段選擇,這里我選擇了全部字段 |
| mark_to | END |
本批導出文章的止點 |
| mark_from | START |
本批導出文章的起點 |
| queryNatural | QUERY |
合法的高級檢索式 |
| count_new_items_marked | 0 | |
| use_two_ets | false | |
| IncitesEntitled | no | |
| value(record_select_type) | range | |
| markFrom | START |
本批導出文章的起點 |
| markTo | END |
本批導出文章的止點 |
| fields_selection | HIGHLY_CITED HOT_PAPER OPEN_ACCESS PMID USAGEIND AUTHORSIDENTIFIERS ACCESSION_NUM FUNDING SUBJECT_CATEGORY JCR_CATEGORY LANG IDS PAGEC SABBR CITREFC ISSN PUBINFO KEYWORDS CITTIMES ADDRS CONFERENCE_SPONSORS DOCTYPE CITREF ABSTRACT CONFERENCE_INFO SOURCE TITLE AUTHORS | 導出字段選擇,這里我選擇了全部字段 |
| save_options | OUTPUT_FORMAT |
導出格式的選擇,純文本為fieldtagged,Bibtex格式為bibtex,其他類型可以參考WoS官網 |
- 提交表單后,WoS會返回文本類型的結果,將其重命名后直接保存即可,和手工導出的結果完全一致
以上就是Web of Science爬取的基本邏輯了,主要是表單項的填寫,琢磨透之后可以省掉不少功夫
轉自:https://blog.csdn.net/tomleung1996/article/details/86627443
