用爬虫做字典(网络搜索作业):selenium+xlrd

1. 实验简介

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

2. 实验过程

首先理清整个流程:


词典流程图

初步将此功能分为三个函数实现:从单词文件中提取单词的函数、遍历单词并储存查询结果的函数、查询一个单词并返回查询数据的函数。
从文件提取单词的功能采用xlrd库函数完成。

查询单词返回数据的函数用selenium方法如下:

  1. 使用Chrome浏览器模拟,打开网站:https://www.iciba.com/
  2. 找到查询框元素,向其中输入要查的单词
  3. 模拟回车按键,进入查询结果页面
  4. 分别找到单词、读音、释义的元素,提取其文本
    在这里插入图片描述

初步按照此三个函数进行编写时,出现了问题,我一一进行优化:

  1. 以上方法编写,每查一个单词都需打开、关闭一次浏览器,非常耗时,于是将遍历单词功能和单词查询都放到一个函数中,只需打开一次浏览器,不停地进行查询即可;
  2. 如果不清空输入框,下一个单词查询时会接在上一个单词后面,查出错词,所以在每次循环前要清空输入框;
  3. 当查词网站查不到搜索的词时,就找不到对应的记录读音、释义的元素,为了防止程序运行时因为个别词语报错,所以在寻找读音释义元素处添加了异常处理;
  4. 当导入的单词表单词数量过多时,运行一次程序需要的时间很长,为了防止长时间运行出现错误,建议在主函数中间查询单词表切分成小部分,进行查询,写入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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值