2.利用urllib.urlopen向有道翻譯發送數據獲得翻譯結果

下面是今天的第二個爬蟲,聽名字就感覺比之前那個有意思了很多hhhhhhh。

```

from urllib import request

from urllib import parse

import json

url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'

Form_Data={}

Form_Data['i']='love'

Form_Data['from']='Auto'

Form_Data['to']='Auto'

Form_Data['smartresult']='dict'

Form_Data['client']='fanyideskweb'

Form_Data['salt']='1510400502943'

Form_Data['sign']='dfdd0d2494764cd83f2cab4e39f29f85'

Form_Data['doctype']='json'

Form_Data['version']='2.1'

Form_Data['keyfrom']='fanyi.web'

Form_Data['action']='FY-BY-REALTIME'

Form_Data['typoResult']='flase'

data=parse.urlencode(Form_Data).encode('utf-8')

response=request.urlopen(url,data)

html=response.read().decode('utf-8')

translate_results=json.loads(html)

#translate_results=translate_results['translateResult'][0][0]['tgt']

print("翻譯內容: %s" % (translate_results['translateResult'][0][0]['tgt']))

```

話說這個粘代碼的到底怎么搞。。。

首先引入urllib庫的request函數和parse函數。request函數之前已經提到過了,不過這次的調用與上次略有不同,稍后和parse函數還有jason庫細講。

下面打開有道頁面,輸入一個字并點翻譯。介于今天是單身狗節,我輸了一個love。


接下來右鍵——>檢查/審查元素



點左邊那欄那個translate_os?smartresult,然后就會出來右邊那一堆東西。

點擊Network——>Headers,下面需要留意一些東西:

1.General下顯示本頁面的url

2.Form Data


Form_Data={}用于創建一個字典,接下去那幾行結構類似的代碼均根據剛才Form Data那的值直接對字典中不存在的key進行賦值來添加。

字典屬性的特性和操作網上的講解太多啦不贅述了。

下面說一下urlopen的data參數

我們可以使用data參數,向服務器發送數據。根據HTTP規范,GET用于信息獲取,POST是向服務器提交數據的一種請求,再換句話說:

從客戶端向服務器提交數據使用POST;

從服務器獲得數據到客戶端使用GET(GET也可以提交,暫不考慮)。

如果沒有設置urlopen()函數的data參數(就像之前我們的調用),HTTP請求采用GET方式,也就是我們從服務器獲取信息,如果我們設置data參數,HTTP請求采用POST方式,也就是我們向服務器傳遞數據。

data參數有自己的格式,它是一個基于application/x-www.form-urlencoded的格式,具體格式我們不用了解, 因為我們可以使用urllib.parse.urlencode()函數將字符串自動轉換成上面所說的格式。

可以說,urlencode()主要作用就是將url附上要提交的數據。Post的數據必須是bytes或者iterable of bytes,不能是str,因此需要進行encode()編碼。這里提一下,在計算機內存中,統一使用Unicode編碼,當需要保存到硬盤或者需要傳輸的時候,就轉換為UTF-8編碼。具體的字符編碼的問題見這里:

www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000

接下來讀取信息并解碼。JSON是一種輕量級的數據交換格式,我們需要從爬取到的內容中找到JSON格式的數據,這里面保存著我們想要的翻譯結果,再將得到的JSON格式的翻譯結果進行解析。


下面運行看看,一開始失敗了,然后據說是有道改變了翻譯接口現在爬不了了有點失望。但又看到說把url那里的_o去掉即可。試了一下果然可以。原因是現在抓包獲取的請求地址有問題,不是最后的翻譯接口,應該是后續需要處理,而有道翻譯的處理恰好是去掉那_o。


再多提一句json:

分別print(html)和print(translate_results)觀察json的效果:


可以看到,通過loads的方法,把字符串轉換成字典。

具體的在這里:www.cnblogs.com/bainianminguo/p/6676067.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容