python出现errorcode50_Python 有道翻译爬虫,{errorCode:50}

今天在做有道翻译爬虫练习,发现服务器一直返回 {"errorCode":50} 这个错误,后来发现原来有道添加了反爬机制的验证 salt 和 sign。

经过查看页面源码中发现一个 fanyi.min.js 文件,如图:

3dcffb106239a5b463f3dc7573bb6399.png

打开这个 js 文件, 复制JS中内容用http://tool.oschina.net/codeformat/js 格式化后 ,在内容中搜索 salt 会搜出 3 处结果:

结果一:

74745add7c87f6bf445a3cfb6191c477.png

结果二:

3f092c8f67a145471cca1d2f75f1f12b.png

结果三:

a3c3af885bbaa1fa4e6712b14ba7a47d.png

这个三个结果到底是看哪一个呢? 通过使用 fiddler 抓取的包发现,version: 2.1,所以直接看搜索结果三中的代码:

5b2c75963a2e2357d22f9fb4b391a1df.png

然后分析搜索结果中的代码:

979f5d6d86cd81c1d83a5b0f2238a43b.png

749f8b1de3a0850fee7d2d79da97b06a.png

OK,找到这些后,我们照着代码样子,用python的方式,生成一个时间戳 和 sign 即可。

全部代码如下:

# -*- coding:utf-8 -*-

'''

使用 POST 方式抓取 有道翻译

urllib2.Request(requestURL, data=data, headers=headerData)

Request 方法中的 data 参数不为空,则默认是 POST 请求方式

如果 data 为空则是 Get 请求方式

{"errorCode":50}错误:

有道翻译做了一个反爬虫机制,就是在参数中添加了 salt 和 sign 验证,具体操作说明参考:

http://www.tendcode.com/article/youdao-spider/

'''

import urllib, urllib2

import time

import random

import hashlib

import sys

# 字符串转 utf-8 需要重新设置系统的编码格式

reload(sys)

sys.setdefaultencoding('utf8')

# 目标语言

targetLanguage = 'Auto'

# 源语言

sourceLanguage = 'Auto'

headerData = {

'Cookie': 'OUTFOX_SEARCH_USER_ID=-2022895048@10.168.8.76;',

'Referer': 'fanyi.youdao.com',

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'

}

# 语言类型缩写

languageTypeSacronym = {

'1': 'zh-CHS 》 en',

'2': 'zh-CHS 》 ru',

'3': 'en 》 zh-CHS',

'4': 'ru 》 zh-CHS',

}

# 翻译类型

translateTypes = [

'中文 》 英语',

'中文 》 俄语',

'英语 》 中文',

'俄语 》 中文'

]

def startRequest(tanslateWd):

requestURL = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

client = 'fanyideskweb'

timeStamp = getTime()

key = 'ebSeFb%=XZ%T[KZ)c(sy!'

sign = getSign(client, tanslateWd, timeStamp, key)

data = {

'i': tanslateWd,

'from':sourceLanguage,

'to':targetLanguage,

'client':client,

'doctype':'json',

'version':'2.1',

'salt':timeStamp,

'sign':sign,

'keyfrom':'fanyi.web',

'action':'FY_BY_REALTIME',

'typoResult':'true',

'smartresult':'dict'

}

data = urllib.urlencode(data)

request = urllib2.Request(requestURL, data=data, headers=headerData)

resonse = urllib2.urlopen(request)

print(resonse.read())

# 生成时间戳

def getTime():

return str(int(time.time() * 1000) + random.randint(0, 10))

# 生成 Sign

def getSign(client, tanslateWd, time, key):

s = client + tanslateWd + time + key

m = hashlib.md5()

m.update(s.encode('utf-8'))

return m.hexdigest()

def getTranslateType(translateType):

global sourceLanguage, targetLanguage

try:

if translateType:

l = languageTypeSacronym[translateType].split(' 》 ')

sourceLanguage = l[0]

targetLanguage = l[1]

except:

print('翻译类型选择有误,程序将使用 Auto 模式为您翻译')

if __name__ == '__main__':

print('翻译类型:')

for i, data in enumerate(translateTypes):

print('%d: %s' %(i + 1, data))

translateType = raw_input('请选择翻译类型:')

getTranslateType(translateType)

tanslateWd = raw_input('请输入要翻译的消息:')

startRequest(tanslateWd)

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值