You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python爬取defense.gov平台所有新闻发布产品?

解决方案:爬取defense.gov新闻发布产品全量数据

一、分析分页逻辑

观察目标网站分页行为:点击底部分页按钮时,URL会带上Page参数(比如第二页为https://www.defense.gov/News/Press-Products/?Page=2)。说明分页通过URL参数控制,无需模拟点击,直接构造不同页码的URL即可请求后续页面。

二、完整爬取代码示例

import requests
from bs4 import BeautifulSoup
import time
from requests.exceptions import RequestException

# 初始化会话,保持请求一致性
session = requests.Session()
# 设置浏览器请求头,避免被识别为爬虫
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
session.headers.update(headers)

base_url = 'https://www.defense.gov/News/Press-Products/'
page_num = 1
all_news = []

while True:
    # 构造当前页URL
    current_url = f"{base_url}?Page={page_num}"
    try:
        # 发送请求,添加延迟避免触发反爬
        response = session.get(current_url)
        response.raise_for_status()  # 抛出请求异常
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 定位新闻列表元素(需根据实际页面HTML调整选择器)
        news_items = soup.select('div.card')  # 示例选择器,以实际页面结构为准
        if not news_items:
            print(f"第{page_num}页无新闻内容,结束爬取")
            break
        
        for item in news_items:
            # 提取标题和链接
            title_tag = item.find('a', href=True)
            if title_tag:
                title = title_tag.get_text(strip=True)
                link = f"https://www.defense.gov{title_tag['href']}"
                all_news.append({'title': title, 'link': link})
        
        print(f"已爬取第{page_num}页,累计{len(all_news)}条新闻")
        page_num += 1
        time.sleep(1)  # 延迟1秒,降低请求频率
        
    except RequestException as e:
        print(f"请求第{page_num}页失败:{str(e)}")
        break

# 从详情页提取日期和标签
for news in all_news:
    try:
        response = session.get(news['link'])
        response.raise_for_status()
        detail_soup = BeautifulSoup(response.text, 'html.parser')
        
        # 提取发布日期(示例选择器,需根据实际页面调整)
        date_tag = detail_soup.find('span', class_='published-date')
        news['date'] = date_tag.get_text(strip=True) if date_tag else '未知'
        
        # 提取标签(示例选择器)
        tags = detail_soup.select('div.tags-container a')
        news['tags'] = [tag.get_text(strip=True) for tag in tags] if tags else []
        
        time.sleep(0.5)
    except RequestException as e:
        print(f"请求详情页{news['link']}失败:{str(e)}")

# 输出或保存数据
print("爬取完成,数据示例:")
for news in all_news[:3]:
    print(news)

三、关键逻辑说明

  1. 会话保持:requests.Session()能在多次请求中保持cookie和headers,既贴近浏览器行为,也避免重复建立连接。
  2. 分页终止条件:当某一页找不到新闻列表元素时,判定为最后一页,终止循环。
  3. 反爬规避:设置User-Agent模拟浏览器,添加time.sleep()控制请求频率,降低被拦截风险。
  4. 详情页数据提取:进入新闻链接后,根据详情页HTML结构定位日期、标签元素,实际使用时需检查页面源码调整选择器。

四、注意事项

  • 网站结构可能更新,需定期检查HTML元素的class或标签,及时调整选择器。
  • 若遇IP封禁,可尝试添加代理IP,或进一步降低请求频率。
  • 爬取需遵守网站robots.txt协议(可访问https://www.defense.gov/robots.txt查看),避免违规操作。

内容的提问来源于stack exchange,提问作者Henry Harrison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:57:26