Python—实训day3—简单的在线翻译程序
4 發送POST請求
4.3 用poster獲取有道在線翻譯
參考有道翻譯:http://fanyi.youdao.com/
通過Fiddler工具可以獲取到
請求的URL地址為:http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
提交的請求體參數
i=hello&from=AUTO&to=AUTO&smartresult=dict&client=fanyideskweb&salt=16002154063071&sign=37d97277cb051e71959e772b91309b2b<s=1600215406307&bv=7e14dfdb6b3686cc5af5e5294aaded19&doctype=json&version=2.1&keyfrom=fanyi.web&action=FY_BY_REALTlME
其中,關鍵參數:
i:要翻譯的單詞
salt:鹽值
sign:簽名
鹽值和簽名是后臺反爬蟲的機制
使用poster來模擬發送post請求
但是會出現 {"errorCode":50} 錯誤,因為服務器有反爬蟲機制
只要鹽值和簽名不同,就會報錯
經過網上大神指點,把translate_o改為translate即可
4.4 用python實現簡單的在線翻譯程序
from urllib import request, parse import ssl import random# 常用User-Agent列表 ua_list = ['User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50','Mozilla/5.0 (Windows; U; Windows NT 6.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)', ] # 加載一個頁面 def loadPage(url, word):# 在ua_list列表中隨機選擇一個UserAgentuserAgent = random.choice(ua_list)headers = {'User-Agent': userAgent}# 發起一個請求req = request.Request(url, headers = headers)# 創建未經過驗證的上下文的代碼context = ssl._create_unverified_context()data = {'i': word,'from': 'AUTO','to': 'AUTO','smartresult': 'dict','client': 'fanyideskweb','salt': '16002154063071','sign': '37d97277cb051e71959e772b91309b2b','lts': '1600215406307','bv': '7e14dfdb6b3686cc5af5e5294aaded19','doctype': 'json','version': '2.1','keyfrom': 'fanyi.web','action': 'FY_BY_REALTlME'}data = parse.urlencode(data).encode('utf-8')# 打開響應的對象response = request.urlopen(req, context=context, data=data)# 獲取響應的內容html = response.read()# 對獲取到的unicode編碼進行解碼content = html.decode('utf-8')return content import json def fanyi(word):url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'content = loadPage(url, word)jsondicts = json.loads(content)return jsondicts['translateResult'][0][0]['tgt']if __name__ == '__main__':word = input('請輸入要翻譯的單詞:')result = fanyi(word)print('翻譯的結果為:', result)5.1 面向對象和面向過程5 Python面向對象
面向過程:C、匯編、Basic、Pascal
面向對象:C++、Java、Python、PHP、……
面向過程基于計算機的角度出發考慮問題
面向對象是從人(第三者)的角度出發考慮問題
比如:學生上學
面向過程
| 起床 洗刷刷 穿衣打扮 出門,往教室方向走 if 遇到十字路口: while 紅燈亮: 等待綠燈 走到教室 while 上課時間未到: 等待上課 開始上課 while 下課時間未到: 等待下課 走出教室 吃飯 睡覺 |
面向對象
| 定義一個學生類 定義學生類的屬性:姓名、年齡、專業、年級、…… 定義學生類的方法:吃飯()、睡覺()、上學()、放學()、…… 定義一個教室類 定義教室類的屬性:位置、容量、…… 定義教室類的方法:開門()、關門() 定義學生類的對象:zhangsan 定義教室類的對象:417 zhangsan.上學(417) |
總結:
面向對象:適合組織大規模的軟件開發
面向過程:底層、快捷、高效
5.2 什么是對象
天上飛的:飛機、大炮、鳥、鷹、……
地上跑的:雞鴨鵝、豬牛羊
水里游的:魚蝦蟹、……
抽象的概念:項目、規范、原理、方法、……
世界上萬事萬物都是對象
5.3 區分類和對象
思考:
1 狗是類 狗是對象
2 張三是類 張三是對象
結論:對象更具體、類更抽象
一個類中可以包含多個對象
類是某一種對象的集合(總稱)
面向對象編程
5.4 Python中聲明類和創建對象
聲明類:使用關鍵字 class
約定規矩:類名首字母必須大寫
# 聲明一個類 class Dog:pass創建類的對象
dog1 = Dog() print(dog1) # ain__.Dog object at 0x000002AEA3FDFA58> print(type(dog1)) # s '__main__.Dog'>Dog是類,dog1是Dog的對象
我們是面向對象的編程,實際上是使用dog1進行編程
5.5 屬性
屬性是對象所擁有的特征
設置屬性
# 聲明一個類 class Dog:pass dog1 = Dog() # 設置狗的屬性 dog1.name = '旺財' dog1.age = 13 dog1.sex = 'male' # 讀取狗的屬性 print(dog1.name) print(dog1.age) print(dog1.sex)如果想要查看類的屬性和方法,可以通過dir() 函數查看
dog1 = Dog() print(dir(dog1)) # 設置狗的屬性 dog1.name = '旺財' dog1.age = 13 dog1.sex = 'male' print(dir(dog1))發現屬性是臨時添加上去的
如果希望屬性是固定在類中的,需要把這些屬性寫到類的實現代碼中
class Dog:name = '' # 姓名age = 0 # 年齡sex = 'female' # 性別dog1 = Dog() print(dir(dog1)) dog2 = Dog() print(dir(dog2))5.6 方法
方法是類的對象的一系列的操作
需要在類中定義方法
| def 方法名(方法的參數): 方法的實現代碼 方法的返回值 |
注意:方法名首字母必須小寫
class Dog:# 狗叫的方法def bark(self):print('旺')dog1 = Dog() dog1.bark()方法可以傳遞參數
class Dog:# 狗叫的方法def bark(self):print('旺')def eat(self, something):print('狗吃' + something)dog1 = Dog() dog1.bark() dog1.eat('骨頭')給方法加上返回值
class Dog:name = ''# 狗叫的方法def bark(self):print('旺')def eat(self, something):print('狗吃' + something)def setName(self, name):self.name = namedef getName(self):return self.namedog1 = Dog() dog1.bark() dog1.eat('骨頭') dog1.setName('旺財') print(dog1.getName())5.7 __init__
__init__是Python自帶的方法,需要至少一個參數self
__init__的作用是初始化,創建類的對象的時候,需要做的準備工作
(連接網絡、打開文件、連接數據庫)
當類的對象被創建的時候,該方法就會被調用
class Dog:# 初始化def __init__(self, name, age):self.name = nameself.age = agedog1 = Dog('旺財', 8) print(dog1.name) print(dog1.age) dog2 = Dog('小花', 12) print(dog2.name) print(dog2.age)5.8 __del__
刪除對象的時候清理用的,調用者使用del關鍵字時候觸發
class Dog:# 初始化def __init__(self, name, age):self.name = nameself.age = age# 銷毀def __del__(self):print('__del__')self.name = ''self.age = 0dog1 = Dog('旺財', 8) print(dog1.name) print(dog1.age) del dog1 # 主動觸發 __del__ print('over') # 程序結束5.9 封裝
面向對象的三大特征:封裝、繼承、多態
屬性的公有和私有
Python中描述私有屬性和私有方法,通過前置下劃線來表示
1 _xxx:單前置下劃線
2 __xxx:雙前置下劃線
3 __xxx__:雙前置雙后置下劃線。類的內部已經定義好了
描述私有,一般使用雙前置下劃線
class Dog:# 初始化def __init__(self, name, age):self.__name = nameself.__age = agedef getName(self):return self.__name# 返回對象本身的描述字符串def __str__(self):return 'name:%s, age:%s' % (self.__name, self.__name)dog1 = Dog('旺財', 8) #print(dog1.__name) # 在外部不能直接訪問__name屬性 print(dog1.getName()) print(dog1)5.10 繼承
子類繼承父類
| class 子類(父類): 子類的實現的代碼 |
父類的所有的非私有屬性和方法,子類中都會繼承,并可以直接使用
# 父類 class Animal:def eat(self):print('Animal eat')# 子類 class Dog(Animal):passdog1 = Dog() dog1.eat()子類可以重寫父類的方法
# 父類 class Animal:def eat(self):print('Animal eat')# 子類 class Dog(Animal):def eat(self):print('Dog eat')dog1 = Dog() dog1.eat()還可以在子類方法中調用父類的方法
# 父類 class Animal:def eat(self):print('Animal eat')# 子類 class Dog(Animal):def eat(self):super().eat() # 調用父類的eat()方法print('Dog eat')dog1 = Dog() dog1.eat()子類還可以派生它的子類
# 子類的子類 class HabaDog(Dog):def eat(self):print('HabaDog eat')dog2 = HabaDog() dog2.eat()Python中的約定:
如果一個類沒有繼承任何類,將默認繼承object類
如下兩種寫法效果相同
# 父類 class Animal:def eat(self):print('Animal eat') # 父類 class Animal(object):def eat(self):print('Animal eat')在Python3中,建議使用后者
5.11 多態
不同事物,對同一個操作所表現出來的多種形態
外科醫生、廚師、演員。Cut
動手術、切菜、下班
Python的多態比較簡單(與Java比起來)
# 父類 class Animal(object):def eat(self):print('Animal eat')class Dog(Animal):def eat(self):print('Dog eat')class Man(Animal):def eat(self):print('Man eat')class Woman(Animal):def eat(self):print('Woman eat')# 函數 def doEat(obj):obj.eat()dog1 = Dog() man1 = Man() woman1 = Woman() doEat(dog1) doEat(man1) doEat(woman1)doEat()函數中,理論上可以傳遞任意的參數。如果該參數的對象沒有eat()方法,怎么辦?
考慮使用 isinstance() 函數。判斷是否為某個類的對象
print(isinstance(dog1, Dog)) # True print(isinstance(dog1, Animal)) # True print(isinstance(a1, Animal)) # True print(isinstance(a1, Dog)) # False print(isinstance('hello', Animal)) # False可以在doEat()函數中,添加isinstance(),判斷輸入的obj是否為Animal的對象,只有是Animal對象時,才能調用eat()方法
# 函數 def doEat(obj): # obj只有為Aniaml類或子類對象才有eat方法 # isinstance判斷是否為某個類或子類的對象 # 參數1 obj 對象 # 參數2 type 類(類型) if isinstance(obj, Animal): obj.eat()?
總結
以上是生活随笔為你收集整理的Python—实训day3—简单的在线翻译程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 养成这8个好习惯 开车会很安全的
- 下一篇: HTML5的历史