GoldenDict中添加MOJI辞書「已修改」

没啥基础,随便搞着玩的,期待大佬指导

最近学日语,就接触到了神器GoldenDict,英语词典已经很全面了,但是日语词典的资源不是很多,网上推荐的主要是离线版MOJI和大辞泉;一个是不更新了,一个是日日辞典,新手不友好。就想着怎么把网页版MOJI搞进去。但问题是网页版MOJI和有道、Bing词典不太一样,MOJI的词条页面被重新编码了,不能用表达式直接跳转。

环境配置

运行需要安装Selenium库,以及与浏览器相匹配的Driver;具体可以参考:

https://blog.csdn.net/weixin_36279318/article/details/79475388

Selenium安装:

pip install Selenium

对应ChromeDriver的安装:

https://sites.google.com/a/chromium.org/chromedriver/home

GoldenDict命令

类型为纯文本

python D:\GoldenDict\Dict\MOJI\moji.py %GDWORD%		#注意将.py所在目录修改为自己的

代码

import time
from sys import argv
from selenium import webdriver

path = 'D:\SomeLib\SeleniumLib\chromedriver.exe' # 改为自己的Chromedriver.exe所在目录

option = webdriver.ChromeOptions()
option.add_argument("headless")
option.add_argument('disable-gpu')
driver = webdriver.Chrome(path, options=option)

driver.get('https://www.mojidict.com/search')
'''
调用selenium库中的find_element_by_xpath()方法定位搜索框,
同时使用send_keys()方法在其中输入信息
'''
driver.find_element_by_xpath('//*[@id="searchbar"]').send_keys(argv[1])
# driver.find_element_by_xpath('//*[@id="searchbar"]').send_keys('花')
'''
调用selenium库中的find_element_by_xpath()方法定位搜索按钮,
同时使用click()方法对按钮进行点击
'''
time.sleep(0.3)
driver.find_element_by_xpath('//*[@id="__layout"]/div/div[2]/div[2]/div/div/div[2]/div/div/div[1]').click()
time.sleep(0.1)
text_a = driver.find_element_by_xpath('/html/body/div[3]/div/div[2]').text
list_t = driver.find_elements_by_class_name('subdetail-container')
k = 0
m = 1
text_ex = text_a.split('\n')
for i in range(len(text_ex)):
    if text_ex[i] == list_t[k].text:
        print(str(k + 1) + '. ' + list_t[k].text)
        k = k + 1
        m = 1
        if k == len(list_t):
           k = k - 1
    else:
        if i > 3:
            if m % 2:
                print('    (' + str(int(m/2)+1) + ')' + text_ex[i])
            else:
                print('       ' + text_ex[i])
            m = m + 1
        else:
            print(text_ex[i])

第三条

效果示例

本来是堆积在一起的,大致排版了一下,看起来不那么乱,但不知道怎么能像别人集成的字典一样, 有颜色、字号。
本来是堆在一起的,大致排了一下版

问题

最主要的问题延迟极大、延迟极大、延迟极大,快被搞哭了,感觉最主要的问题就是网页加载的时候加载很多没必要的东西进来,浪费很多时间,平均单次的查询时间达到了近7秒。。。
在这里插入图片描述
真的是无奈了,真的太小白了,希望大佬可以给点指导,怎么才能更快的爬到数据,目前的话也在尝试使用requests之类的爬,据说可以快很多,如果要是以后搞出来了的话,一定及时更新上来,冲冲冲、兄弟萌。
在这里插入图片描述

———————————朴实无华的分割线———————————

Requests版本(新版本)

又折腾了一天,搞了个requests的出来。。相比起Selenium版本的,Requests简直像开了挂一样,平均单个查询响应速度缩短到了3秒,爱了爱了。
在这里插入图片描述

废话不多说,直接进正题:

环境配置

相较于Selenium稍微复杂一点,需要的库主要有Requests和bs4,库中具体的函数可以自己去学习,我也不太会就不多讲了。

https://blog.csdn.net/weixin_43037607/article/details/92703849

安装代码(直接CMD控制台安装就好啦)

pip install requests
pip install bs4
pip install fake_useragent

注:这里还用了一个小库fake_useragent,目的主要是针对一些具有反爬功能的网站生成一个header用于request的访问,header不了解的话可以去看request的教程,很好懂的。
不过后来发现,MOJI辞书的官网目前好像并没有反扒功能hhhhhh,所以是我多此一举了。

代码部分

Goldendicti里面的命令不需要改,改改.py就行了哈。

import requests
import sys
from fake_useragent import UserAgent
from bs4 import BeautifulSoup

ua = UserAgent()
headers = {'User-Agent': ua.random}
url = 'https://api.mojidict.com/parse/functions/search_v3'
data = {"langEnv": "zh-CN_ja",
        "needWords": "true",
        "searchText": sys.argv[1],
        # "searchText": "花",
        "_ApplicationId": "自己的ID",
        "_ClientVersion": "自己的号码",
        "_InstallationId": "自己的ID",
        "_SessionToken": "自己的号码"}

response = requests.post(url=url, data=data, headers=headers)

ttt = response.text
text_ex = ttt.split(',')
url = "https://www.mojidict.com/details/" + text_ex[3][9:len(text_ex[3])-1]
soup = BeautifulSoup(requests.get(url).text, 'html.parser')

print('\n'.join(soup.find(class_='spell jp-font').text.split()))
print(' '.join(soup.find(class_='pron jp-font').text.split()))
allinfo = ' '.join(soup.find(class_='inner-box').text.split())
title_t = soup.find_all(class_='subdetail-container')
k = 0
m = 1
title = ""
allinfo = allinfo.split(' ')
for i in title_t:
    title = title + '\n'.join(i.text.split()) + ' '
title = title.split(' ')
for i in range(len(allinfo)):
    if allinfo[i] == "选择其它文件夹":
        continue
    if allinfo[i] == title[k]:
        print(str(k + 1) + '. ' + title[k])
        k = k + 1
        m = 1
    else:
        if i > 2:
            if m % 2:
                print('    (' + str(int(m/2)+1) + ')' + allinfo[i])
            else:
                print('       ' + allinfo[i])
            m = m + 1
        else:
            print(allinfo[i])

其中data段做一点说明,根据个人账号的不同,好像有点差别,大家可以自行查询自己的替换进去,

查找方法:
(1)打开moji辞书网页并按F12打开开发者模式
在这里插入图片描述
(2)选择标签栏中的Network栏
在这里插入图片描述
(3)在网页查询栏中随便查点什么,右侧会相应的更新出几个新的条目,点开它
在这里插入图片描述

翻找到最下面一栏中的Requests Payload中,就可以看到自己的信息啦,Copy-Paste OK!

然后好像也没啥要说的了吧

可以自行体验一下速度的变化,已经和百度翻译接近了呢。
在这里插入图片描述
不过总的来说,会有出bug的时候,显示不出结果来,还会不断改进优化的,冲~~
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值