最近学习了点python爬虫的知识,今天给大家分享一个超级简单的案例,爬取四级词汇5000多个,包括单词,意思,音标和读音地址,很有意思,哈哈,话不多说,让我们开始吧 !
1.分析目标网站
四级必备词汇词汇_四级必备词汇单词表_四级必备词汇在线背单词_四级必备词汇免费背单词课程_爱词吧_金山词霸旗下背单词网站爱词霸吧背单词为您提供:四级必备词汇免费背单词课程,四级必备词汇词汇表,四级必备词汇单词表,四级必备词汇词汇下载。在这里,您可以轻轻松松高效的背单词,轻松了解各种单词记忆法,快速的记忆英语词汇。https://word.iciba.com/?action=courses&classid=11
首页一共有226课,每一个有20个单词
每一课有两页,一页有十个单词
点击第一课时,url会跳到
https://word.iciba.com/?action=words&class=11&course=1
点击第二课时,url会跳到
https://word.iciba.com/?action=words&class=11&course=2
点击第三课时,url会跳到
https://word.iciba.com/?action=words&class=11&course=3
以此类推,可以观察出,url中的course参数就是决定了当前是第几课
2.获取第一课单词首先应该先确定要抓取的单词是否在网页的源代码中,如果在就简单了,注意,这里要点击查看网页源代码,而不是使用检查,因为检查的代码,可能使用了异步请求等技术,二次渲染了页面,所以这里有个坑,注意查看网页源代码
然后 Ctrl + F 搜索单词 comment ,发现网页中有,nice
那就直接写代码了
1. 导入requests库
import requests
2. 模拟headers,防止网站反爬
# 模拟请求头,防止反爬
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"
}
3. 编写请求地址
url = "https://word.iciba.com/?action=words&class=11&course=1"
4. 使用requests库发起get请求,获取网页内容
resp = requests.get(url=url, headers=headers)
print(resp)
5. 查看响应,200没问题
6. 查看单词在网页的结构
7. 使用xpath解析HTML
from lxml import etree
# 解析HTML
tree = etree.HTML(resp.text)
我们发现两页其实就是第一个ul里装了10个单词,第二个ul里装了10个单词,这时可以使用循环替换ul[1],ul[2]来循环获取这两页的20个单词,代码如下:
# 解析HTML
tree = etree.HTML(resp.text)
# 因为有两页,循环大法
for i in range(1, 3):
lis1 = tree.xpath(f"/html/body/div[2]/div[1]/form/div[1]/ul[{i}]/li")
for j in lis1:
# 解析单词
word = j.xpath("./div[1]/span/text()")[0].strip()
# 解析音标
pronunciation = j.xpath("./div[2]/a/@id")[0].strip()
# 解析意思
symbols = j.xpath("./div[2]/strong/text()")[0].strip()
# 解析链接
mean = j.xpath("./div[3]/span/text()")[0].strip()
print(word)
print(pronunciation)
print(symbols)
print(mean)
结果如下,这里仅展示两个单词的数据
comment
https://res.iciba.com/resource/amp3/oxford/0/f4/ca/f4ca8f1ef7bd221775ba33cef5db6fb7.mp3
[ˈkɔment]
n. 评论,意见;体现,写照
plate
https://res.iciba.com/resource/amp3/oxford/0/5a/21/5a21852c383fc3c36cfba1f4e9f23dd3.mp3
[pleit]
vt. 电镀 n. 盘子,盆子; 金属...
3.使用循环获取所有课的单词
前面已经分析了,不同课的区别就是 course 参数在变化,这时候我们也实现了对其中一课单词的获取,所以现在只需要使用循环,动态设置i请求url模拟第几课的切换,然后发起请求,获取单词,就是上面写的内容了
import requests
from lxml import etree
# 写爬虫得把网站结构摸透了,思路清晰
# 模拟请求头,防止反爬
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"
}
# 循环网站的227课,每一个有两页,每一页有10个单词,共计4509个单词
for k in range(1, 227):
print(f'{k - 1}页下载完成// {k - 1}/225')
# 处理url,循环大法对每一课进行请求
url = f"https://word.iciba.com/?action=words&class=11&course={k}"
resp = requests.get(url=url, headers=headers)
# 解析HTML
tree = etree.HTML(resp.text)
# 因为有两页,循环大法
for i in range(1, 3):
lis1 = tree.xpath(f"/html/body/div[2]/div[1]/form/div[1]/ul[{i}]/li")
for j in lis1:
# 解析单词
word = j.xpath("./div[1]/span/text()")[0].strip()
# 解析音标
pronunciation = j.xpath("./div[2]/a/@id")[0].strip()
# 解析意思
symbols = j.xpath("./div[2]/strong/text()")[0].strip()
# 解析链接
mean = j.xpath("./div[3]/span/text()")[0].strip()
# 组装一行的内容,包括单词,音标,意思,读音链接
line = [word, symbols, mean, pronunciation]
print(line)
4.数据持久化,csv模块
数据持久化,这里使用csv模块
1.导入csv模块
import csv
2.文件写入
这里意思是打开文件word.csv,‘a’意思是追加写入,编码为utf-8,然后使用csv.wirter(f)获取到输出对象,输出对象向文件中写一行
with open('word.csv', 'a', encoding="utf-8") as f:
# 获取输出对象
writer = csv.writer(f)
# 使用输出对象向csv文件写入一行
writer.writerow(line)
5.关流,好习惯
最后,关闭文件流和资源流,好习惯!
# 关闭链接
resp.close()
# 关流
f.close()
6.查看结果
打开csv文件,看看自己的成果吧!
7.完整代码import requests
from lxml import etree
import csv
# 写爬虫得把网站结构摸透了,思路清晰
# 模拟请求头,防止反爬
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"
}
# 循环网站的227课,每一个有两页,每一页有10个单词,共计4509个单词
for k in range(1, 227):
print(f'{k - 1}页下载完成// {k - 1}/225')
# 处理url,循环大法对每一课进行请求
url = f"https://word.iciba.com/?action=words&class=11&course={k}"
resp = requests.get(url=url, headers=headers)
# 解析HTML
tree = etree.HTML(resp.text)
# 因为有两页,循环大法
for i in range(1, 3):
lis1 = tree.xpath(f"/html/body/div[2]/div[1]/form/div[1]/ul[{i}]/li")
for j in lis1:
# 解析单词
word = j.xpath("./div[1]/span/text()")[0].strip()
# 解析音标
pronunciation = j.xpath("./div[2]/a/@id")[0].strip()
# 解析意思
symbols = j.xpath("./div[2]/strong/text()")[0].strip()
# 解析链接
mean = j.xpath("./div[3]/span/text()")[0].strip()
# 组装一行的内容,包括单词,音标,意思,读音链接
line = [word, symbols, mean, pronunciation]
print(line)
# csv 写入文件
with open('word.csv', 'a', encoding="utf-8") as f:
# 获取输出对象
writer = csv.writer(f)
# 使用输出对象向csv文件写入一行
writer.writerow(line)
# 关闭链接
resp.close()
# 关流
f.close()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)