來源:早起Python作者:陳熹一、需求描述大家好,我是早起。在之前的文章 批量翻譯文件中,我們介紹瞭如何呼叫百度翻譯API完成實際的文件翻譯需求。如果是科研、深度學習等需要經常
2021-06-02 11:05:22
來源:早起Python
作者:陳熹
一、需求描述
大家好,我是早起。
在之前的文章 批量翻譯文件中,我們介紹瞭如何呼叫百度翻譯API完成實際的文件翻譯需求。如果是科研、深度學習等需要經常閱讀大量論文的工作,批量翻譯就能大大提高效率。
本文將進一步使用 Python 實現另一個在科研學術領域的辦公自動化應用。「結合爬蟲批量翻譯文獻題目和摘要,並存儲搜尋和翻譯結果至 Excel中」
完成效果如下,指定的外文文獻標題、摘要都被批量翻譯後儲存在Excel中,我們可以大致瀏覽後有選擇性的挑選文章閱讀!
本文以ACM協會的文獻為例,搜尋的關鍵詞是
「對抗生成網路+眼底」,即「GAN+fundus」
二、邏輯梳理
本文需求可以看做三塊內容:爬蟲+翻譯+儲存在使用百度的通用翻譯 API 之前需要完成以下工作:
「使用百度賬號登入百度翻譯開放平臺(http://api.fanyi.baidu.com)註冊成為開發者,獲得APPID;進行開發者認證(如僅需標準版可跳過);開通通用翻譯API服務:開通連結參考技術文件和Demo編寫程式碼」
完成後在個人頁面在即可看到 ID 和金鑰,這個很重要!
關於如何使用Python爬取翻譯結果的細節本文就不再贅述!我已經將通用翻譯 API 的 demo程式碼寫好,已經對輸出做簡單修改,拿走就能用!
import requestsimport randomimport jsonfrom 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 signdef 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 requestheaders = {'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)result = r.json()# Show responsefor res in result['trans_result']: print(res['dst'])
在本需求中可以考慮將上面的API重新包裝成函數,將爬取的題目和摘要看做兩個文字輸入函數後,返回翻譯的結果:
import requestsimport randomimport jsonfrom 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 + path try: salt = random.randint(32768, 65536) sign = make_md5(appid + query + str(salt) + appkey) # Build request headers_new = {'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_new) result = r.json()['trans_result'][0]['dst'] return result except: 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 requestsfrom lxml import htmlkeyword = 'GAN+fundus'url_init = r'https://dl.acm.org/action/doSearch?AllField='url =url_init + keywordhtml_data = requests.get(url).textselector = 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).text selector_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).text selector_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: ' + title translated_title = Baidu_translate(title) print(title) print(translated_title) time.sleep(1) abstract = 'Abstract: ' + abstract translated_abstract = Baidu_translate(abstract) print(abstract) print(translated_abstract) time.sleep(1) print('-' * 20)
題目和摘要成功翻譯!接下來可以自定義對接意向的持久化儲存了,以openpyxl
為例,首先在程式碼的開頭用
openpyxl
創建 Excel 檔案並寫入表頭:
from openpyxl import Workbookwb = Workbook()sheet = wb.activeheader = ['序號', '題目', '題目(譯)', '摘要', '摘要(譯)']sheet.append(header)path = 'xxx' # 希望儲存檔案的路徑用變數num標記文章的順序,並在每篇文章解析和翻譯完後利用sheet.append(list)
寫入 Excel,迴圈結束後儲存檔案即完成全部儲存:
num = 0keyword = 'GAN+fundus'url_init = r'https://dl.acm.org/action/doSearch?AllField='url =url_init + keywordhtml_data = requests.get(url).textselector = 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 += 1 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).text selector_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: ' + title translated_title = Baidu_translate(title) print(title) print(translated_title) time.sleep(1) abstract = 'Abstract: ' + abstract translated_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 中。
相關文章
來源:早起Python作者:陳熹一、需求描述大家好,我是早起。在之前的文章 批量翻譯文件中,我們介紹瞭如何呼叫百度翻譯API完成實際的文件翻譯需求。如果是科研、深度學習等需要經常
2021-06-02 11:05:22
出品|開源中國文|Travis6 月 1 日,Firefox 89 穩定版本正式釋出。該版本的重點是介面的重新設計,新設計影響到主要的介面元素,如主工具欄、位址列、選單、瀏覽器顯示的提示和標
2021-06-02 11:05:01
【TechWeb】6月2日訊息,在臺北國際電腦展上,美光宣佈推出首款面向汽車應用的通用快閃記憶體 (UFS) 3.1 解決方案,並將於2021 年第三季度投產。美光宣佈送樣 128GB 和 256GB 容
2021-06-02 11:04:39
本以為在小米等手機廠商的努力下,山寨機已經被全面消滅,但事實上山寨機一直活躍在我們看不到的地方。5月23日,ZEALER聯合創始人、知名數碼博主"科技小辛"釋出了一條視訊,稱在快
2021-06-02 11:04:18
雷軍釋出的小米數字系列機型,價效比都非常高,現在主打高階市場,沒有追求價效比了,但是跟同價位友商高階機相比,價效比還是比較明顯,小米1至小米5均是1999元釋出價,小米6漲價了,以249
2021-06-02 10:43:05
【6月2日訊】相信大家都知道,谷歌在近日已經正式釋出了新版Android 12系統首個公測版本,同時谷歌還對外公佈了首批可以升級Android 12系統手機廠商大名單,華為、榮耀這兩家國產
2021-06-02 10:42:58