作者:. | 来源:互联网 | 2024-12-17 11:53
前言
随着互联网技术的发展,在线教育平台成为许多人获取知识的重要途径。本文将通过Python爬虫技术,探索并抓取几个国内知名的在线学习平台的数据,包括51CTO学院、CSDN学院、网易云课堂及慕课网等,所有抓取的数据将存储在MongoDB数据库中。本文旨在提供一个实用的爬虫案例,帮助读者理解并掌握相关技术。
1. 目标网站
本篇教程的目标网站是51CTO学院(http://edu.51cto.com/courselist/index.html?edunav),该网站提供了大量的IT技术课程,数据量超过一万条,非常适合用于爬虫练习。
2. 信息分析
首先,我们需要确定要抓取的具体信息。这通常包括课程名称、链接、上课时间、学习人数、评分、课程目标和价格等。通过浏览器的开发者工具,我们可以查看页面的HTML源码,找到这些信息的标签结构。此外,还可以发现一些隐藏但有价值的信息,如课程是否为独家内容等,这些也可以一并抓取。
3. 爬取方法
在确认了要抓取的信息后,下一步就是选择合适的爬取方法。首先检查目标网站是否使用了AJAX动态加载数据,如果没有,则可以使用较为传统的URL拼接方法进行爬取。51CTO学院的课程列表页面没有使用异步加载,因此可以通过拼接URL来访问不同页码的课程列表:
例如:
http://edu.51cto.com/courselist/index-p2.html
http://edu.51cto.com/courselist/index-p3.html
...
这里我们使用requests-html
库来发送HTTP请求并解析HTML内容。这是一个功能强大的库,支持同步和异步操作,非常适合网页抓取任务。
示例代码如下:
from requests_html import HTMLSession
base_url = "http://edu.51cto.com/courselist/index.html"
def fetch_data():
session = HTMLSession()
respOnse= session.get(base_url)
print(response.html.text)
if __name__ == '__main__':
fetch_data()
以上代码可以快速获取到页面的HTML内容。为了提取具体信息,可以进一步使用find
方法定位到特定的HTML元素。
4. 异步爬取
为了提高爬虫效率,可以考虑使用异步请求。requests-html
库也支持异步操作,但需要注意的是,早期版本可能未包含此功能。确保你的requests-html
是最新的版本,或者直接从GitHub上克隆最新的代码。
下面是一个使用异步请求的示例代码:
from requests_html import AsyncHTMLSession
asession = AsyncHTMLSession()
base_url = "http://edu.51cto.com/courselist/index-p{}.html"
async def get_page_data(page):
url = base_url.format(page)
respOnse= await asession.get(url)
parse_items(response.html)
def parse_items(html):
items = html.find('.clist .clist_item')
for item in items:
data = {
'title': item.find('h3', first=True).text,
'link': item.find('h3 > a', first=True).attrs['href'],
'duration': item.find('div.course_infos > p:eq(0)', first=True).text,
'students': item.find('div.course_infos > p:eq(1)', first=True).text,
'rating': item.find('div.course_infos > div', first=True).text,
'target': item.find('.main > .course_target', first=True).text,
'price': item.find('.main > .course_payinfo h4', first=True).text
}
print(data)
if __name__ == '__main__':
asession.run(get_page_data(1), get_page_data(2))
这段代码实现了异步抓取前两页的数据,并解析出每门课程的详细信息。实际应用中,可以将页码范围设置得更大,以抓取更多数据。
5. 数据存储
最后一步是将抓取到的数据存储到MongoDB数据库中。MongoDB是一种NoSQL数据库,非常适合存储非结构化或半结构化的数据。以下是将数据存入MongoDB的一个简单示例:
from pymongo import MongoClient
def save_to_mongodb(data):
client = MongoClient('localhost', 27017)
db = client['edu_courses']
collection = db['courses']
collection.insert_one(data)
# 在parse_items函数中调用save_to_mongodb
for item in items:
data = {...}
save_to_mongodb(data)
这样,每次解析出一条课程数据时,都会将其保存到MongoDB中。整个过程简单高效,适用于大规模数据抓取任务。