如何用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)
三、关键逻辑说明
- 会话保持:
requests.Session()能在多次请求中保持cookie和headers,既贴近浏览器行为,也避免重复建立连接。 - 分页终止条件:当某一页找不到新闻列表元素时,判定为最后一页,终止循环。
- 反爬规避:设置
User-Agent模拟浏览器,添加time.sleep()控制请求频率,降低被拦截风险。 - 详情页数据提取:进入新闻链接后,根据详情页HTML结构定位日期、标签元素,实际使用时需检查页面源码调整选择器。
四、注意事项
- 网站结构可能更新,需定期检查HTML元素的class或标签,及时调整选择器。
- 若遇IP封禁,可尝试添加代理IP,或进一步降低请求频率。
- 爬取需遵守网站
robots.txt协议(可访问https://www.defense.gov/robots.txt查看),避免违规操作。
内容的提问来源于stack exchange,提问作者Henry Harrison
相关产品推荐
相关产品推荐

