Python有道英译汉词典

选择有道翻译是因为相对好爬。

方案一

在词典网页中直接抓取词义。
参考资料: https://www.cnblogs.com/nkqlhqc/p/7627581.html
特点:比较简单易行,不需要涉及与网页的交互。
程序:

# 有道词典  英译汉
# 参考资料: https://www.cnblogs.com/nkqlhqc/p/7627581.html
# 关于re.compile(): https://www.cnblogs.com/nomorewzx/p/4203829.html
import requests     # 抓取网页的第三方库
import re           # 正则表达式的库

print("来自有道词典,请输入需要查询的英语单词\n")
while (True):
    word = input(">>")
    url = "http://dict.youdao.com/w/"+word+"/#keyfrom=dict2.top"
    html = requests.get(url).content.decode('utf-8')       # 访问网址

    try:
        partlist = re.findall('class="trans-container"(.*?)class="additional"', html, re.S)     # 初步筛选
    except:
        print("没找到\n")
    else:
        reg1 = '<li>(.*?)</li>'    # 模糊匹配,找<li>与</li>中间的部分 
        reg2 = re.compile(reg1)    # 使得匹配更加高效
        try:
            wordlist = re.findall(reg2, str(partlist[0]))   # 那串列表中的第一页是有效的
        except:
            print("没找到\n")
        else:
            for x in wordlist:
                print("   "+x)
            print("\n")

结果图:

8846565-302f460b9e6b1473.png

程序1的结果图

另一个程序:
用了爱词霸网。

# 爱词霸词典  英译汉
# 参考资料: https://www.cnblogs.com/nkqlhqc/p/7627581.html
# 关于re.compile(): https://www.cnblogs.com/nomorewzx/p/4203829.html
import requests     # 抓取网页的第三方库
import re           # 正则表达式的库

print("来自有道词典,请输入需要查询的英语单词\n")
while (True):
    word = input(">>")
    url = "http://www.iciba.com/"+word
    html = requests.get(url).content.decode('utf-8')       # 访问网址

    try:
        partlist = re.findall('<ul class="base-list switch_part" class="">(.*?)</ul>', html, re.S)      # 初步筛选
    except:
        print("没找到\n")
    else:
        reg1 = '<span>(.*?)</span>'    # 模糊匹配,找<li>与</li>中间的部分 
        reg2 = re.compile(reg1)    # 使得匹配更加高效
        try:
            wordlist = re.findall(reg2, str(partlist))
        except:
            print("没找到\n")
        else:
            for x in wordlist:
                print("   "+x)
            print("\n")

结果图:

8846565-64f33cf1cf1e2ad1.png

程序2的结果图

PS:程序中缩进太多,不好,python应多使用子函数。

方案二

使用POST向网页发送请求,避开反爬虫使用老版接口,即去掉url中的“_o”。
参考资料:
https://www.cnblogs.com/90zeng/p/python_translation.html(关于在哪里看POST的格式的)
http://blog.csdn.net/nunchakushuang/article/details/75294947(关于反爬虫)
http://blog.csdn.net/snszwh/article/details/78168660(关于老版接口)
特点:使用了POST进行网页交互,但放弃了反爬虫处理。
程序:

# 有道字典  英译汉
# 参考资料1: https://www.cnblogs.com/90zeng/p/python_translation.html
# 参考资料2:http://blog.csdn.net/nunchakushuang/article/details/75294947
# 参考资料3:http://blog.csdn.net/snszwh/article/details/78168660
import urllib.request
import urllib.parse
import json
import time
import random
import hashlib
import re

def get_html(word):
    url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"  # 重点是去掉这里的_o

    data = {}

    data['i'] = word
    data['from'] = 'AUTO'
    data['to'] = 'AUTO'
    data['smartresult'] = 'dict'
    data['client'] = 'fanyideskweb'
    data['salt'] = '1519801903001'
    data['sign'] = 'ea1617dd1a4772cd6f47b45bab7c2a0f'
    data['doctype'] = 'json'
    data['version'] = '2.1'
    data['keyfrom'] = 'fanyi.web'
    data['action'] = 'FY_BY_CLICKBUTTION'
    data['typoResult'] = 'false'
    data = urllib.parse.urlencode(data).encode('utf-8')

    request = urllib.request.Request(url=url, data=data, method='POST')
    response = urllib.request.urlopen(request)
    result_str = response.read().decode('utf-8')
    return result_str

def main():
    word = input('>>')
    result_str = get_html(word)
    target = json.loads(result_str)
    trans = re.findall('tgt\': \'(.*?)\'', str(target))
    print("   "+ str(trans[0])+"\n")  

if __name__ == "__main__":  
    print("来源:有道词典\n输入需要查询的词\n\n")
    while(True):
        main()

结果图:

8846565-0a8289e601211724.png

程序3的结果图

方案三

这是涉及到反爬虫处理的一篇博客:http://blog.csdn.net/shadkit/article/details/79174948

猜你喜欢

转载自blog.csdn.net/m0_37946085/article/details/82923016
今日推荐