python实现单词的简单爬取

因为不需要登录之类的操作,可以说,这是对爬虫初学者来说最简单最基础的一个案例了,由于之后要用到这里就简单学习记录一下。

确定URL

爬取目标:金山词霸的四六级词汇

http://word.iciba.com/

我们可以很容易看到四个选项,六级就不列出来了。
在这里插入图片描述

  1. http://word.iciba.com/?action=courses&classid=11
  2. http://word.iciba.com/?action=courses&classid=122
  3. http://word.iciba.com/?action=courses&classid=12
  4. http://word.iciba.com/?action=courses&classid=123

网址很容易拿到,且规律这么明显,所以说很容易。

我们每次爬取单词的时候仅需对这四个词库随机选取即可。

我们选择四级必备词汇词库第一课点进去之后我们发现后面的url会加上一个参数,参数值为课的节数。这样我们根据这个规律来完成拼接一种词库界面的一节课的url。我们根据class以及其course的最大值来随机构造url。
在这里插入图片描述

choice = random.choice([(11, 226), (12, 105), (122, 35), (123, 25)])
url = "http://word.iciba.com/?action=words&class=" + str(choice[0]) + "&course=" + str(random.randint(1, choice[1]))

找到单词标签位置

我们找到单词所在的标签,确定每个单词所在的标签
在这里插入图片描述

这里我们可以只用xpath来获取,可以使用xpath helper插件(chrome)。我们右击元素选择copy ,copy xpath,这样我们就获取了这个元素的xpath位置

//*[@id=“word_list_1”]/li[2]/div[1]

我们可以通过改变标签的下标来改变不同的单词。获取里面的文字后面需要加上text()
在这里插入图片描述

这里我们就获得了第一个单词

在这里插入图片描述

如果我们把xpath里面的下标去掉会发生什么呢

div下标去掉
在这里插入图片描述

li下标也去掉

显示有二十个结果,那肯定是是个单词和释义啦!
在这里插入图片描述

但是我们发现,每一课其实是有分页的,即两个list,上面语法只能获得10个单词,我们需要改变一下语法才行。
在这里插入图片描述

我们发现两组单词都有一个共同的class word_main_list 我们从这里入手,最终得到获得所有单词的xpath语法,这里需要一点xpath语法基础。

获取英语单词

//*[@class=“word_main_list”]/li/div[@class=“word_main_list_w”]/span//text()

获取单词释义

//*[@class=“word_main_list”]/li/div[@class=“word_main_list_s”]/span//text()

爬取加处理

接下来的任务就很简单了,直接给出代码

from lxml import etree
import requests
import random

words = []
meaning = []
choice = random.choice([(11, 226), (12, 105), (122, 35), (123, 25)])
url = "http://word.iciba.com/?action=words&class=" + str(choice[0]) + "&course=" + str(
    random.randint(1, choice[1]))
r = requests.get(url)
r.encoding = r.apparent_encoding
if r.status_code == 200:
    text = r.text
    doc = etree.HTML(text)
    words = doc.xpath('//*[@class="word_main_list"]/li/div[@class="word_main_list_w"]/span//text()')
    meaning = doc.xpath('//*[@class="word_main_list"]/li/div[@class="word_main_list_s"]/span//text()')
    li = []
    for i in range(len(words)):
        dic = {'words': words[i], 'meaning': meaning[i]}
        li.append(dic)
    print(li)
posted @ 2021-03-06 20:11  沃特艾文儿  阅读(116)  评论(0)    收藏  举报  来源