你能把我带走吗?python:走吧


最近学习了点python爬虫的知识,今天给大家分享一个超级简单的案例,爬取四级词汇5000多个,包括单词,意思,音标和读音地址,很有意思,哈哈,话不多说,让我们开始吧 !


1.分析目标网站

四级必备词汇词汇_四级必备词汇单词表_四级必备词汇在线背单词_四级必备词汇免费背单词课程_爱词吧_金山词霸旗下背单词网站爱词霸吧背单词为您提供:四级必备词汇免费背单词课程,四级必备词汇词汇表,四级必备词汇单词表,四级必备词汇词汇下载。在这里,您可以轻轻松松高效的背单词,轻松了解各种单词记忆法,快速的记忆英语词汇。https://word.iciba.com/?action=courses&classid=11

首页一共有226课,每一个有20个单词

你能把我带走吗?python:走吧_第1张图片

 每一课有两页,一页有十个单词

你能把我带走吗?python:走吧_第2张图片

点击第一课时,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

你能把我带走吗?python:走吧_第3张图片

 那就直接写代码了

你能把我带走吗?python:走吧_第4张图片

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. 查看单词在网页的结构

你能把我带走吗?python:走吧_第5张图片

 7. 使用xpath解析HTML

from lxml import etree
# 解析HTML
tree = etree.HTML(resp.text)

你能把我带走吗?python:走吧_第6张图片

 我们发现两页其实就是第一个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文件,看看自己的成果吧! 

你能把我带走吗?python:走吧_第7张图片

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()

你可能感兴趣的