一、引言
在当今数字化学习的时代,MOOC网作为一个知名的在线学习平台,提供了丰富多样的课程资源。本文将介绍如何通过 Python 编写代码,实现对MOOC网首页课程信息的抓取,并将相关信息存储到本地数据库中。这样的操作可以帮助我们更好地了解MOOC网的课程分布情况,也为后续的数据分析等工作提供了数据基础。
结果展示(文末附完整代码):
目录
二、准备工作
在开始编写代码之前,我们需要确保已经安装了以下几个必要的库:
requests
:用于发送 HTTP 请求,获取网页内容。pymysql
:用于连接和操作 MySQL 数据库。lxml
:用于解析 HTML 文档,方便我们从网页中提取所需的数据。
三、代码实现
(一)定义MuKe
类
首先,我们创建了一个名为MuKe
的类,这个类将包含所有与抓取MOOC网课程信息相关的方法和属性。
# -*- coding:utf-8 -*-
import requests
import pymysql
from lxml import etree
class MuKe(object):
def __init__(self):
# 慕课网的基础URL
self.base_url = "https://www.imooc.com/"
self.headers = {
}
self.cookies = {
}
self.db = pymysql.Connect(
host='127.0.0.1',
port=3306,
user='root',
password='921108',
db='fjj'
)
self.cursor = self.db.cursor()
在__init__
方法中,我们初始化了一些重要的属性,包括MOOC网的基础 URL、请求头信息、Cookies 信息,以及与本地 MySQL 数据库的连接对象和游标对象。这里假设本地已经安装并启动了 MySQL 数据库,并且创建了名为fjj
的数据库,同时设置了相应的用户名和密码。
(二)获取MOOC网首页内容
def get_homepage_content(self):
"""获取慕课网首页内容"""
response = requests.get(self.base_url, headers=self.headers, cookies=self.cookies)
return response.text
这个方法通过requests
库发送 GET 请求到MOOC网首页,携带设置好的请求头和 Cookies 信息,然后返回获取到的网页文本内容。
(三)解析MOOC网首页
def parse_homepage(self, resp):
"""解析慕课网首页,获取课程分类、标题和链接等信息"""
html = etree.HTML(resp)
data_list = html.xpath('//*[@id="main"]/div[2]/div[1]/div')
Data = data_list[0:7]
for data in Data:
type_ = data.xpath('./div[1]/h2/text()')[0]
title_list = data.xpath('./div[1]/div/p/a')
for data_ in title_list:
title = data_.xpath('./text()')[0]
href = data_.xpath('./@href')
if href[0][:2] == '//':
href = 'https:' + str(href[0])
else:
href = 'https:/' + str(href[0])
self.parse_course_list(type_,title,href)
在parse_homepage
方法中,我们首先使用lxml
库的etree.HTML
方法将获取到的网页文本内容解析成 HTML 对象。然后通过 XPath 表达式从解析后的 HTML 中提取出课程分类、标题和链接等信息。对于提取到的每个课程链接,我们进一步调用parse_course_list
方法来处理该课程的详细信息。
(四)解析课程列表
def parse_course_list(self, type_, title, href):
print(href)
try:
resp = requests.get(href, headers=self.headers, cookies=self.cookies).text
html = etree.HTML(resp)
data_list = html.xpath('/html/body/div[@class="main"]/div[1]/ul/li')
for data in data_list:
course = data.xpath('./a/p[1]/text()')[0].strip()
person = data.xpath('./a/p[2]/span/text()')[0].strip()
price = data.xpath('./a/p[3]/span/text()')[0]
src = 'https://coding.imooc.com/' + data.xpath('./a/@href')[0]
# print(type_, title, course, person, price, src)
self.detail_parse(type_, title, course, person, price, src)
except:
print('暂无课程,或出错了。')
pass
在parse_course_list
方法中,我们针对每个课程链接再次发送 GET 请求获取课程列表页面的内容,并进行解析。从中提取出课程名称、授课教师、价格以及课程详情页的链接等信息,然后将这些信息传递给save_to_db
方法进行进一步处理。
(五)存储到数据库
def save_to_db(self,type_, title, course, person, price, status,time_all,src):
sql = "insert into 慕课网 (type_, title, course, person, price, status,time_all,src) values (%s,%s,%s,%s,%s,%s,%s,%s)"
params = [(type_, title, course, person, price, status,time_all,src)]
self.cursor.executemany(sql, params)
self.db.commit()
save_to_db
方法负责将提取到的课程信息按照指定的格式插入到本地 MySQL 数据库的慕课网
表中。这里假设已经在数据库中创建了名为慕课网
的表,并且表结构与插入的数据格式相匹配。
(六)主运行函数
def Run(self):
"""主运行函数,协调各个功能函数完成抓取和存储任务"""
try:
resp = self.get_homepage_content()
self.parse_homepage(resp)
except Exception as e:
print(f"运行过程中出现错误: {e}")
Run
方法作为主运行函数,首先调用get_homepage_content
方法获取MOOC网首页内容,然后将其传递给parse_homepage
方法进行解析,从而启动整个抓取和存储课程信息的流程。如果在运行过程中出现任何错误,将会打印出错误信息。
四、运行代码
在代码的末尾,我们通过以下方式来运行整个程序:
if __name__ == '__main__':
spider = MuKe()
spider.Run()
当我们执行这段代码时,程序就会按照上述各个方法定义的逻辑,依次完成获取MOOC网首页内容、解析首页获取课程链接、解析课程列表和详情信息,并最终将所有信息存储到本地数据库的操作。
五、总结
全部代码:
# -*- coding:utf-8 -*-
import requests
import pymysql
from lxml import etree
class MuKe(object):
def __init__(self):
self.base_url = "https://www.imooc.com/"
self.headers = {
}
self.cookies = {
}
self.db = pymysql.Connect(
host='127.0.0.1',
port=3306,
user='root',
password='921108',
db='fjj'
)
self.cursor = self.db.cursor()
def get_homepage_content(self):
"""获取慕课网首页内容"""
response = requests.get(self.base_url, headers=self.headers, cookies=self.cookies)
return response.text
def parse_homepage(self, resp):
"""解析慕课网首页,获取课程分类、标题和链接等信息"""
html = etree.HTML(resp)
data_list = html.xpath('//*[@id="main"]/div[2]/div[1]/div')
Data = data_list[0:7]
for data in Data:
type_ = data.xpath('./div[1]/h2/text()')[0]
title_list = data.xpath('./div[1]/div/p/a')
for data_ in title_list:
title = data_.xpath('./text()')[0]
href = data_.xpath('./@href')
if href[0][:2] == '//':
href = 'https:' + str(href[0])
else:
href = 'https:/' + str(href[0])
self.parse_course_list(type_,title,href)
def parse_course_list(self, type_, title, href):
# print(href)
try:
resp = requests.get(href, headers=self.headers, cookies=self.cookies).text
html = etree.HTML(resp)
data_list = html.xpath('/html/body/div[@class="main"]/div[1]/ul/li')
for data in data_list:
course = data.xpath('./a/p[1]/text()')[0].strip()
person = data.xpath('./a/p[2]/span/text()')[0].strip()
price = data.xpath('./a/p[3]/span/text()')[0]
src = 'https://coding.imooc.com/' + data.xpath('./a/@href')[0]
print(type_, title, course, person, price, src)
self.save_to_db(type_, title, course, person, price, src)
except:
print('暂无课程,或出错了。')
pass
def save_to_db(self,type_, title, course, person, price, src):
sql = "insert into 慕课网 (type_, title, course, person, price, src) values (%s,%s,%s,%s,%s,%s)"
params = [(type_, title, course, person, price, src)]
self.cursor.executemany(sql, params)
self.db.commit()
def Run(self):
"""主运行函数,协调各个功能函数完成抓取和存储任务"""
try:
resp = self.get_homepage_content()
self.parse_homepage(resp)
except Exception as e:
print(f"运行过程中出现错误: {e}")
if __name__ == '__main__':
spider = MuKe()
spider.Run()
通过以上代码,我们实现了一个简单的 Python 程序,可以自动抓取MOOC网首页的课程信息并存储到本地数据库中。当然,在实际应用中,我们可能还需要根据具体需求对代码进行进一步的优化和扩展,比如增加错误处理的完善程度、对数据进行更深入的清洗和分析等。希望这篇博客能够帮助大家了解如何利用 Python 进行网页数据抓取和数据库存储相关的操作。
请注意,在实际使用中,如果涉及到对网站数据的获取,需要确保遵守相关网站的使用条款和法律法规,避免未经授权的访问和数据滥用等问题,本文仅供交流学习,请勿滥用。