Python爬取新东方在线网站大学英语六级词汇

引言

大学英语六级几乎是每个大学生必过的考试,不管是读研还是找工作,很多都有这方面的要求,而六级词汇是其中重要的一环。今天给大家带来一个案例,用python爬取新东方在线网站的大学英语六级大纲词汇,并保存到本地,下面跟随我一起来实践吧。

分析页面

url链接:https://cet6.koolearn.com/20181225/825301.html,打开页面,如图所示:
在这里插入图片描述
我们需要2019年6月大学英语六级大纲词汇带音标:A—Z,由于每个字母开头的词汇位于不同的链接,因此需要先构建url列表,然后遍历获取词汇。我们打开两个链接,如图所示,有的字母只有一页单词,有的有多页,因此每个字母也需要获取完整的页面url列表,然后遍历抓取正文内容。
在这里插入图片描述
在这里插入图片描述
获取url列表用xpath较为方便,而获取正文内容我刚开始也尝试用xpath,但抓取到了很多空格和其他干扰字符,后尝试用正则表达式,精准的获得了目标内容。下面开始正式代码。

代码实现

1、首先导入可能要用到的模块,并定义main函数,采用面向对象编程,预先实例化一个类,并调用run方法,然后把目标内容写入文件。

from lxml import etree
import requests
import re
import time


if __name__ == '__main__':
    dc = WordSpider()
    word_lib = dc.run()
    file_name = 'CET—6 word.txt'
    with open(file_name, 'w', encoding='utf-8') as f:
        f.write(str(word_lib))

2、定义类,并初始化

class WordSpider(object):
    def __init__(self):
        self.url = 'https://cet6.koolearn.com/20181225/825301.html'
        self.headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36 Edg/89.0.774.50'
}

3、构建获取url列表的方法

    def get_url_list(self):
        """构建url列表"""
        response = requests.get(self.url, headers=self.headers)
        response.encoding = 'utf-8'
        content = response.text
        html = etree.HTML(content)
        url_lst = html.xpath('//div[@align="center"]/strong/a/@href')
        title_lst = html.xpath('//div[@align="center"]/strong/a/text()')
        url_dict = dict(zip(title_lst, url_lst))
        return url_dict

4、创建方法发送请求,获取url响应,并提取网页源代码

    def parse_url(self, url):
        """发送请求,获取响应"""
        response = requests.get(url, headers=self.headers)
        response.encoding = 'utf-8'
        return response.text

5、分别创建方法获取单个字母的多页url以及获取所有字母的完整url列表

    def get_surl_list(self, page_html):
        """获取单个字母的多页url"""
        html = etree.HTML(page_html)
        surl_list = html.xpath('//div[@id="page"]/a/@href')
        surl_list = surl_list[:-1]
        return surl_list

    def get_finurl_list(self, url_dict):
        """获取所有字母的完整url列表"""
        for k, v in url_dict.items():
            # print(v)
            page_html = self.parse_url(v)
            # print(word_html)
            isnext = '下一页'
            if isnext in page_html:
                url_dict[k] = self.get_surl_list(page_html)
            else:
                url_dict[k] = [v]
        return url_dict

6、创建方法分别获取单页的单词、多页的首页单词、多页的中间页单词、多页的末尾页单词。

    def get_word_single(self, word_html):
        """获取单页的单词"""
        pattern = '2019年6月大学英语六级大纲词汇带音标:A—Z.*?</strong>.*?</p><p>(.*?)<style type="text/css" _ue_org_tagname="style">'
        res = re.findall(pattern, word_html, re.S)
        patt2 = '\s+(.*?)</p><p>'
        word_list = re.findall(patt2, res[0], re.S)
        return word_list

    def get_word_1(self, word_html):
        """获取多页的首页单词"""
        pattern = '2019年6月大学英语六级大纲词汇带音标:A—Z.*?</strong>.*?</p><p>(.*?)<style type="text/css" _ue_org_tagname="style">'
        res = re.findall(pattern, word_html, re.S)
        patt2 = '\s+(.*?)</p>'
        word_list = re.findall(patt2, res[0], re.S)
        return word_list

    def get_word_mid(self, word_html):
        """获取多页的中间页单词"""
        pattern = '<div class="xqy_core_text">\s+<p>(.*?)<style type="text/css" _ue_org_tagname="style">'
        res = re.findall(pattern, word_html, re.S)
        patt2 = '\s+(.*?)</p>'
        word_list = re.findall(patt2, res[0], re.S)
        return word_list

    def get_word_last(self, word_html):
        """获取多页的末尾页单词"""
        pattern = '<div class="xqy_core_text">\s+<p>(.*?)<style type="text/css" _ue_org_tagname="style">'
        res = re.findall(pattern, word_html, re.S)
        patt2 = '\s+(.*?)</p><p>'
        word_list = re.findall(patt2, res[0], re.S)
        return word_list

7、创建run()方法实现主要业务逻辑

    def run(self):
        """实现主要业务逻辑"""
        url_dict = self.get_url_list()
        finurl_list = self.get_finurl_list(url_dict)
        # print(finurl_list)
        finword_dict = {}
        for tit, ur in finurl_list.items():
            sing_letter_list = []
            ur_num = len(ur)
            time.sleep(1)
            if ur_num == 1:
                word_html = self.parse_url(ur[0])
                word_list = self.get_word_single(word_html)
                sing_letter_list.extend(word_list)
            elif ur_num == 2:
                word_html_1 = self.parse_url(ur[0])
                word_list_1 = self.get_word_1(word_html_1)
                sing_letter_list.extend(word_list_1)
                word_html_2 = self.parse_url(ur[1])
                word_list_2 = self.get_word_last(word_html_2)
                sing_letter_list.extend(word_list_2)
            else:
                word_html_1 = self.parse_url(ur[0])
                word_list_1 = self.get_word_1(word_html_1)
                sing_letter_list.extend(word_list_1)
                for i in range(1, ur_num-1):
                    word_html_mid = self.parse_url(ur[i])
                    word_list_mid = self.get_word_mid(word_html_mid)
                    sing_letter_list.extend(word_list_mid)
                word_html_last = self.parse_url(ur[-1])
                word_list_last = self.get_word_last(word_html_last)
                sing_letter_list.extend(word_list_last)

            # print(sing_letter_list)
            finword_dict[tit] = sing_letter_list

        print(finword_dict)
        return finword_dict

8、大功告成,执行结果如图所示。
在这里插入图片描述
在这里插入图片描述
So,你学会了吗?
在这里插入图片描述
欢迎关注微信公众号“爬取你的深度神经网络”获取源代码和更多精彩文章。
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值