解放双手|Python 自动搜索、翻译、存储文献标题摘要!
一、需求描述
大家好,我是早起。
如果是科研、深度學習等需要經常閱讀大量論文的工作,批量翻譯就能大大提高效率。
本文將進一步使用 Python 實現另一個在科研學術領域的辦公自動化應用。「結合爬蟲批量翻譯文獻題目和摘要,并存儲搜索和翻譯結果至 Excel中」
完成效果如下,指定的外文文獻標題、摘要都被批量翻譯后存儲在Excel中,我們可以大致瀏覽后有選擇性的挑選文章閱讀!
本文以ACM協會的文獻為例,搜索的關鍵詞是 “對抗生成網絡+眼底” ,即 “GAN+fundus”
二、邏輯梳理
本文需求可以看做三塊內容:爬蟲+翻譯+存儲 在使用百度的通用翻譯 API 之前需要完成以下工作:
“使用百度賬號登錄百度翻譯開放平臺(http://api.fanyi.baidu.com)
注冊成為開發者,獲得APPID;
進行開發者認證(如僅需標準版可跳過);
開通通用翻譯API服務:開通鏈接
參考技術文檔和Demo編寫代碼
完成后在個人頁面在即可看到 ID 和密鑰,這個很重要!
關于如何使用Python爬取翻譯結果的細節本文就不再贅述!我已經將通用翻譯 API 的 demo代碼寫好,已經對輸出做簡單修改,拿走就能用!
import?requests import?random import?json from?hashlib?import?md5#?Set?your?own?appid/appkey. appid?=?'xxx' appkey?=?'xxx'#?For?list?of?language?codes,?please?refer?to?`https://api.fanyi.baidu.com/doc/21` from_lang?=?'en' to_lang?=??'zh'endpoint?=?'http://api.fanyi.baidu.com' path?=?'/api/trans/vip/translate' url?=?endpoint?+?pathquery?=?'Hello?World!?This?is?1st?paragraph.\nThis?is?2nd?paragraph.'#?Generate?salt?and?sign def?make_md5(s,?encoding='utf-8'):return?md5(s.encode(encoding)).hexdigest()salt?=?random.randint(32768,?65536) sign?=?make_md5(appid?+?query?+?str(salt)?+?appkey)#?Build?request headers?=?{'Content-Type':?'application/x-www-form-urlencoded'} payload?=?{'appid':?appid,?'q':?query,?'from':?from_lang,?'to':?to_lang,?'salt':?salt,?'sign':?sign}#?Send?request r?=?requests.post(url,?params=payload,?headers=headers) result?=?r.json()#?Show?response for?res?in?result['trans_result']:print(res['dst'])在本需求中可以考慮將上面的API重新包裝成函數,將爬取的題目和摘要看做兩個文本輸入函數后,返回翻譯的結果:
import?requests import?random import?json from?hashlib?import?md5def?make_md5(s,?encoding='utf-8'):return?md5(s.encode(encoding)).hexdigest()def?Baidu_translate(query):#?Set?your?own?appid/appkey.appid?=?'xxx'appkey?=?'xxx'from_lang?=?'en'to_lang?=?'zh'endpoint?=?'http://api.fanyi.baidu.com'path?=?'/api/trans/vip/translate'url?=?endpoint?+?pathtry:salt?=?random.randint(32768,?65536)sign?=?make_md5(appid?+?query?+?str(salt)?+?appkey)#?Build?requestheaders_new?=?{'Content-Type':?'application/x-www-form-urlencoded'}payload?=?{'appid':?appid,?'q':?query,?'from':?from_lang,?'to':?to_lang,?'salt':?salt,?'sign':?sign}#?Send?requestr?=?requests.post(url,?params=payload,?headers=headers_new)result?=?r.json()['trans_result'][0]['dst']return?resultexcept:return?'翻譯出錯'函數中用 try 捕獲錯誤避免中途因為提交的文本為空,而導致的報錯終止程序
存儲部分,通過 openpyxl 或者 xlwings 存儲到 Excel 中就可以
爬蟲部分,兩個網站的邏輯非常類似,具體見下文
三、代碼實現
首先爬取ACM的摘要,在首頁搜索框中輸入:GAN+fundus 跳轉后可以發現,URL包含了關鍵詞:
那么后面的搜索就可以直接用URL拼接:
keyword?=?'GAN+fundus' url_init?=?r'https://dl.acm.org/action/doSearch?AllField=' url?=url_init?+?keyword搜索結果非常多,本文爬取第一頁文章的摘要為例,后續讀者當關鍵詞鎖定的文獻比較少或者想獲取全部文獻,可以自行尋找URL翻頁邏輯
同時我們發現,摘要顯示不全,確認源代碼和ajax動態加載不包含完整摘要,因此可以考慮進入各文獻的詳情頁獲取摘要:
回到搜索結果頁,對詳情頁分析可以發現每個文獻可獲取的href跟 dl.acm.org 拼接后即為詳情頁URL:
接下來就可以利用Xpath獲取搜索頁第一頁全部文獻的 href 并拼接成新URL:
import?requests from?lxml?import?htmlkeyword?=?'GAN+fundus' url_init?=?r'https://dl.acm.org/action/doSearch?AllField=' url?=url_init?+?keyword html_data?=?requests.get(url).text selector?=?html.fromstring(html_data) articles?=?selector.xpath('//*[@id="pb-page-content"]/div/main/div[1]/div/div[2]/div/ul/li') for?article?in?articles:url_new?=?'https://dl.acm.org'?+?article.xpath('div[2]/div[2]/div/h5/span/a/@href')[0]print(url_new)獲得新的URL之后,重新用Xpath解析新的網頁獲取題目和摘要:
for?article?in?articles:url_new?=?'https://dl.acm.org'?+?article.xpath('div[2]/div[2]/div/h5/span/a/@href')[0]html_data_new?=?requests.get(url_new).textselector_new?=?html.fromstring(html_data_new)title?=?selector_new.xpath('//*[@id="pb-page-content"]/div/main/div[2]/article/div[1]/div[2]/div/div[2]/h1/text()')[0]abstract?=?selector_new.xpath('//div[@class="abstractSection?abstractInFull"]/p/text()')[0]print('Title:?'?+?title)print('Abstract:?'?+?abstract)print('-'?*?20)題目和摘要可以成功輸出,但現在還是英文形式。只需要將文本提交給上文中包裝好的翻譯函數,輸出返回值就是中文翻譯形式了。注意免費的API每秒只允許調用一次,可以考慮將題目和摘要組合成一個文本同時提交,或者中間休眠一秒:
for?article?in?articles:url_new?=?'https://dl.acm.org'?+?article.xpath('div[2]/div[2]/div/h5/span/a/@href')[0]html_data_new?=?requests.get(url_new).textselector_new?=?html.fromstring(html_data_new)title?=?selector_new.xpath('//*[@id="pb-page-content"]/div/main/div[2]/article/div[1]/div[2]/div/div[2]/h1/text()')[0]abstract?=?selector_new.xpath('//div[@class="abstractSection?abstractInFull"]/p/text()')[0]title?=?'Title:?'?+?titletranslated_title?=?Baidu_translate(title)print(title)print(translated_title)time.sleep(1)abstract?=?'Abstract:?'?+?abstracttranslated_abstract?=?Baidu_translate(abstract)print(abstract)print(translated_abstract)time.sleep(1)print('-'?*?20)題目和摘要成功翻譯!接下來可以自定義對接意向的持久化存儲了,以openpyxl為例,首先在代碼的開頭用 openpyxl 創建 Excel 文件并寫入表頭:
from?openpyxl?import?Workbookwb?=?Workbook() sheet?=?wb.active header?=?['序號',?'題目',?'題目(譯)',?'摘要',?'摘要(譯)'] sheet.append(header) path?=?'xxx'?#?希望保存文件的路徑用變量 num 標記文章的順序,并在每篇文章解析和翻譯完后利用 sheet.append(list) 寫入 Excel,循環結束后保存文件即完成全部存儲:
num?=?0 keyword?=?'GAN+fundus' url_init?=?r'https://dl.acm.org/action/doSearch?AllField=' url?=url_init?+?keyword html_data?=?requests.get(url).text selector?=?html.fromstring(html_data) articles?=?selector.xpath('//*[@id="pb-page-content"]/div/main/div[1]/div/div[2]/div/ul/li')for?article?in?articles:num?+=?1url_new?=?'https://dl.acm.org'?+?article.xpath('div[2]/div[2]/div/h5/span/a/@href')[0]html_data_new?=?requests.get(url_new).textselector_new?=?html.fromstring(html_data_new)title?=?selector_new.xpath('//*[@id="pb-page-content"]/div/main/div[2]/article/div[1]/div[2]/div/div[2]/h1/text()')[0]abstract?=?selector_new.xpath('//div[@class="abstractSection?abstractInFull"]/p/text()')[0]title?=?'Title:?'?+?titletranslated_title?=?Baidu_translate(title)print(title)print(translated_title)time.sleep(1)abstract?=?'Abstract:?'?+?abstracttranslated_abstract?=?Baidu_translate(abstract)print(abstract)print(translated_abstract)time.sleep(1)print('-'?*?20)sheet.append([num,?title,?translated_title,?abstract,?translated_abstract])wb.save(path?+?r'\文獻輸出.xlsx')最終實現效果如下,可以看到指定的文章標題、摘要都被翻譯提取出來,我們可以大致瀏覽后有選擇的查閱文章。
另外還有一個重要的計算機協會,IEEE(https://ieeexplore.ieee.org/Xplore/home.jsp),網頁信息爬取邏輯和ACM非常類似,不再贅述
小結
綜合各種辦公自動化技術,我們可以實現各式各樣的辦公或科研需求,扎實的技術是最重要的前提。
例如本文的需求,其實我們還可以通過 openpyxl 或者 xlwings 存儲到 Excel 中,實際上還可以 python-docx 寫入 Word 中,甚至從文獻中獲取圖片,借助 python-pptx 寫入 PPT 中。
推薦閱讀
Pandas處理數據太慢,來試試Polars吧!
懶人必備!只需一行代碼,就能導入所有的Python庫
絕!關于pip的15個使用小技巧
介紹10個常用的Python內置函數,99.99%的人都在用!
可能是全網最完整的 Python 操作 Excel庫總結!
總結
以上是生活随笔為你收集整理的解放双手|Python 自动搜索、翻译、存储文献标题摘要!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 掌握这些 NumPy Pandas 方
- 下一篇: 手把手带你用Python完成一个数据分析