当前位置:首页>python>【跟着AI学Python】第25天:简单 Web 爬虫(可选)

【跟着AI学Python】第25天:简单 Web 爬虫(可选)

  • 2026-09-08 22:19:38
【跟着AI学Python】第25天:简单 Web 爬虫(可选)

【Qwen3-Max】

太棒了!欢迎来到 【跟着AI学Python】第25天 —— 简单 Web 爬虫入门!🎉今天我们将学习如何用 requests + BeautifulSoup 从网页中安全、合法地提取信息!

⚠️ 重要前提:

  • 仅用于学习目的
  • 遵守网站 robots.txt(如https://example.com/robots.txt)
  • 不要高频请求,避免给服务器造成压力
  • 禁止爬取隐私/付费/反爬严格网站

🎯 第25天目标:

✅ 安装并使用 BeautifulSoup 解析 HTML✅ 用 CSS 选择器或标签名 提取网页内容✅ 实战:抓取新闻标题列表(以公开、友好的网站为例)✅ 学会检查 robots.txt 和设置合理请求头


📘 一、安装依赖

# 在你的虚拟环境中执行$ pip install requests beautifulsoup4 lxml
  • requests:发送 HTTP 请求
  • beautifulsoup4:HTML/XML 解析库
  • lxml:高性能解析器(推荐)

📘 二、基础用法:解析 HTML

🔹 示例:提取网页标题

✅ soup.title.string 等价于 soup.find('title').get_text()


📘 三、核心提取方法

方法
说明
示例
.find(tag)
找第一个匹配标签
soup.find('h1')
.find_all(tag)
找所有匹配标签
soup.find_all('a')
.select(css_selector)
用 CSS 选择器 精准定位
soup.select('div.news > h2')

🔹 常见 CSS 选择器

soup.select('h2')            # 所有 h2 标签soup.select('.title')        # class="title" 的元素soup.select('#main')         # id="main" 的元素soup.select('div p')         # div 内的所有 psoup.select('a[href]')       # 有 href 属性的 a 标签

🌐 四、实战:抓取“人民日报”要闻标题(公开示例)

💡 我们选择 国家数据网 或 公开新闻聚合页 作为示例。注意:以下示例使用 httpbin.org/html(测试页面)和 新华社公开 RSS 页面(静态、友好)。

✅ 示例 1:解析测试页面

✅ 示例 2:抓取新华社“最新报道”标题(静态页面)

🔗 目标页面:http://www.xinhuanet.com/(首页)⚠️ 先检查 robots.txt:http://www.xinhuanet.com/robots.txt → 允许 / 路径

import requestsfrom bs4 import BeautifulSoupimport timedef scrape_xinhua_headlines():    url = "http://www.xinhuanet.com/"    # 设置请求头,模拟浏览器(礼貌!)    headers = {        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"    }    try:        print(f"正在请求: {url}")        response = requests.get(url, headers=headers, timeout=10)        response.raise_for_status()        response.encoding = 'utf-8'        soup = BeautifulSoup(response.text, 'lxml')        # 尝试多种可能的选择器(实际需查看网页源码调整)        headlines = []        # 方法1:查找 class 包含 'title' 的 a 标签        for link in soup.select('a[href*="/c"]'):  # 新华社新闻链接通常含 /c/            title = link.get_text(strip=True)            if title and len(title) > 5:  # 过滤短文本                headlines.append(title)                if len(headlines) >= 10:   # 只取前10条                    break        if not headlines:            # 方法2:查找 h3 标签(备用)            for h3 in soup.find_all('h3'):                title = h3.get_text(strip=True)                if title:                    headlines.append(title)                    if len(headlines) >= 10:                        break        print(f"\n📰 新华社最新报道(共 {len(headlines)} 条):")        for i, title in enumerate(headlines, 1):            print(f"{i}. {title}")    except Exception as e:        print(f"❌ 抓取失败: {e}")if __name__ == "__main__":    scrape_xinhua_headlines()    time.sleep(1)  # 礼貌等待

🔍 提示:

  • 实际开发中需用浏览器开发者工具(F12)查看目标元素的 class/id
  • 新闻网站结构常变,选择器需动态调整

🛡️ 五、遵守网络礼仪(必须!)

1. 检查 robots.txt

# 查看允许爬取的路径$ curl https://example.com/robots.txt

示例内容:

User-agent: *Disallow: /admin/Allow: /

→ 表示除 /admin/ 外均可访问

2. 设置合理请求头

headers = {    "User-Agent": "MyBot/1.0 (+https://yourwebsite.com/bot)",  # 声明身份    "Accept": "text/html"}

3. 控制请求频率

import timetime.sleep(1)  # 每次请求间隔至少 1 秒

4. 处理异常

try:    response = requests.get(url, timeout=10)    response.raise_for_status()except requests.RequestException as e:    print(f"请求失败: {e}")

💻 综合实战:保存新闻到 JSON 文件

import requestsfrom bs4 import BeautifulSoupimport jsonimport timedef save_news_to_json(news_list, filename="news.json"):    with open(filename, "w", encoding="utf-8") as f:        json.dump(news_list, f, ensure_ascii=False, indent=2)    print(f"✅ 新闻已保存到 {filename}")# 假设我们有一个新闻列表(来自爬虫)fake_news = [    {"title": "人工智能助力医疗诊断", "source": "新华社"},    {"title": "全国多地迎来春季旅游高峰", "source": "人民日报"}]save_news_to_json(fake_news)

✅ 今日小任务

  1. 用 BeautifulSoup 提取 https://httpbin.org/html 页面中的 <h1> 文本
  2. 查看 https://quotes.toscrape.com/robots.txt,确认是否允许爬取,然后提取首页所有名言(.text 类)

💡 答案参考(任务2):

import requestsfrom bs4 import BeautifulSoup# 检查 robots.txt: 允许所有用户代理url = "https://quotes.toscrape.com/"res = requests.get(url)soup = BeautifulSoup(res.text, 'lxml')quotes = soup.select('.quote .text')for quote in quotes[:3]:  # 只打印前3条    print(quote.get_text())

✅ 黄金法则:“能用 API 就不用爬虫,能手动就别自动化”爬虫是最后手段,务必合法、合理、有节制!


🎉 恭喜完成第25天!你已掌握 Web 数据提取的基础技能,能安全地从公开网页获取信息!

继续加油,你的数据获取能力又上新台阶!🕷️🌐

最新文章

随机文章