1. 網(wǎng)頁分析
首先要選擇一個(gè)翻譯網(wǎng)站,在這里我們選擇有道翻譯,進(jìn)入網(wǎng)站:
然后檢查元素,這里我們直接在network中可能找不到相應(yīng)信息,我們?cè)谳斎肟蛑休斎腚S機(jī)內(nèi)容,然后點(diǎn)擊翻譯,這時(shí)就會(huì)發(fā)生變化。
找到左邊這個(gè)文件,查看其中的Headers內(nèi)容,這個(gè)URL就是我們解析時(shí)候需要用到的網(wǎng)址:
http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
注意在使用這個(gè)url的時(shí)候把_o給刪除掉,不然會(huì)影響程序的運(yùn)行,然后往下拉,這些為我們需要使用到的data信息。
防止網(wǎng)頁對(duì)機(jī)器人的屏蔽,我們可以模擬瀏覽器進(jìn)行訪問,找到相應(yīng)內(nèi)容添加到代碼中。
最后再點(diǎn)擊Headers旁邊的preview,我們可以看到輸入的爬蟲內(nèi)容與它的翻譯結(jié)果被放到了一個(gè)字典當(dāng)中,我們最后再讀取這個(gè)內(nèi)容即可。
2. 完整代碼
import urllib.request # 導(dǎo)入模塊 import urllib.parse import json class Trs: def __init__(self): url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule" content = input("翻譯內(nèi)容:") data = {} data['i'] = content data['from'] = 'AUTO' data['to'] = 'AUTO' data['smartresult'] = 'dict' data['client'] = 'fanyideskweb' data['salt'] = '15823411455528' data['sign'] = 'd03024a90896a5eb31a74a9344657b0e' data['doctype'] = 'json' data['version'] = '2.1' data['keyfrom'] = 'fanyi.web' data['action'] = 'FY_BY_REALTlME' data = urllib.parse.urlencode(data).encode('utf-8') r = urllib.request.Request(url, data) r.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36') response = urllib.request.urlopen(r) html = response.read().decode('utf-8') trs = json.loads(html) result = trs['translateResult'][0][0]['tgt'] print("翻譯結(jié)果:",result) if __name__ == "__main__": a = Trs()
3. 代碼分析
我們使用了前面我們看到的data參數(shù),創(chuàng)建一個(gè)字典來存放這些data數(shù)據(jù),然后發(fā)送請(qǐng)求的時(shí)候使用data參數(shù),然后把相應(yīng)的內(nèi)容與我們?cè)诰W(wǎng)頁中看到的一一對(duì)應(yīng),再模擬瀏覽器訪問,我們可以通過print來輸出一下返回的json字符。
trs = json.loads(html) print(trs) result = trs['translateResult'][0][0]['tgt'] print("翻譯結(jié)果:",result)
輸出結(jié)果為:
翻譯內(nèi)容:爬蟲
{'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 2, 'translateResult': [[{'src': '爬蟲', 'tgt': 'The crawler'}]]} 翻譯結(jié)果: The crawler
也就是輸出為一個(gè)字典,我們想要獲取的內(nèi)容存放在一個(gè)二維列表當(dāng)中,我們通過訪問其索引值的方式找到它就可。
trs['translateResult'][0][0]['tgt']
我們?cè)偻ㄟ^幾次測(cè)試來看一下輸出結(jié)果:
翻譯內(nèi)容:惟沉默是最高的輕蔑{'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 18, 'translateResult': [[{'src': '惟沉默是最高的輕蔑', 'tgt': 'But silence is supreme contempt'}]]} 翻譯結(jié)果: But silence is supreme contempt 翻譯內(nèi)容:其實(shí)地上本沒有路,走的人多了,也便成了路 {'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 20, 'translateResult': [[{'src': '其實(shí)地上本沒有 路,走的人多了,也便成了路', 'tgt': 'Actually the earth had no road, walk of person many, also then became road'}]]} 翻譯結(jié)果: Actually the earth had no road, walk of person many, also then became road
如果我們輸入的語句分開的時(shí)候:
翻譯內(nèi)容:勇者憤怒,抽刃向更強(qiáng)者;怯者憤怒,卻抽刃向更弱者 {'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 2, 'translateResult': [[{'src': '勇者憤怒,抽刃向 更強(qiáng)者;', 'tgt': 'A brave man angry, blade to more strong;'}, {'src': '怯者憤怒,卻抽刃向更弱者' , 'tgt': 'Afraid of anger, but blade to a weak one'}]]} 翻譯結(jié)果: A brave man angry, blade to more strong;
這樣的語句被分成了兩句,我們就需要更改輸出信息來完成翻譯,代碼如下:
result1 = trs['translateResult'][0][0]['tgt'] result2 = trs['translateResult'][0][1]['tgt'] print("翻譯結(jié)果:",result1+result2)
輸出結(jié)果為:
翻譯內(nèi)容:勇者憤怒,抽刃向更強(qiáng)者;怯者憤怒,卻抽刃向更弱者 {'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 1, 'translateResult': [[{'src': '勇者憤怒,抽刃 向更強(qiáng)者; ', 'tgt': 'A brave man angry, blade to more strong;'}, {'src': '怯者憤怒,卻抽刃向更弱者', 'tgt': 'Afraid of anger, but blade to a weak one'}]]} 翻譯結(jié)果: A brave man angry, blade to more strong;Afraid of anger, but blade to a weak one
4. 總結(jié)
本節(jié)我們主要學(xué)習(xí)了如何去爬取一些翻譯來的內(nèi)容,這是一個(gè)比較經(jīng)典的爬蟲入門題目,在使用爬蟲的過程中要掌握的就是如何去從網(wǎng)頁源碼中找到我們需要的信息,把這一點(diǎn)掌握熟練之后可以進(jìn)行更深層次的爬蟲項(xiàng)目,下一節(jié)我們把這兩節(jié)的內(nèi)容通過事件管理結(jié)合在一起來完成我們的簡單翻譯器。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程