1. 项目概述
最近在做一个爬取麻省理工学院新闻网站(news.mit.edu)的小项目,目标是获取新闻的标题、内容、作者、发布时间等关键信息,并将数据存储到MongoDB数据库中。这个项目虽然不算复杂,但涉及到了网页结构分析、分页处理、数据清洗等多个爬虫常见的技术点,对初学者来说是个不错的练手项目。
我在实际开发过程中遇到了不少细节问题,比如页面参数传递方式的分析、动态内容的获取、HTML结构的清理等。通过这个项目,我总结出了一套相对完整的解决方案,现在分享给大家,希望能帮助到有类似需求的开发者。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 目标分析与网站结构
2.1 爬取目标明确化
我们的主要目标是爬取news.mit.edu网站上的新闻内容,具体需要获取以下字段:
- 新闻标题
- 正文内容
- 作者信息
- 发布时间
- 文章链接
- 文章中的图片
这些数据将被存储到MongoDB数据库中,方便后续的分析和使用。数据库设计分为两个集合:catalogues(版面信息)和cards(文章信息)。
2.2 网站模块分析
通过分析,我发现news.mit.edu的新闻主要分为4个模块:
- Topics(主题分类)
- Centers, Labs & Programs(中心、实验室和项目)
- Departments(院系)
- Schools(学院)
每个模块都有独立的URL和页面结构,但基本的数据获取逻辑是相似的。这种模块化的设计实际上让我们的爬虫开发可以遵循相同的模式,只需要针对每个模块做微调即可。
2.3 页面结构解析
网站的页面结构大致分为三层:
- 模块首页:展示所有分类/标签
- 分类页面:展示该分类下的文章列表
- 文章详情页:包含完整的文章内容
这种层级结构在新闻类网站中非常常见,理解这种结构对编写爬虫很有帮助。我们需要从最外层的模块开始,逐层深入获取最终的文章内容。
3. 技术实现细节
3.1 基础爬虫类设计
我设计了一个MitnewsScraper类来封装所有的爬取逻辑,这样可以更好地组织代码,也方便后续的维护和扩展。类的初始化参数包括:
- root_url: 网站根URL
- model_url: 当前模块的URL
- img_output_dir: 图片保存目录
python复制class MitnewsScraper:
def __init__(self, root_url, model_url, img_output_dir):
self.root_url = root_url
self.model_url = model_url
self.img_output_dir = img_output_dir
self.headers = {
'Referer': 'https://news.mit.edu/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
'Cookie': '替换成你自己的',
}
提示:在实际使用时,记得替换headers中的Cookie为你自己的值,这样可以避免被网站反爬机制拦截
