☰
Python爬虫入门实战:MIT新闻网站数据抓取
2026/10/14 11:06:59 网站建设 项目流程

1. 项目背景与目标

最近在技术社区看到不少朋友对网络爬虫感兴趣,但苦于找不到合适的入门项目。今天我就以麻省理工学院(MIT)新闻网站为例,带大家完成一个完整的初级爬虫实战。这个项目特别适合刚接触Python爬虫的开发者,既能学习基础技术,又能获取高质量的科技新闻内容。

选择MIT新闻作为目标网站有几个优势:首先,它的页面结构清晰规范,适合新手练习;其次,内容更新频繁且质量高,爬取结果有实际价值;最重要的是,该网站对教育用途的爬取相对友好(当然我们还是会严格遵守robots.txt规则)。

2. 技术准备与环境搭建

2.1 基础工具选择

对于这个初级项目,我们主要使用Python生态中的几个经典库:

  • Requests:用于发送HTTP请求
  • BeautifulSoup:用于解析HTML文档
  • Pandas:用于数据存储和处理

这些库的安装非常简单:

pip install requests beautifulsoup4 pandas

2.2 目标网站分析

在开始编码前,我们需要先分析MIT新闻网站的结构。打开浏览器开发者工具(F12),观察几个关键点:

  1. 页面布局:新闻列表通常位于特定CSS选择器下
  2. 分页机制:是传统的页码链接还是无限滚动
  3. 数据加载:是服务端渲染还是客户端动态加载

经过分析,MIT新闻采用传统的服务端渲染,每页显示10篇文章,通过明确的页码链接实现分页。

3. 核心爬取逻辑实现

3.1 基础爬取函数

我们先编写一个基础函数来获取单个页面的内容:

import requests from bs4 import BeautifulSoup def fetch_page(page_num): url = f"https://news.mit.edu/topic/{page_num}" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' } try: response = requests.get(url, headers=headers) response.raise_for_status() return response.text except requests.exceptions.RequestException as e: print(f"Error fetching page {page_num}: {e}") return None

3.2 内容解析逻辑

获取到HTML后,我们需要从中提取关键信息:

def parse_articles(html): soup = BeautifulSoup(html, 'html.parser') articles = [] for item in soup.select('.news-article'): title = item.select_one('h2 a').text.strip() link = item.select_one('h2 a')['href'] summary = item.select_one('.summary').text.strip() date = item.select_one('.date').text.strip() articles.append({ 'title': title, 'link': link, 'summary': summary, 'date': date }) return articles

3.3 分页处理与数据存储

为了爬取多页内容,我们需要处理分页逻辑:

import pandas as pd def crawl_mit_news(max_pages=5): all_articles = [] for page in range(1, max_pages + 1): print(f"Processing page {page}...") html = fetch_page(page) if html: articles = parse_articles(html) all_articles.extend(articles) df = pd.DataFrame(all_articles) df.to_csv('mit_news.csv', index=False) return df

4. 高级功能与优化

4.1 请求速率控制

为了避免给服务器造成负担,我们应该控制请求频率:

import time def crawl_with_delay(max_pages=5, delay=2): all_articles = [] for page in range(1, max_pages + 1): time.sleep(delay) # 添加延迟 html = fetch_page(page) if html: articles = parse_articles(html) all_articles.extend(articles) return all_articles

4.2 异常处理增强

健壮的爬虫需要处理各种异常情况:

def robust_fetch(url, max_retries=3): for attempt in range(max_retries): try: response = requests.get(url, timeout=10) response.raise_for_status() return response.text except Exception as e: print(f"Attempt {attempt + 1} failed: {e}") if attempt == max_retries - 1: return None time.sleep(2 ** attempt) # 指数退避

5. 数据存储与分析

5.1 多种存储格式

除了CSV,我们还可以将数据保存为其他格式:

def save_data(articles, format='csv'): df = pd.DataFrame(articles) if format == 'csv': df.to_csv('mit_news.csv', index=False) elif format == 'json': df.to_json('mit_news.json', orient='records') elif format == 'excel': df.to_excel('mit_news.xlsx', index=False)

5.2 简单数据分析

我们可以对爬取的数据进行初步分析:

def analyze_data(df): # 按日期统计文章数量 df['date'] = pd.to_datetime(df['date']) daily_counts = df.groupby(df['date'].dt.date).size() # 标题词频分析 from collections import Counter word_counts = Counter(" ".join(df['title']).lower().split()) return { 'daily_counts': daily_counts, 'top_words': word_counts.most_common(10) }

6. 反爬虫策略应对

6.1 请求头优化

设置合理的请求头可以降低被屏蔽的概率:

headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'Accept': 'text/html,application/xhtml+xml', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://news.mit.edu/', 'DNT': '1' }

6.2 IP轮换策略

对于大规模爬取,可以考虑使用代理IP:

proxies = { 'http': 'http://your_proxy:port', 'https': 'http://your_proxy:port' } response = requests.get(url, headers=headers, proxies=proxies)

7. 项目扩展方向

7.1 定时自动爬取

使用计划任务实现每日自动更新:

import schedule import time def daily_job(): crawl_mit_news(max_pages=3) schedule.every().day.at("08:00").do(daily_job) while True: schedule.run_pending() time.sleep(60)

7.2 构建新闻推荐系统

基于爬取的数据构建简单的推荐系统:

from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity def build_recommender(articles): tfidf = TfidfVectorizer(stop_words='english') tfidf_matrix = tfidf.fit_transform([a['title'] + " " + a['summary'] for a in articles]) return cosine_similarity(tfidf_matrix)

8. 法律与道德注意事项

在开发爬虫时,必须注意以下几点:

  1. 遵守robots.txt规则
  2. 控制请求频率,避免影响网站正常运行
  3. 仅用于个人学习目的
  4. 不爬取敏感或个人隐私信息
  5. 考虑设置明显的用户代理标识

可以通过以下方式检查robots.txt:

robots_url = "https://news.mit.edu/robots.txt" print(requests.get(robots_url).text)

9. 常见问题解决

9.1 页面结构变化应对

网站改版是爬虫常见问题,解决方法包括:

  1. 使用更宽松的CSS选择器
  2. 添加多种解析策略
  3. 建立监控机制及时发现变化

9.2 数据清洗技巧

爬取的数据往往需要清洗:

def clean_text(text): text = text.replace('\n', ' ').replace('\r', '') text = ' '.join(text.split()) # 去除多余空格 return text.strip()

10. 项目总结与进阶建议

这个MIT新闻爬虫项目涵盖了从基础到进阶的多个爬虫技术点。在实际操作中,我发现以下几点特别重要:

  1. 先人工分析网站结构再编码
  2. 逐步构建功能,不要一次性写太多代码
  3. 添加充分的日志记录
  4. 考虑使用Scrapy框架进行更复杂的爬取任务

对于想进一步学习的朋友,建议:

  • 尝试爬取动态加载的内容(如使用Selenium)
  • 研究如何绕过更复杂的反爬机制
  • 学习将爬虫部署到云服务器
  • 探索数据可视化分析结果

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询