当前位置:   article > 正文

网络爬虫:利用有道实现“语言翻译”功能_有道爬虫翻译怎么实现造句功能

有道爬虫翻译怎么实现造句功能

基本代码

代码如下:

import urllib.request
import urllib.parse
import json

def main():
    while True:
        content=input("请输入需要翻译的内容(退出输入q):")
        if content in ("Q","q","quit"):
            break
        else:
            url="http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

            data={}
            data["type"]="AUTO"
            data["i"] = content
            data["doctype"] = "json"
            data["xmlVersion"] = "1.8"
            data["keyfrom"] = "fanyi.web"
            data["ue"] = "utf-8"
            data["action"] = "FY_BY_CLICKBUTTON"
            data["typoResult"] = "true"
            data=urllib.parse.urlencode(data).encode("utf-8")

            # 增加headers,模拟登陆,而不是对服务器识别为机器登陆。
            headers={}
            headers["User-Agent"]="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"

            req=urllib.request.Request(url,data,headers)

            #或者使用Request.add_header(key,value)
            # req=urllib.request.Request(url,data)
            # req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36")

            response=urllib.request.urlopen(req)
            html=response.read().decode("utf-8")

            target=json.loads(html)
            # print (type(target))
            # print (target["translateResult"])
            # print (target["translateResult"][0][0])
            print("翻译的结果为:%s" %(target["translateResult"][0][0]["tgt"]))

if __name__=="__main__":
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

分析:
(1)这里要注意的是三个函数urllib.request.Request(),urllib.request.urlopen()与urllib.parse.urlencode()。

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)这个类是一个抽象的URL请求。

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)。因此urllib.request.urlopen()其实不止一个参数,有好几个哦,其中第二个是data,data应该是一个buffer的标准应用程序/ x-www-form-urlencoded格式(python标准库原文:data should be a buffer in the standard application/x-www-form-urlencoded format)。

urllib.parse.urlencode()函数接受一个映射或序列集合,并返回一个字符串的格式(python标准库原文:The urllib.parse.urlencode() function takes a mapping or sequence of 2-tuples and returns a string in this format)。

(2)分析URL,此时分析有道翻译页面真实的Request URL
这里写图片描述
Request URL:
http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null

(3)Data为字典
type:AUTO
i:I love you
doctype:json
xmlVersion:1.8
keyfrom:fanyi.web
ue:UTF-8
action:FY_BY_CLICKBUTTON
typoResult:true

(4)headers 应该是一个字典,如果 add_header()被称为与每个键和值作为参数。这通常是用来“恶搞” User-Agent头的值,因为使用一个浏览器识别本身——一些常见HTTP服务器只允许请求来自浏览器而不是脚本。例如,Mozilla Firefox可能识别本身 “Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11”。而 urllib默认的用户代理字符串 是”Python-urllib/2.6”在Python 2.6()。

(5)存储为json格式,则使用json.load()方法

target=json.loads(html)
  • 1

结果为:
{‘errorCode’: 0, ‘smartResult’: {‘entries’: [”, ‘我爱你。’], ‘type’: 1}, ‘elapsedTime’: 0, ‘translateResult’: [[{‘tgt’: ‘我爱你’, ‘src’: ‘I love you’}]], ‘type’: ‘EN2ZH_CN’}

我看到翻译的结果在这里:
‘translateResult’: [[{‘tgt’: ‘我爱你’, ‘src’: ‘I love you’}]]。包含在字典的Value里,外面有2层列表,里面还有一层字典。

添加代理

但是,对于网站服务器,会发现同一个IP在短时间内有大量的登录,识别是爬虫。因为,即使现在我们修改了 User-Agent,也不起作用。此时的做法有两种:

1. 笨方法,修改访问时间

修改每次访问的时间,比如每5秒钟访问一次服务器,这样效率太低。

import urllib.request
import urllib.parse
import json
import time

def main():
    while True:
        content=input("请输入需要翻译的内容(退出输入q):")
        if content in ("Q","q","quit"):
            break
        else:
            url="http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

            data={}
            data["type"]="AUTO"
            data["i"] = content
            data["doctype"] = "json"
            data["xmlVersion"] = "1.8"
            data["keyfrom"] = "fanyi.web"
            data["ue"] = "utf-8"
            data["action"] = "FY_BY_CLICKBUTTON"
            data["typoResult"] = "true"
            data=urllib.parse.urlencode(data).encode("utf-8")

            # 增加headers,模拟登陆,而不是对服务器识别为机器登陆。
            headers={}
            headers["User-Agent"]="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"

            req=urllib.request.Request(url,data,headers)

            #或者使用Request.add_header(key,value)
            # req=urllib.request.Request(url,data)
            # req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36")

            response=urllib.request.urlopen(req)
            html=response.read().decode("utf-8")

            target=json.loads(html)
            # print (type(target))
            # print (target["translateResult"])
            # print (target["translateResult"][0][0])
            print("翻译的结果为:%s" %(target["translateResult"][0][0]["tgt"]))

        time.sleep(5)

if __name__=="__main__":
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

(2)聪明方法:使用代理

步骤为:
1.参数是一个字典{“类型”:”代理ip:端口号”}
proxy_support=urllib.request.ProxyHandler({})
2.定制、创建一个opener
opener=urllib.request.build_opener(proxy_support)
3a.安装opener
urllib.request.install_opener(opener)
3b.调用opener
opener.open(url)

import urllib.request
import urllib.parse
import json

def main():
    while True:
        content=input("请输入需要翻译的内容(退出输入q):")
        if content in ("Q","q","quit"):
            break
        else:

            url="http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

            data={}
            data["type"]="AUTO"
            data["i"] = content
            data["doctype"] = "json"
            data["xmlVersion"] = "1.8"
            data["keyfrom"] = "fanyi.web"
            data["ue"] = "utf-8"
            data["action"] = "FY_BY_CLICKBUTTON"
            data["typoResult"] = "true"
            data=urllib.parse.urlencode(data).encode("utf-8")

            #百度搜索免费代理IP即可
            #比如:125.46.64.91     端口号:8080   地址:河南驻马店
            proxy_support = urllib.request.ProxyHandler({"http": "125.46.64.91:8080"})
            opener = urllib.request.build_opener(proxy_support)
            opener.addheaders = [("User-Agent",
                                  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36")]
            urllib.request.install_opener(opener)

            req = urllib.request.Request(url,data)
            response = urllib.request.urlopen(req)
            html = response.read().decode("utf-8")

            target=json.loads(html)
            print("翻译的结果为:%s" %(target["translateResult"][0][0]["tgt"]))

if __name__=="__main__":
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/855693
推荐阅读
相关标签
  

闽ICP备14008679号