用爬虫做一个翻译“客户端”

博主为方便专业英语复习,利用爬虫抓取百度翻译动态加载的数据,通过分析请求和JSON响应,提取所需内容,编写了仅二十几行代码的小型翻译客户端。使用pyinstaller进行打包,但由于Python运行方式,生成的客户端体积较大。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提

前些时,要考专业英语了,看见室友一边对着百度翻译,一边复习单词,心生一想法,页面明显是动态加载出来的,我能不能抓到它返回的东西,然后提取出来,这样可以弄成以个客户端,可以试一试。

观察

打开百度翻译的页面,调用浏览器的开发者模式,输入一个“你好”,然后刷新,观察请求在哪里,其实挺简单的,一下子就可以看到,请求,如下图

请求观察

看到这里问题就十分的简单了,直接去看它的请求头,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()

打包

既然是”客户端”,没有可运行软件怎么行(滑稽),所以我还特地将这个小东西打包了,用的pyinstaller,怎么打包的就不详细解释了。
最后来了个170m+大小的客户端,我也是醉了,(没办法,不是所有机器都安装了python)。至于为什么这么大,原因也很简单,它不仅打包了源码,它还打包了对应的包,库等等,几乎相当于一个小型的python解析器,这样做也是和python的运行方式有关的,他和c翻译成机器码的方式不一样,他是一句一句解释翻译成机器码的,所以要运行他,就必须“随身”自带解析器。

总结

本次小demo,本身代码不难,主要是练练手,学习了不能生疏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值