王崇刚
摘要:利用Python爬取网页数据通常使用Python的urllib库及第三方requests库实现,本文阐述了如何利Python的第三方requests库向有道翻译在线翻译网站发送POST请求,并对有道翻译网站的加密过程进行了分析,最后将网站反馈的翻译结果进行处理,从而实现基于Python在线翻译爬虫。
关键词: Requests ;Python;网络爬虫;在线翻译
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2019)28-0219-03
Abstract: Usually use Python crawl web data using the Python urllib library and the realization of the third party requests the library, this paper expounds how the third party requests of Python library send a POST request to the translation youdao online translation website, and the encryption process of youdao translation site was analyzed, and finally translated website feedback result, which is based on the Python online translation the crawler.
Key words: Requests;Python;Web crawler;Online translation
有道翻译网站采用HTTP协议实现客户端浏览器与翻译网站通信,利用Python编写爬虫程序伪装成为浏览器与在线翻译网站通信,从而实现在线翻译爬虫。Python通常使用urllib库、requests库实现爬取网站数据,而requests库提供了更高级的封装、使用更为簡洁、更容易理解等优势,从而获得了更为广泛的使用。本文将使用requests库中的方法实现在线翻译爬虫。
1 在线翻译爬虫的实现准备
1.1 分析在线翻译网站前的准备
打开浏览器在浏览器地址栏中输入有道翻译网站地址(http://fanyi.youdao.com/),同时打开Fiddler软件捕获通信数据包,在有道翻译网站的对话框中输入需要翻译的文字“贵州省贵阳市观山湖区”,通过翻译可以得到翻译后的英文“Guanshanhu district, guiyang city, guizhou province”,该翻译结果作为后期爬虫的验证使用。
1.2 分析请求方式
通过Fiddler软件分析浏览器与有道翻译网站通信数据包,分析浏览器与翻译网站通信中HTTP协议及参数含义,通过Fiddler软件抓取数据包分析(如图 1所示),有道翻译网站均采用HTTP协议中的POST方法将需要翻译的文本提交给服务器处理。
1.2 与有道翻译网站通信POST请求参数的分析
通过图 2可以得到有道翻译网站POST请求中的参数,参数“i”标识需要翻译的文本,参数“i”的值为“贵州省贵阳市观山湖区”;参数“from”表示翻译前的文本语言,默认值为自动检测翻译前的文本语言;参数“to”表示需要翻译的目标语言,默认值为auto语言(默认翻译是中英、英中的翻译);参数“salt”表示时间戳用于加密时使用;参数“sign”表示加密验证字段,该加密验证字段根据需要翻译文本和时间戳进行加密,所以每次请求不一致。
1.4 有道翻译网站返回翻译结果分析
通过Fiddler软件分析,有道翻译网站返回的翻译结果均采用JSON格式,JSON是一种简单的数据交换格式,其优点是数据格式简单,易于读写,占用带宽小;易于解析,支持多种语言。
通过图 3分析得出,有道翻译网站返回结果在translateResult对象中,在translateResult对象中“src”为翻译前文本的key,其key对应的value为贵州省贵阳市观山湖区,“tgt”为翻译后文本的key,其key对应的value为Guanshanhu district, guiyang city, guizhou province。
2在线翻译网站加密验证分析
通过Fiddler软件对有道翻译网站HTTP协议分析,有道翻译网站为了防止网络爬虫采用了加密验证,通过分析有道翻译网站上的fanyi.min.js文件,有道翻译网站加密验证首先需要生成一个13位salt时间戳,该时间戳不仅是POST请求中的salt的值还是计算sign中的主要参数之一。其次,通过MD5消息摘要算法生成一个128位的散列值,消息摘要算法中须要包含“fanyideskweb”、翻译的文本、有道翻译网站的加密字符串(该加密字符串每隔一段时间会发生变化,具体加密字符串见fanyi.min.js文件中的sign加密算法)等参数,通过MD5计算后的散列值就是POST请求中的sign值。具体加密验证流程见图4所示。
时间戳参数算法中的参数说明:time.time()获取当前时间的时间戳,因Python返回的时间戳是只有10位整数的浮点数,为获取13位时间戳,将时间戳乘以1000以获取13位时间戳值;random.randint(0, 10)是随机获取10以内的正整数,最后将13位时间戳值加上10以内的正整数结果取整数部分得到时间戳参数salt的值。
sign方法中的参数说明:get_md5()是Python的MD5的方法,fanyideskweb参数指的是客户端类型为网页,key参数表示需要翻译的文本,str(salt)参数表示将13位整数时间戳转换为字符串,加密字符串每隔一段时间回发生变化,该字符串可在fanyi.min.js文件中中进行通过搜索关键字“sign:n.md5”,查找到如sign:n.md5 (“fanyideskweb”+e+i+”加密字符串”)字样获取加密字符串,也可以通过爬虫查找加密字符串。
Fanyi.min.js 地址如下:http://shared.ydstatic.com/fanyi/newweb/v1.0.18/scripts/newweb/fanyi.min.js
3 在线翻译爬虫的实现
通过分析了在线翻译网站的请求方法、参数含义、返回结果、加密验证后,在线翻译爬虫可以依据图 5的流程来实现。
3.1 构建HTTP请求Header,伪装浏览器
构建http的请求头部目的在于伪装成为浏览器与翻译网站进行通信,构造方法如下:
Httpheaders = {“User-Agent”: “Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0”, “Referer”: “http://fanyi.youdao.com/”},这里以构造火狐浏览器的请求头部为例,请求的网址是:http://fanyi.youdao.com/
3.2 构建Post请求中data参数
Post请求参数中需要包含需要翻译的文字、salt、sign等主要参数,salt、sign的方法见本文的第三部分,需要构建的参数如图 2所示。构建Post请求中data参数的方法如下:
WebForms = {“i”: src_word,”from”: “AUTO”, “to”: “AUTO”, “smartresult”: “dict”, “client”: “fanyideskweb”,”salt”: salt,”sign”: sign,”doctype”: “json”,”version”: “2.1”, “keyfrom”: “fanyi.web”,”action”: “FY_BY_REALTIME”,”typoResult”: “false”}
retrun WebForms
3.3 向在线翻译网站发送POST请求
在构造完POST的data后,利用requests库中的post方法向有道翻译网站发送post请求,其中cookies为http请求中产生的cookies。
Response = requests.post(url, headers=Httpheaders, data=WebForms, cookies=cookies)
3.4 获取返回的json数据
从响应中获取json参数,通过处理提取翻译结果并打印,具体代码如下:
json_str = response.json() #从响应中获取json字符串
json_str = re.sub(‘\, ‘\”, str(json_str)) # 将单引号变为双引号
jsonObj=json.loads(json_str) #将已编码的 JSON 字符串解码为 Python 对象
tgt_dic=jsonObj[‘translateResult][0][0][‘tgt] #提取 JSON中的翻译结果
print(“翻译结果:”+tgt_dic) #打印翻译结果
4 在线翻译爬虫的结果分析
通过有道翻译网站(如图 6所示)与基于Python在线翻译爬虫程序(如图 7所示)对“贵州省贵阳市观山湖区”和“Guanshanhu district, guiyang city, guizhou province”两句话翻译的结果进行对比分析,翻译结果一致,说明基于Python在线翻译爬虫已经实现。
参考文献:
[1]夏天琦.Python爬虫获取网络图片[J].电子世界,2018(10).
[2]韩前进.Web在线爬虫的设计与实现[J].软件,2018(9).
[3]劉荣欣.基于Apache HttpClient的在线翻译代理系统的设计与实现[D].东北大学,2014.
[4]郭丽蓉. 基于Python的网络爬虫程序设计[J].电子技术与软件工程,2017(23)
[5]施俊龙.动态口令S/KEY认证协议的改进与应用[D].合肥工业大学,2010.
[6]网易公司. 有道翻译API[OL]. http://fanyi.youdao.com/openapi.
【通联编辑:唐一东】