爬蟲學(xué)習(xí)記錄1-errorcode 50(有道翻譯)

1.首先用了urllib包中的request模塊。

在這個模塊中

response1 = urllib.request.Request(url, data,header)

response = urllib.request.urlopen(response1)

這兩步的結(jié)合就等于urllib.request.urlopen(url,data),但是有點遺憾的是urlopen中不能傳入header部分。所以當(dāng)需要結(jié)合header時,我們需要用兩步來完成。

獲取來的response,我們可以通過response.read()來獲取到反映內(nèi)容。具體操作見下文:以有道翻譯為例,進行了嘗試。需要注意的是,用這個包來訪問的話我們對編碼有要求的話需要引入另一個模塊urllib.parse。具體操作見下面:

源代碼:

import urllib.request

import hashlib

import time

import json

import random

import urllib.parse

class translate(object):

def __init__(self,mes):

self.mes=mes

self.salt=self.get_salt()

self.sign=self.get_sign(self.salt)

self.result=self.get_result(self.mes,self.salt,self.sign)

def get_sign(self,salt):

value="fanyideskweb"+self.mes+salt+"p09@Bn{h02_BIEe]$P^nG"

? ? ? ? sign=hashlib.md5(value.encode('utf-8'))

sign=sign.hexdigest()

return sign

def get_salt(self):

tm =int(time.time() *1000)

rm = random.randint(0, 10)

st =str(tm + rm)

return st

def get_result(self,mes,salt,sign):

data={

'i':mes,

? ? ? ? ? ? 'from':'AUTO',

? ? ? ? ? ? 'smartresult':'dict',

? ? ? ? ? ? 'client':'fanyideskweb',

? ? ? ? ? ? 'salt':salt,

? ? ? ? ? ? 'sign':sign,

? ? ? ? ? ? 'ts':"1548211604248",

? ? ? ? ? ? 'bv':"363eb5a1de8cfbadd0cd78bd6bd43bee",

? ? ? ? ? ? 'doctype':'json',

? ? ? ? ? ? 'version':'2.1',

? ? ? ? ? ? 'keyfrom':'fanyi.web',

? ? ? ? ? ? 'action':"FY_BY_CLICKBUTTION",

? ? ? ? ? ? 'typoResult':"true"

? ? ? ? }

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

header={

"Cookie":"OUTFOX_SEARCH_USER_ID=-164022675@36.110.13.42;",

? ? ? ? ? ? "Referer":"http://fanyi.youdao.com/?keyfrom=dict2.top",

? ? ? ? ? ? "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"

? ? ? ? }

url="http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"

? ? ? ? try:

response1 = urllib.request.Request(url, data,header)

response = urllib.request.urlopen(response1)

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

html=json.loads(html)

if 'translateResult' in html:

rs = html['translateResult'][0][0]['tgt']

return rs

else:

pass

? ? ? ? except:

return "this is a wrong."

if __name__=='__main__':

while True:

mes=input("請輸入內(nèi)容:")

if mes =='q':

break

? ? ? ? t=translate(mes)

# t.my_ip()

? ? ? ? re=t.result

print(re)

time.sleep(5)


源代碼1/3
源代碼2/3
源代碼3/3

2. 本來是跟著視頻學(xué)習(xí),結(jié)果有道翻譯的源代碼改進了,原本的學(xué)習(xí)代碼在訪問時會報errorcode 50原來是對參數(shù)進行了加密,去查看其中的js文件就可以發(fā)現(xiàn)加密內(nèi)容。


js中相關(guān)部分代碼

3.將本來很簡單的代碼修改了了一下,根據(jù)js中的加密邏輯對內(nèi)容進行更改就可以了(完成版就是第一部分中展示的源代碼)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容