爬虫 | 解析蓝桥云课课程数据

爬取 蓝桥云课 页面的课程名字和课程链接。爬取内容如下图所示:

我们先要打开开发者工具来定位代码,理清我们需要的数据与标签之间的关系。

每一个class为col-3div标签就是一个课程的信息和链接。

比如,我们定位 Python 新手入门课程,如下图所示:

观察代码后,我们可以知道,课程地址都在 class 名为 course-link 的 a 标签里,而课程名字在 a 标签的子标签里。 a 标签里有三层 div 标签,我们可以通过 class = "course-cover relative" 来获取包含课程名称的 a 标签,然后在去获得 img 标签中 alt 的数据。

获取蓝桥云课课程页面,是使用 requests.get() 来获取的。使用方法如果忘记了,请看上面的例子,这里就不再赘述。下面代码写在 try...except 中的目的是为了保证未能成功抓取数据时,不会报错。

import requests

try:
    url = "https://www.lanqiao.cn/courses/"
    r = requests.get(url)

    # 查看状态码是否正确
    print(r.raise_for_status)
    # <bound method Response.raise_for_status of <Response [200]>>

    r.encoding = r.apparent_encoding  # 转换成 utf-8 的编码形式
    demo = r.text  # 获取页面内容并赋值给定义变量 demo
    # print(demo)
except:
    print("未能获取页面内容")
from bs4 import BeautifulSoup
soup = BeautifulSoup(demo, 'html.parser')
# print(soup)
# html界面

由于该页面中,我们需要的数据是被一层一层的 div 标签包裹,我们需要由外向里层层剥开这些标签,最终定位到所需的数据。首先,我们用 find() 来搜索 body 标签里的 div 标签

div = soup.find('body').div  # 搜索 body 中的 div 标签,然后赋值给定义变量 div
print(div)

我们所需的数据是属性名为 course-linka 标签所包裹,所以用 find_all() 搜索 div标签中所有属性名为 course-linka 标签。

a = div.find_all('a', 'course-link')  # 搜索所有属性名为 course-link 的 a 标签
print(a)

运行上面结果,我们可以清楚地看到,课程地址在 a 标签中的 href 里,而课程名字在 属性名为 titlediv 标签里。我们把课程链接存入 href_list 列表中,把课程名称存入 names 列表中。

href_list = []  # 用来存储课程链接的列表
names = []  # 用来存储课程名字的列表

for i in a:  # 遍历 a 标签
    href_list.append("https://www.lanqiao.cn" +
                     i.get('href'))  # 把课程地址存入 href_list 列表里
    # 把属性名为 title 的 div 标签中的文本内容存入 names 列表里
    names.append(i.find('div', 'title').text.strip())

print(href_list)
print(names)

运行结果:

['https://www.lanqiao.cn/courses/63', 'https://www.lanqiao.cn/courses/1', 'https://www.lanqiao.cn/courses/3584', 'https://www.lanqiao.cn/courses/2752', 'https://www.lanqiao.cn/courses/1283', 'https://www.lanqiao.cn/courses/1127', 'https://www.lanqiao.cn/courses/1330', 'https://www.lanqiao.cn/courses/1341', 'https://www.lanqiao.cn/courses/3483', 'https://www.lanqiao.cn/courses/5349', 'https://www.lanqiao.cn/courses/4012', 'https://www.lanqiao.cn/courses/4848', 'https://www.lanqiao.cn/courses/1354', 'https://www.lanqiao.cn/courses/606', 'https://www.lanqiao.cn/courses/1238', 'https://www.lanqiao.cn/courses/1292']
['新手入门指南之玩转蓝桥云课', 'Linux 基础入门', 'oeasy 教您玩转 python', 'C++ 基础入门实战', '机器学习开放基础课程', 'Django 基础入门', 'Python 新手入门课', 'C++ 从零实现 NoSQL 数据库', 'Effective Java 中文版(第 3 版)', '玩转 Node.js 开发', 'Django 框架基础', '微信公众号开发入门', '知识图谱构建射雕三部曲人物关系', 'Ansible 基础入门', 'JavaScript 基础入门', 'Python 异步网络编程实战']

我们定义一个名为 info_dict 的字典,把课程名字作为字典的 Key,把课程的链接作为课程的 Value

info_dict = {}  # 保存数据的字典

for i in range(len(names)):  # 遍历 names 列表的下标值
    # 把课程名字作为字典的 Key,把课程的链接作为课程的 Value,并保存到 info 字典里
    info_dict[names[i]] = href_list[i]

print(info_dict)

运行结果:

{'新手入门指南之玩转蓝桥云课': 'https://www.lanqiao.cn/courses/63', 'Linux 基础入门': 'https://www.lanqiao.cn/courses/1', 'oeasy 教您玩转 python': 'https://www.lanqiao.cn/courses/3584', 'C++ 基础入门实战': 'https://www.lanqiao.cn/courses/2752', '机器学习开放基础课程': 'https://www.lanqiao.cn/courses/1283', 'Django 基础入门': 'https://www.lanqiao.cn/courses/1127', 'Python 新手入门课': 'https://www.lanqiao.cn/courses/1330', 'C++ 从零实现 NoSQL 数据库': 'https://www.lanqiao.cn/courses/1341', 'Effective Java 中文版(第 3 版)': 'https://www.lanqiao.cn/courses/3483', '玩转 Node.js 开发': 'https://www.lanqiao.cn/courses/5349', 'Django 框架基础': 'https://www.lanqiao.cn/courses/4012', '微信公众号开发入门': 'https://www.lanqiao.cn/courses/4848', '知识图谱构建射雕三部曲人物关系': 'https://www.lanqiao.cn/courses/1354', 'Ansible 基础入门': 'https://www.lanqiao.cn/courses/606', 'JavaScript 基础入门': 'https://www.lanqiao.cn/courses/1238', 'Python 异步网络编程实战': 'https://www.lanqiao.cn/courses/1292'}

当然,我们也可以用 zip 函数更方便的实现效果。

info_dict = dict(zip(names, href_list))
info_dict

实验总结

本课程通过爬取学校排名和蓝桥云课课程链接这两个例子来学习了 Beautiful Soup 库的基本知识,包括标签基本元素、Beautiful Soup 库解析器、遍历文档树、搜索文档树等知识。学到这里我们已经可以用 Beautiful Soup 库来实现一个小爬虫了。不过本实验只完成了 Beautiful Soup 库最基本的应用和练习。接下来同学们可以根据自己的情况结合官方文档,进一步去学习。

posted @   张Zong在修行  阅读(134)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示