前提
前些时,要考专业英语了,看见室友一边对着百度翻译,一边复习单词,心生一想法,页面明显是动态加载出来的,我能不能抓到它返回的东西,然后提取出来,这样可以弄成以个客户端,可以试一试。
观察
打开百度翻译的页面,调用浏览器的开发者模式,输入一个“你好”,然后刷新,观察请求在哪里,其实挺简单的,一下子就可以看到,请求,如下图
看到这里问题就十分的简单了,直接去看它的请求头,url,等等信息。就不贴图了,我直接把东西复制过来。
//url
Request URL:http://fanyi.baidu.com/v2transapi
Request Method:POST
Status Code:200 OK
Remote Address:106.39.162.57:80
Referrer Policy:no-referrer-when-downgrade
Response Headers
view source
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://fanyi.baidu.com
Content-Encoding:gzip
Content-Type:application/json
Date:Thu, 28 Dec 2017 10:46:41 GMT
Server:Apache
Transfer-Encoding:chunked
Vary:Accept-Encoding
Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Content-Length:135
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; hasSeenTips=1; BDUSS=092MXZIUUpRVmsxeXc4Un40Z0syNFA5R09vSW85blo2MTN0Y0FoMWFCSHFHeXBhSVFBQUFBJCQAAAAAAAAAAAEAAADTG5o7s8HX7cqvzbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOqOAlrqjgJaQ; BIDUPSID=9031C567EAC4570B76EC8F119E680E57; PSTM=1510844627; BAIDUID=9031C567EAC4570BA33B59265BD71214:FG=1; locale=zh; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1513843565,1513843571,1513854394,1514457956; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1514457988; from_lang_often=%5B%7B%22value%22%3A%22it%22%2C%22text%22%3A%22%u610F%u5927%u5229%u8BED%22%7D%2C%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%2C%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%5D; to_lang_often=%5B%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%2C%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%5D
Host:fanyi.baidu.com
Origin:http://fanyi.baidu.com
Referer:http://fanyi.baidu.com/
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36
X-Requested-With:XMLHttpRequest
//表单数据。
Form Data
view source
view URL encoded
from:zh
to:en
query:你好
transtype:realtime
simple_means_flag:3
sign:232427.485594
token:35678560329991533049e493613af2c3
看着一大串,其实要做的还好,找到url,找到发送过去的form data 数据,外加包装一个请求头,防止被封了。
分析返回的数据
怎么请求弄好了,但是它返回的是一大串json字符串,要把他的结果解析出来,找到自己想要的东西,这里我推荐一个好东西,一个可以在线将json代码格式化的的网站 链接在这里。当然你也可以自己下载个工具。例如hijson 和json view 来解析,当然你也可以自己动手解析,不过有时候json数据太大了,看的真的眼花缭乱。
然后直接提取自己想要的东西就可以了,发现里面返回的东西几乎包含了页面上显示的所有东西。我简单的取了些意思。
代码
这次的代码比较简单,几乎二十几行就解决了。
import requests
import json
def search(key):
url="http://fanyi.baidu.com/v2transapi"
data={
"from":"zh",
"to":"en",
"query":key,
"transtype":"realtime",
}
headers={
'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
}
# url=ur+urlencode(data)
response=requests.post(url=url,data=data,headers=headers)
if response.status_code==200:
html=response.text
rst=json.loads(html)
res=rst['trans_result']['data']
res1=rst['dict_result']['simple_means']['word_means']
result=res[0]['dst']
print("百度翻译结果是:"+result)
print("简明释义:")
for item in res1:
print(item)
else:
print(response.status_code+"请求错误")
def main():
print("请输入翻译内容(退出请输入end):")
word=input()
key_word=str(word)
if key_word=="end":
exit()
else:
search(key_word)
main()
if __name__=='__main__':
main()