所有文章 > API使用场景 > 如何高效爬取全球新闻网站 - 整合Scrapy、Selenium与Mediastack API实现自动化新闻采集

如何高效爬取全球新闻网站 - 整合Scrapy、Selenium与Mediastack API实现自动化新闻采集

在当今信息爆炸的时代,快速准确地获取全球新闻资讯变得越来越重要。无论是数据分析师、新闻工作者还是研究人员,都需要一个可靠的新闻数据采集方案。本文将详细介绍如何结合Scrapy爬虫框架、Selenium自动化测试工具以及Mediastack新闻API,打造一个强大的全球新闻网站爬虫系统。这套解决方案不仅能够高效地抓取各大新闻网站的内容,还能确保数据的实时性和准确性。

使用scrapy+selenium爬取全球新闻网站

这段代码实现了一个基于 Selenium 的新闻爬虫,主要功能是抓取新浪国际新闻页面的所有新闻链接,并保存到本地文件中。代码具有以下特点:

  1. 自动化操作浏览器并加载页面。
  2. 提取页面中新闻链接并存储。
  3. 自动创建文件夹和保存结果。
  4. 提供重试机制以应对网络问题。

这段代码可用于定期抓取新闻数据并存档。

环境准备

在开始之前,需要安装以下依赖:

pip install scrapy
pip install selenium
pip install webdriver_manager

代码步骤

1. 初始化浏览器

代码首先使用 seleniumwebdriver.Chrome 创建浏览器驱动程序,配置了浏览器最大化选项,并加载目标页面(https://news.sina.com.cn/world/)。这一步为后续抓取页面内容做准备。

2. 定义数据存储

代码定义了一个列表 url 用于存储新闻链接。

3. 等待页面加载

代码通过 WebDriverWait 显式等待新闻项的加载,确保抓取到的内容是完整的。目标新闻项是通过 CSS 选择器 .news-item 定位的。

4. 遍历新闻项并提取链接

在抓取到的 .news-item 列表中,代码逐条提取 <a> 标签的 href 属性,即新闻链接,将其存入 url 列表中。如果某一条链接提取失败,会记录错误信息并继续处理其他新闻项。

5. 关闭浏览器

在抓取完成后,浏览器会被关闭以释放系统资源。

6. 保存链接到文件

代码将抓取到的链接存储到本地文件,文件名为 sina_YYYYMMDD.txt,其中 YYYYMMDD 是当天的日期。保存路径为 ./inputs,如果路径不存在,会自动创建。

7. 爬取重试机制

start 函数实现了一个最多尝试 10 次的重试逻辑。如果爬取失败,则会重新尝试,直到成功或尝试次数达到上限。爬取完成后,代码会打印成功信息和文件路径。

8. 程序入口

通过 if __name__ == "__main__": 确保代码入口,调用 start 函数开始执行爬取操作。

9. 代码示例

以sina网站爬取全球新闻为例

import re
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import datetime
from urllib import parse
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def get_news():
# 创建 Chrome 浏览器驱动,无头模式
chrome_options = Options()
chrome_options.add_argument("--start-maximized")
driver = webdriver.Chrome(options=chrome_options)

# 加载页面
driver.get("https://news.sina.com.cn/world/")

# 定义链接列表
url = []
urlToday = []

try:
# 等待页面加载,找到主容器
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".news-item"))
)

# 获取所有新闻项
news_items = driver.find_elements(By.CSS_SELECTOR, ".news-item")

# 遍历新闻项,提取链接
for item in news_items:
try:
link_element = item.find_element(By.TAG_NAME, "a")
href = link_element.get_attribute("href")
print(f"Found URL: {href}") # 调试用
url.append(href)
except Exception as e:
print(f"Error extracting URL from item: {e}")

except Exception as e:
print(f"An error occurred while fetching news: {e}")

finally:
driver.quit()

# 过滤前一天的新闻
dateYestoday = datetime.date.today() - datetime.timedelta(days=1)

for u in url:
# URL 解码
urldata = parse.unquote(u)
result = parse.urlparse(urldata)
print(f"URL: {urldata}")
# 提取 URL 中的日期
s = result.path
m = re.search(r"(\d{4})[-/](\d{1,2})[-/](\d{1,2})", s)

if m:
try:
date2 = datetime.date(int(m.group(1)), int(m.group(2)), int(m.group(3)))
if date2 == dateYestoday:
urlToday.append(u)
except Exception as e:
print(f"Error parsing date for URL {u}: {e}")

# 保存结果到文件
dateT = dateYestoday.strftime("%Y%m%d")
file_path = f"./inputs/sina_{dateT}.txt"

os.makedirs("./inputs", exist_ok=True) # 确保目录存在

try:
with open(file_path, "w", encoding="utf-8") as f:
for var in url:
f.write(var + "\n")
except Exception as e:
print(f"Error writing to file: {e}")

return file_path


# 开始爬取
def start():
sucF = False
count = 0

while count < 10 and not sucF:
try:
file_path = get_news()
sucF = True
except Exception as e:
count += 1
print(f"Attempt {count} failed with error: {e}")

if not sucF:
print("A network outage or other problem has occurred!")
else:
print("新浪新闻爬取完成")
print(f"Saved file: {file_path}")

return file_path


if __name__ == "__main__":
start()

结果展示

使用 Python 和 Mediastack News API 自动收集新闻

Mediastack 是当今企业和开发人员首选的最受欢迎的新闻 API 之一。将此 API 与竞争对手区分开来的最重要功能之一是它支持 Java、Python、Go、JavaScript 和许多其他主要编程语言。它还在其开发人员友好的文档中提供了多种编程语言的示例集成代码。在本节中,我们将通过几个步骤将此 API 集成到 Python 编程语言中。

获取 API 密钥

我们需要一个 API 密钥来将 mediastack API 集成到 Python 中并开始使用它。为此,让我们注册它提供的免费计划并获取 API 密钥。

代码

在此步骤中,我们会将 mediastack API 集成到 Python 中。为此,让我们打开一个 Python 文件并输入以下代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Python 3
import http.client, urllib.parse

conn = http.client.HTTPConnection('api.mediastack.com')

params = urllib.parse.urlencode({
'access_key': 'YOUR_ACCESS_KEY',
'categories': '-general,-sports',
'sort': 'published_desc',
'limit': 10,
})

conn.request('GET', '/v1/news?{}'.format(params))

res = conn.getresponse()
data = res.read()

print(data.decode('utf-8'))

测试

为了测试应用程序,让我们将 API 密钥放在 ‘YOUR_ACCESS_KEY’ 字段中并运行应用程序。

我们得到的回复如下:

使用 Mediastack 和 Jupyter Notebook 开发基于 Web 的新闻抓取工具

在上一节中,我们可以使用 Python 脚本轻松构建基于 Web 的交互式新闻收集器或抓取器,只需在 Jupyter Notebook 中运行它们即可。

结果如下:

结论

通过本文的详细讲解,相信读者已经掌握了如何使用Scrapy+Selenium+Mediastack API构建新闻爬虫系统的核心要点。这套解决方案不仅适用于新闻网站的数据采集,还可以扩展应用到其他网络爬虫场景。在实际应用中,建议读者注意遵守网站的robots协议,合理控制爬取频率,确保爬虫程序稳定可靠地运行。随着技术的不断发展,我们也将持续优化和更新这套新闻采集方案,为用户提供更好的数据获取体验。

常见问题

News API 提供什么类型的信息?

答:News API通常提供与新闻相关的基本数据,例如新闻标题、新闻文本、新闻来源、发布日期和类似信息。这些数据通常以结构化的方式呈现,用户可以轻松处理。

mediastack 支持多少个新闻来源?

答:Mediastack 提供对庞大新闻网络的访问,支持 7500 多个新闻来源。这些来源包括世界各地的不同出版物、新闻网站、博客和其他新闻提供商。

mediastack API 以什么数据格式提供信息?

答:Mediastack API 通常以 JSON 格式呈现数据,这是一种轻量级且用户友好的结构。这种格式使数据易于处理、分析并集成到应用程序中。

如何将News API 用于我的业务,哪些使用案例脱颖而出?

答:通过在您的业务中使用News API,您可以进行市场分析、执行竞争对手分析、分析客户反馈并收集有关危机管理等问题的信息。

如何找到更多同类API?

答:幂简集成是国内领先的API集成管理平台,专注于为开发者提供全面、高效、易用的API集成解决方案。幂简API平台可以通过以下两种方式找到所需API:通过关键词搜索API、或者从API Hub分类页进入寻找。

原文链接:https://blog.apilayer.com/how-to-make-news-scraping-automation-with-mediastack-api-and-python/