利用python可以实现对百度翻译内容的爬取,具体过程如下:
前期工作
本程序的测试环境为python3.5,Chrome浏览器。进入百度翻译的页面,点开F12进入开发者调试工具,点击network,并清空所有的请求,方便判断点击“翻译”按钮后,会有哪些请求,上述过程如下图所示:
![26bbaa6abce6fb38978f0c58b6e52ec8.png](https://i-blog.csdnimg.cn/blog_migrate/4c77fa547503c3dc082afb33e710c615.jpeg)
在百度翻译中输入想要翻译的内容,并点击翻译,在network的请求框中可以看到如下一堆的请求:
![d4851848008ee72c604debf802dd784a.png](https://i-blog.csdnimg.cn/blog_migrate/4a397ebf24646ae59f1c76230da47ee5.jpeg)
从上到下依次点击,在Response中,如果发现翻译结果,说明这个就是执行翻译请求的URL。本人对应的request是第四个,即v2transapi,对应的Response为:
![08a63e53f86ffd0372a617f4f9f0929c.png](https://i-blog.csdnimg.cn/blog_migrate/f44748f2ccb35d5fd490886029f858d7.png)
因为本人执行的是英译汉,即最后输出的是中文,所以在上述翻译结果中,中文被转码为Unicode编码格式,不影响后续爬取结果,后台转码就可以了,后续会有相应介绍。
对应的Headers(请求头,部分)为:
![a4f9011d42dedd4c7509280d7e32195a.png](https://i-blog.csdnimg.cn/blog_migrate/3c78f51da097928cdd830e7227e206a4.jpeg)
对于上述请求头中的内容,对我们来说比较重要的有如下几个部分:
- General:
![5b2f5575bcbe5be11758a269660cc50b.png](https://i-blog.csdnimg.cn/blog_migrate/0df6795211a2ddacca49165dfee1c7c8.jpeg)
- Request Headers:
![6d916b0f61e4ed055ae5ea9279e93b7f.png](https://i-blog.csdnimg.cn/blog_migrate/fe3631ebf8b4ec89d8f448bfde628131.jpeg)
- Form Data:
![dd6dc0604a41790cc5100644b73fda1d.png](https://i-blog.csdnimg.cn/blog_migrate/3237bf186a61a97d43694c8021f820b5.jpeg)
Python程序
# coding=utf-8
import requests
url = "https://fanyi.baidu.com/v2transapi"
data = {
"from": "en",
"to": "zh",
"query": "hello",
"transtype": "translang",
"simple_means_flag": "3",
"token": "f8c8ea6c95d6e9e7ba318e136ee2c490",
"sign": "54706.276099" # 随着翻译内容变化而变化
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
"Cookie": "BDUSS=I2N2tPRVBXZk5zQnZJdmV6QnY5ZDc1anNEU2lrcWVCN25lQ2t6bXJ2amd5a1JiQVFBQUFBJCQAAAAAAAAAAAEAAACiHXkweGllY2hlbmcxOTk1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOA9HVvgPR1bcT; BIDUPSID=FCDC0DE1E2A0BC542BE845EF57F0DA5F; PSTM=1560475969; BAIDUID=FCDC0DE1E2A0BC54F756173A5902B1FB:FG=1; locale=zh; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; 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; from_lang_often=%5B%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; Hm_lvt_afd111fa62852d1f37001d1f980b6800=1561467752,1561468730,1561469040,1561469241; Hm_lpvt_afd111fa62852d1f37001d1f980b6800=1561469241; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1561468730,1561469040,1561469241,1561470454; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1561470454; yjs_js_security_passport=5453d43730575af39e7a665570b61ece7f5fc95b_1561470456_js"
}
response = requests.post(url, data=data, headers=headers)
print(response)
print(response.content.decode('unicode_escape')) # 中文转码
程序说明:
- url为General中Request URL的地址;
- data是将 Form Data中的内容写成字典的形式;
- headers是请求头,从Request Headers中将"User-Agent"和"Cookie"提取出来;
- response.content.decode(‘unicode_escape’):当相应结果中存在中文的时候,利用这种编码格式进行转码。
结果如下:
![39de6278ee3547c3c4c69f0b88bbff90.png](https://i-blog.csdnimg.cn/blog_migrate/26e0ff775a98989233e2c71dbabdaa65.jpeg)
注意
由于百度对外部爬虫的限制,在请求头当中,一定要把cookie带上,否则会出现error:997,没有翻译结果等类似的错误。另外data中内容一定要全,经笔者测试,改变翻译内容,data中的sign会发生变化,其他的如token(应该是加密用的),包括请求头中的cookie,user-agent在同一个浏览器下是不会改变的。sign的加入应该是百度为了防止外界直接对url进行请求,而不通过浏览器请求的一种限制吧。