爬取 蓝桥云课 页面的课程名字和课程链接。爬取内容如下图所示:
我们先要打开开发者工具来定位代码,理清我们需要的数据与标签之间的关系。
每一个class为col-3
的div
标签就是一个课程的信息和链接。
比如,我们定位 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-link
的 a
标签所包裹,所以用 find_all()
搜索 div
标签中所有属性名为 course-link
的 a
标签。
a = div.find_all('a', 'course-link') # 搜索所有属性名为 course-link 的 a 标签
print(a)
运行上面结果,我们可以清楚地看到,课程地址在 a
标签中的 href
里,而课程名字在 属性名为 title
的 div
标签里。我们把课程链接存入 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 库最基本的应用和练习。接下来同学们可以根据自己的情况结合官方文档,进一步去学习。
标签:www,cn,标签,爬虫,云课,蓝桥,courses,https,lanqiao From: https://www.cnblogs.com/zhangxuegold/p/17572874.html