99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代解放雙手|Python 自動搜索、翻譯、存儲文獻標題摘要
解放雙手|Python 自動搜索、翻譯、存儲文獻標題摘要
2021-06-02
收藏

來源:早起Python

作者:陳熹

一、需求描述

大家好,我是早起。

在之前的文章 批量翻譯文檔 中,我們介紹了如何調(diào)用百度翻譯API完成實際的文檔翻譯需求。如果是科研、深度學習等需要經(jīng)常閱讀大量論文的工作,批量翻譯就能大大提高效率。

本文將進一步使用 Python 實現(xiàn)另一個在科研學術領域的辦公自動化應用?!?/span>結(jié)合爬蟲批量翻譯文獻題目和摘要,并存儲搜索和翻譯結(jié)果至 Excel中

完成效果如下,指定的外文文獻標題、摘要都被批量翻譯后存儲在Excel中,我們可以大致瀏覽后有選擇性的挑選文章閱讀!

本文以ACM協(xié)會的文獻為例,搜索的關鍵詞是 “對抗生成網(wǎng)絡+眼底” ,即 “GAN+fundus”

二、邏輯梳理

本文需求可以看做三塊內(nèi)容:爬蟲+翻譯+存儲 在使用百度的通用翻譯 API 之前需要完成以下工作:

使用百度賬號登錄百度翻譯開放平臺(
http://api.fanyi.baidu.com
)注冊成為開發(fā)者,獲得APPID;進行開發(fā)者認證(如僅需標準版可跳過);開通通用翻譯API服務:開通鏈接參考技術文檔和Demo編寫代碼

完成后在個人頁面在即可看到 ID 和密鑰,這個很重要!

關于如何使用Python爬取翻譯結(jié)果的細節(jié)本文就不再贅述!我已經(jīng)將通用翻譯 API 的 demo代碼寫好,已經(jīng)對輸出做簡單修改,拿走就能用!

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 + path

query = '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(3276865536)
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重新包裝成函數(shù),將爬取的題目和摘要看做兩個文本輸入函數(shù)后,返回翻譯的結(jié)果:

import requests import random import json from hashlib import md5 def 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(3276865536)
        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 '翻譯出錯' 

函數(shù)中用 try 捕獲錯誤避免中途因為提交的文本為空,而導致的報錯終止程序

存儲部分,通過 openpyxl 或者 xlwings 存儲到 Excel 中就可以

爬蟲部分,兩個網(wǎng)站的邏輯非常類似,具體見下文

三、代碼實現(xiàn)

首先爬取ACM的摘要,在首頁搜索框中輸入:GAN+fundus 跳轉(zhuǎn)后可以發(fā)現(xiàn),URL包含了關鍵詞:

那么后面的搜索就可以直接用URL拼接:

keyword = 'GAN+fundus' url_init = r'https://dl.acm.org/action/doSearch?AllField=' url =url_init + keyword

搜索結(jié)果非常多,本文爬取第一頁文章的摘要為例,后續(xù)讀者當關鍵詞鎖定的文獻比較少或者想獲取全部文獻,可以自行尋找URL翻頁邏輯

同時我們發(fā)現(xiàn),摘要顯示不全,確認源代碼和ajax動態(tài)加載不包含完整摘要,因此可以考慮進入各文獻的詳情頁獲取摘要:

回到搜索結(jié)果頁,對詳情頁分析可以發(fā)現(xiàn)每個文獻可獲取的href跟 dl.acm.org 拼接后即為詳情頁URL:

接下來就可以利用Xpath獲取搜索頁第一頁全部文獻的 href 并拼接成新URL:

import requests from lxml import html

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:
    url_new = 'https://dl.acm.org' + article.xpath('div[2]/div[2]/div/h5/span/a/@href')[0]
    print(url_new)

獲得新的URL之后,重新用Xpath解析新的網(wǎng)頁獲取題目和摘要:

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)

題目和摘要可以成功輸出,但現(xiàn)在還是英文形式。只需要將文本提交給上文中包裝好的翻譯函數(shù),輸出返回值就是中文翻譯形式了。注意免費的API每秒只允許調(diào)用一次,可以考慮將題目和摘要組合成一個文本同時提交,或者中間休眠一秒:

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 創(chuàng)建 Excel 文件并寫入表頭:

from openpyxl import Workbook

wb = Workbook()
sheet = wb.active
header = ['序號''題目''題目(譯)''摘要''摘要(譯)']
sheet.append(header)
path = 'xxx' # 希望保存文件的路徑 

用變量 num 標記文章的順序,并在每篇文章解析和翻譯完后利用 sheet.append(list) 寫入 Excel,循環(huán)結(jié)束后保存文件即完成全部存儲:

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 += 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')

最終實現(xiàn)效果如下,可以看到指定的文章標題、摘要都被翻譯提取出來,我們可以大致瀏覽后有選擇的查閱文章。

另外還有一個重要的計算機協(xié)會,IEEE(https://ieeexplore.ieee.org/Xplore/home.jsp),網(wǎng)頁信息爬取邏輯和ACM非常類似,不再贅述

小結(jié)

綜合各種辦公自動化技術,我們可以實現(xiàn)各式各樣的辦公或科研需求,扎實的技術是最重要的前提。

例如本文的需求,其實我們還可以通過 openpyxl 或者 xlwings 存儲到 Excel 中,實際上還可以 python-docx 寫入 Word 中,甚至從文獻中獲取圖片,借助 python-pptx 寫入 PPT 中。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }