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的时候,显示不出结果来,还会不断改进优化的,冲~~