引言
大学英语六级几乎是每个大学生必过的考试,不管是读研还是找工作,很多都有这方面的要求,而六级词汇是其中重要的一环。今天给大家带来一个案例,用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,你学会了吗?
欢迎关注微信公众号“爬取你的深度神经网络”获取源代码和更多精彩文章。