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

66 篇文章 1 订阅
60 篇文章 3 订阅

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


1.分析目标网站

四级必备词汇词汇_四级必备词汇单词表_四级必备词汇在线背单词_四级必备词汇免费背单词课程_爱词吧_金山词霸旗下背单词网站爱词霸吧背单词为您提供:四级必备词汇免费背单词课程,四级必备词汇词汇表,四级必备词汇单词表,四级必备词汇词汇下载。在这里,您可以轻轻松松高效的背单词,轻松了解各种单词记忆法,快速的记忆英语词汇。[这里是图片002]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没问题

<Response [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)

结果如下,这里仅展示两个单词的数据

<Response [200]>
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()
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值