通过爬虫实现百度在线翻译

使用post请求:

  • 我们一般使用requests中的post请求会基于以下情况:
    1.模仿浏览器进行登录注册
    2.需要传输大文本数据时(post请求不限制数据长度)

  • 使用requests模块实现爬虫:requests.post(url=post_url,data=data)

寻找url与js数据:通过爬虫实现百度在线翻译_第1张图片

一、 实现英文–>中文的翻译:

# coding=utf-8
import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"}
data = {
    "from":"en",
    "to":"zh",
    "query":"hola",
    "transtype":"translang",
    "simple_means_flag":"3",
    "sign":"372549.85108",
    "token":"e89a8f037aac1b51a86cbc82356949d"
}
post_url = "http://fanyi.baidu.com/v2transapi"

r = requests.post(post_url,data=data,headers=headers)
print(r.content.decode())
  • 此时,执行代码会返回:
    {“error”:997,”from”:”en”,……}
    分析检查界面中的headers会发现,sign这个值会随着输入内容不同改变(也就是js动态生成的.),因此我们考虑将网页版改为手机版浏览。
    通过爬虫实现百度在线翻译_第2张图片
    通过爬虫实现百度在线翻译_第3张图片

    手机版代码与电脑版代码区别仅为url的不同,下面是手机版的爬虫代码。

# coding=utf-8
import requests
import json
import sys

query_string = sys.argv[1]

headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Mobile Safari/537.36"}

post_data = {
    "query":query_string,
    "from":"zh",
    "to":"en",
}

post_url = "http://fanyi.baidu.com/basetrans"

r = requests.post(post_url,data=post_data,headers=headers)
# print(r.content.decode())
dict_ret = json.loads(r.content.decode())
ret = dict_ret["trans"][0]["dst"]
print("result is :",ret)

二、实现自动检测语言的功能:

# coding=utf-8
import requests
import json
import sys

class BaiduFanyi:
    def __init__(self,trans_str):
        self.trans_str = trans_str
        self.lang_detect_url = "http://fanyi.baidu.com/langdetect"
        self.trans_url = "http://fanyi.baidu.com/basetrans"
        self.headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Mobile Safari/537.36"}

    def parse_url(self,url,data): #发送post请求,获取响应
        response = requests.post(url,data=data,headers=self.headers)
        return json.loads(response.content.decode())

    def get_ret(self,dict_response):#提取翻译的结果
        ret = dict_response["trans"][0]["dst"]
        print("result is :",ret)


    def run(self):#实现主要逻辑
        #1.获取语言类型
            #1.1 准备post的url地址,post_data
        lang_detect_data = {"query":self.trans_str}
            #1.2 发送post请求,获取响应
        lang = self.parse_url(self.lang_detect_url,lang_detect_data)["lan"]
            #1.3 提取语言类型
        #2.准备post的数据
        trans_data = {"query":self.trans_str,"from":"zh","to":"en"} if lang== "zh" else \
            {"query":self.trans_str,"from":"en","to":"zh"}
        #3.发送请求,获取响应
        dict_response = self.parse_url(self.trans_url,trans_data)
        #4.提取翻译的结果
        self.get_ret(dict_response)


if __name__ == '__main__':
    trans_str= sys.argv[1]
    baidu_fanyi = BaiduFanyi(trans_str)
    baidu_fanyi.run()

你可能感兴趣的:(爬虫)