如何用脚本自动爬取新闻标题?

wen 实用脚本 3

?从零搭建你的新闻监控系统

目录导读

  1. 为什么需要自动化爬取新闻标题?
  2. 技术选型:Python + Requests + BeautifulSoup 还是 Scrapy?
  3. 手把手教你写第一个爬虫脚本
  4. 常见反爬机制及应对策略
  5. 提升效率:如何实现定时自动抓取?
  6. 数据存储:标题直接导出为Excel/数据库
  7. 常见问题与应对方案(问答环节)
  8. SEO优化建议与合规性提醒

为什么需要自动化爬取新闻标题?

在信息爆炸的时代,手动浏览多个新闻网站收集标题不仅耗时,而且容易遗漏重要内容,无论是:

如何用脚本自动爬取新闻标题?

  • 舆情监控:企业需要实时追踪品牌相关新闻
  • 金融分析:投资者关注市场动态
  • 学术研究:收集特定主题的媒体报道

使用脚本自动爬取新闻标题,可以将重复劳动压缩到秒级,且能24小时不间断运行,据某金融公司实测,爬虫替代人工后,舆情响应速度提升约80%。

技术选型:Python + Requests + BeautifulSoup 还是 Scrapy?

这种结构化数据,两种方案各有利弊:

方案 适用场景 学习成本 性能
Requests + BeautifulSoup 小型项目、单页抓取 中等
Scrapy 大规模、多页面、企业级 中等偏高

推荐:初学者优先选择 Requests + BeautifulSoup,代码可读性强,调试方便,待项目规模扩大后再迁移至 Scrapy。

手把手教你写第一个爬虫脚本

假设我们需要爬取某新闻门户(如新浪新闻、环球网)的首页标题,以下是一个可直接运行的示例:

import requests
from bs4 import BeautifulSoup
import time
def get_news_titles(url):
    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:
        response = requests.get(url, headers=headers, timeout=10)
        response.encoding = 'utf-8'  # 自动识别编码
        soup = BeautifulSoup(response.text, 'html.parser')
        # 常见标题标签:h2, h3, a标签的title属性等
        titles = []
        for tag in soup.find_all(['h2', 'h3']):
            text = tag.get_text(strip=True)
            if text and len(text) > 5:  # 过滤空标签和短文本
                titles.append(text)
        return titles[:20]  # 返回前20条标题
    except Exception as e:
        print(f"爬取失败: {e}")
        return []
# 示例调用
news_url = "https://news.sina.com.cn"
result = get_news_titles(news_url)
for idx, title in enumerate(result, 1):
    print(f"{idx}. {title}")
    time.sleep(0.5)  # 礼貌性延迟

关键点

  • User-Agent 必须设置,否则多数网站会直接拒绝
  • 使用 time.sleep 避免请求过快被屏蔽
  • 根据实际网页结构调整标签选择器(可通过浏览器F12查看)

常见反爬机制及应对策略

新闻网站通常有基础防护,以下为最常遇到的情况:

反爬手段 表现 解决方案
IP限制 短时间内多次请求被封 使用代理IP池(如付费服务或免费代理列表)
动态加载 标题通过JavaScript渲染 使用Selenium或Playwright模拟浏览器
验证码 请求时出现图形验证 接入打码平台或降低频率
请求头检测 缺少Referer等字段 补充完整请求头(Cookie、Accept等)

进阶技巧:对于动态页面,可尝试抓取JSON接口,例如很多新闻网站有隐藏的API:https://api.xxx.com/news/list?page=1,直接调用往往更高效。

提升效率:如何实现定时自动抓取?

使用 schedule 库可轻松实现定时任务:

import schedule
import time
def job():
    print("开始爬取新闻...")s = get_news_titles("https://news.sina.com.cn")
    with open("news_log.txt", "a", encoding="utf-8") as f:
        for t in titles:
            f.write(f"{time.strftime('%Y-%m-%d %H:%M')} - {t}\n")
# 每30分钟执行一次
schedule.every(30).minutes.do(job)
while True:
    schedule.run_pending()
    time.sleep(1)

生产环境建议:使用Linux的Crontab或Windows的任务计划程序,稳定性更高。

数据存储:标题直接导出为Excel/数据库

需要持久化,推荐两种方式:

1 导出为Excel(适合小规模数据)

import pandas as pd
s = get_news_titles("https://news.sina.com.cn")
df = pd.DataFrame(titles, columns=["新闻标题"])
df.to_excel("news_titles.xlsx", index=False)

2 存入SQLite(适合长期监控)

import sqlite3
conn = sqlite3.connect('news.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS news
             (id INTEGER PRIMARY KEY AUTOINCREMENT, 
              title TEXT, 
              crawled_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')
in titles:
    c.execute("INSERT INTO news (title) VALUES (?)", (title,))
conn.commit()
conn.close()

常见问题与应对方案(问答环节)

Q1:网页结构变化后脚本失效怎么办?
A:定期用开发者工具检查网页DOM结构,将标签选择器改为更通用的匹配规则,也可引入正则表达式进行模糊匹配。

Q2:如何避免重复爬取相同标题?
A:在数据库中为title字段设置UNIQUE约束,或使用哈希表存储已抓取的标题指纹。

Q3:法律风险如何规避?
A:严格遵守目标网站的robots.txt文件,仅抓取公开数据,不抓取需要登录的内容,且控制请求频率不超过人类正常浏览速度。

Q4:遇到反爬虫IP封禁怎么办?
A:优先降低频率(每3-5秒一个请求),次选使用requests.Session()保持连接,最后考虑代理IP切换。

SEO优化建议与合规性提醒

从搜索引擎优化角度,本篇文章已在结构上做出以下优化:

  • 使用<h1>~<h4>标题层级清晰
  • 包含关键词如“爬虫脚本”“自动化抓取”“新闻标题爬取”
  • 结合实际代码示例,提升内容价值

重要提醒

  1. 爬取的数据不得用于商业转售或侵权用途。
  2. 遵守《网络安全法》及目标网站的《服务条款》。
  3. 建议在爬取前发送邮件向网站管理员申请许可。

抱歉,评论功能暂时关闭!