下面是今天的第二個爬蟲,聽名字就感覺比之前那個有意思了很多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編碼。具體的字符編碼的問題見這里:
接下來讀取信息并解碼。JSON是一種輕量級的數據交換格式,我們需要從爬取到的內容中找到JSON格式的數據,這里面保存著我們想要的翻譯結果,再將得到的JSON格式的翻譯結果進行解析。
下面運行看看,一開始失敗了,然后據說是有道改變了翻譯接口現在爬不了了有點失望。但又看到說把url那里的_o去掉即可。試了一下果然可以。原因是現在抓包獲取的請求地址有問題,不是最后的翻譯接口,應該是后續需要處理,而有道翻譯的處理恰好是去掉那_o。
再多提一句json:
分別print(html)和print(translate_results)觀察json的效果:
可以看到,通過loads的方法,把字符串轉換成字典。