pip install selenium
pip install webdriver_manager

代碼步驟

1. 初始化瀏覽器

代碼首先使用 seleniumwebdriver.Chrome 創(chuàng)建瀏覽器驅(qū)動(dòng)程序,配置了瀏覽器最大化選項(xiàng),并加載目標(biāo)頁面(https://news.sina.com.cn/world/)。這一步為后續(xù)抓取頁面內(nèi)容做準(zhǔn)備。

2. 定義數(shù)據(jù)存儲(chǔ)

代碼定義了一個(gè)列表 url 用于存儲(chǔ)新聞鏈接。

3. 等待頁面加載

代碼通過 WebDriverWait 顯式等待新聞項(xiàng)的加載,確保抓取到的內(nèi)容是完整的。目標(biāo)新聞項(xiàng)是通過 CSS 選擇器 .news-item 定位的。

4. 遍歷新聞項(xiàng)并提取鏈接

在抓取到的 .news-item 列表中,代碼逐條提取 <a> 標(biāo)簽的 href 屬性,即新聞鏈接,將其存入 url 列表中。如果某一條鏈接提取失敗,會(huì)記錄錯(cuò)誤信息并繼續(xù)處理其他新聞項(xiàng)。

5. 關(guān)閉瀏覽器

在抓取完成后,瀏覽器會(huì)被關(guān)閉以釋放系統(tǒng)資源。

6. 保存鏈接到文件

代碼將抓取到的鏈接存儲(chǔ)到本地文件,文件名為 sina_YYYYMMDD.txt,其中 YYYYMMDD 是當(dāng)天的日期。保存路徑為 ./inputs,如果路徑不存在,會(huì)自動(dòng)創(chuàng)建。

7. 爬取重試機(jī)制

start 函數(shù)實(shí)現(xiàn)了一個(gè)最多嘗試 10 次的重試邏輯。如果爬取失敗,則會(huì)重新嘗試,直到成功或嘗試次數(shù)達(dá)到上限。爬取完成后,代碼會(huì)打印成功信息和文件路徑。

8. 程序入口

通過 if __name__ == "__main__": 確保代碼入口,調(diào)用 start 函數(shù)開始執(zhí)行爬取操作。

9. 代碼示例

以sina網(wǎng)站爬取全球新聞為例

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():
# 創(chuàng)建 Chrome 瀏覽器驅(qū)動(dòng),無頭模式
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"))
)

# 獲取所有新聞項(xiàng)
news_items = driver.find_elements(By.CSS_SELECTOR, ".news-item")

# 遍歷新聞項(xiàng),提取鏈接
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}") # 調(diào)試用
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}")

# 保存結(jié)果到文件
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()

結(jié)果展示

使用 Python 和 Mediastack News API 自動(dòng)收集新聞

Mediastack 是當(dāng)今企業(yè)和開發(fā)人員首選的最受歡迎的新聞 API 之一。將此 API 與競(jìng)爭(zhēng)對(duì)手區(qū)分開來的最重要功能之一是它支持 Java、Python、Go、JavaScript 和許多其他主要編程語言。它還在其開發(fā)人員友好的文檔中提供了多種編程語言的示例集成代碼。在本節(jié)中,我們將通過幾個(gè)步驟將此 API 集成到 Python 編程語言中。

獲取 API 密鑰

我們需要一個(gè) API 密鑰來將 mediastack API 集成到 Python 中并開始使用它。為此,讓我們注冊(cè)它提供的免費(fèi)計(jì)劃并獲取 API 密鑰。

代碼

在此步驟中,我們會(huì)將 mediastack API 集成到 Python 中。為此,讓我們打開一個(gè) 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'))

測(cè)試

為了測(cè)試應(yīng)用程序,讓我們將 API 密鑰放在 ‘YOUR_ACCESS_KEY’ 字段中并運(yùn)行應(yīng)用程序。

我們得到的回復(fù)如下:

使用 Mediastack 和 Jupyter Notebook 開發(fā)基于 Web 的新聞抓取工具

在上一節(jié)中,我們可以使用 Python 腳本輕松構(gòu)建基于 Web 的交互式新聞收集器或抓取器,只需在 Jupyter Notebook 中運(yùn)行它們即可。

結(jié)果如下:

結(jié)論

通過本文的詳細(xì)講解,相信讀者已經(jīng)掌握了如何使用Scrapy+Selenium+Mediastack API構(gòu)建新聞爬蟲系統(tǒng)的核心要點(diǎn)。這套解決方案不僅適用于新聞網(wǎng)站的數(shù)據(jù)采集,還可以擴(kuò)展應(yīng)用到其他網(wǎng)絡(luò)爬蟲場(chǎng)景。在實(shí)際應(yīng)用中,建議讀者注意遵守網(wǎng)站的robots協(xié)議,合理控制爬取頻率,確保爬蟲程序穩(wěn)定可靠地運(yùn)行。隨著技術(shù)的不斷發(fā)展,我們也將持續(xù)優(yōu)化和更新這套新聞采集方案,為用戶提供更好的數(shù)據(jù)獲取體驗(yàn)。

常見問題

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

答:News API通常提供與新聞相關(guān)的基本數(shù)據(jù),例如新聞標(biāo)題、新聞文本、新聞來源、發(fā)布日期和類似信息。這些數(shù)據(jù)通常以結(jié)構(gòu)化的方式呈現(xiàn),用戶可以輕松處理。

mediastack 支持多少個(gè)新聞來源?

答:Mediastack 提供對(duì)龐大新聞網(wǎng)絡(luò)的訪問,支持 7500 多個(gè)新聞來源。這些來源包括世界各地的不同出版物、新聞網(wǎng)站、博客和其他新聞提供商。

mediastack API 以什么數(shù)據(jù)格式提供信息?

答:Mediastack API 通常以 JSON 格式呈現(xiàn)數(shù)據(jù),這是一種輕量級(jí)且用戶友好的結(jié)構(gòu)。這種格式使數(shù)據(jù)易于處理、分析并集成到應(yīng)用程序中。

如何將News API 用于我的業(yè)務(wù),哪些使用案例脫穎而出?

答:通過在您的業(yè)務(wù)中使用News API,您可以進(jìn)行市場(chǎng)分析、執(zhí)行競(jìng)爭(zhēng)對(duì)手分析、分析客戶反饋并收集有關(guān)危機(jī)管理等問題的信息。

如何找到更多同類API?

答:冪簡(jiǎn)集成是國(guó)內(nèi)領(lǐng)先的API集成管理平臺(tái),專注于為開發(fā)者提供全面、高效、易用的API集成解決方案。冪簡(jiǎn)API平臺(tái)可以通過以下兩種方式找到所需API:通過關(guān)鍵詞搜索API、或者從API Hub分類頁進(jìn)入尋找。

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

上一篇:

音頻 API 快速入門指南:在 Linux、Windows、FreeBSD 和 macOS 上播放和錄制聲音

下一篇:

設(shè)置OpenAI API Key 密鑰失敗是什么問題?常見原因與解決方案全解析
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)