1. 实验简介
在网上下载了一个单词Excel文件,里面只有一列单词,没有读音没有释义,那我不妨用爬虫自动从金山词典(https://www.iciba.com/)查词并且把读音和释义都爬取下来。使用selenium模拟查词的动作,再将单词的读音释义放入dataframe中,最后都储存到一个Excel文件中。
2. 实验过程
首先理清整个流程:

词典流程图
初步将此功能分为三个函数实现:从单词文件中提取单词的函数、遍历单词并储存查询结果的函数、查询一个单词并返回查询数据的函数。
从文件提取单词的功能采用xlrd库函数完成。
查询单词返回数据的函数用selenium方法如下:
- 使用Chrome浏览器模拟,打开网站:https://www.iciba.com/
- 找到查询框元素,向其中输入要查的单词
- 模拟回车按键,进入查询结果页面
- 分别找到单词、读音、释义的元素,提取其文本
初步按照此三个函数进行编写时,出现了问题,我一一进行优化:
- 以上方法编写,每查一个单词都需打开、关闭一次浏览器,非常耗时,于是将遍历单词功能和单词查询都放到一个函数中,只需打开一次浏览器,不停地进行查询即可;
- 如果不清空输入框,下一个单词查询时会接在上一个单词后面,查出错词,所以在每次循环前要清空输入框;
- 当查词网站查不到搜索的词时,就找不到对应的记录读音、释义的元素,为了防止程序运行时因为个别词语报错,所以在寻找读音释义元素处添加了异常处理;
- 当导入的单词表单词数量过多时,运行一次程序需要的时间很长,为了防止长时间运行出现错误,建议在主函数中间查询单词表切分成小部分,进行查询,写入Excel文件时传入不同的startrow参数,就可以实现追加功能。
3. 实验结果
本次实验的单词表中有1162个单词,从金山词典中爬取了1162条相关的读音和释义数据:

单词表结果
左图为从网上下载的单词表,右图为爬取了读音和释义信息的单词表(结尾部分)
4. 源代码
import os
import pandas as pd
import xlrd
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
def check_word(wordlist):
"""
:param wordlist: 查询的词表
:return: worddf:dataframe, 带有注释和读音的单词表
"""
# 生成dataframe
worddf = pd.DataFrame(columns=['word', 'pronouncation', 'meanings'])
worddf.index = range(len(worddf))
row = 0 # 插入dataframe的行
driver = webdriver.Chrome()
driver.get('https://www.iciba.com/') # 打开欧路词典
current_window = driver.current_window_handle
print("current window:", current_window)
# 循环查询word
for keyword in wordlist:
input_search = driver.find_element_by_tag_name("input")
input_search.clear() # 要清除输入框的内容
input_search.send_keys(keyword) # 输入搜索词
time.sleep(1)
input_search.send_keys(Keys.ENTER) # 回车
time.sleep(1)
current_window = driver.current_window_handle
print("current window:", current_window)
word = {}
# 如果网站没有相应地词则弹出错误,程序继续
try:
word['word'] = driver.find_element_by_class_name("Mean_word__3SsvB").text
word['pronouncation'] = driver.find_element_by_class_name("Mean_symbols__5dQX7").text # 读音
word['meanings'] = driver.find_element_by_class_name("Mean_part__1RA2V").text # 释义
# 将查询数据写入dataframe当中
worddf.loc[row] = [word['word'], word['pronouncation'], word['meanings']]
row = row + 1
except Exception as error:
print(error)
return worddf
def get_wordlist(filepath):
"""
:param filepath: path of vocabulary file
:return: words:list of words
"""
workbook = xlrd.open_workbook(filepath)
sheet_1 = workbook.sheet_by_index(0)
row_num = sheet_1.nrows
words = []
iter = 3
while (iter < row_num):
words.append(sheet_1.cell_value(iter, 0))
iter = iter + 1
return words
if __name__ == '__main__':
filepath = os.path.dirname(os.path.abspath(__file__)) + r"\vocabulary.xls"
wordlist = get_wordlist(filepath)
df = check_word(wordlist)
filepath_checked = os.path.dirname(os.path.abspath(__file__)) + r"\vocabulary_checked.xls"
df.to_excel(filepath_checked)