pip install selenium
pip install webdriver_manager
代碼首先使用 selenium
的 webdriver.Chrome
創建瀏覽器驅動程序,配置了瀏覽器最大化選項,并加載目標頁面(https://news.sina.com.cn/world/
)。這一步為后續抓取頁面內容做準備。
代碼定義了一個列表 url
用于存儲新聞鏈接。
代碼通過 WebDriverWait
顯式等待新聞項的加載,確保抓取到的內容是完整的。目標新聞項是通過 CSS 選擇器 .news-item
定位的。
在抓取到的 .news-item
列表中,代碼逐條提取 <a>
標簽的 href
屬性,即新聞鏈接,將其存入 url
列表中。如果某一條鏈接提取失敗,會記錄錯誤信息并繼續處理其他新聞項。
在抓取完成后,瀏覽器會被關閉以釋放系統資源。
代碼將抓取到的鏈接存儲到本地文件,文件名為 sina_YYYYMMDD.txt
,其中 YYYYMMDD
是當天的日期。保存路徑為 ./inputs
,如果路徑不存在,會自動創建。
start
函數實現了一個最多嘗試 10 次的重試邏輯。如果爬取失敗,則會重新嘗試,直到成功或嘗試次數達到上限。爬取完成后,代碼會打印成功信息和文件路徑。
通過 if __name__ == "__main__":
確保代碼入口,調用 start
函數開始執行爬取操作。
以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()
Mediastack 是當今企業和開發人員首選的最受歡迎的新聞 API 之一。將此 API 與競爭對手區分開來的最重要功能之一是它支持 Java、Python、Go、JavaScript 和許多其他主要編程語言。它還在其開發人員友好的文檔中提供了多種編程語言的示例集成代碼。在本節中,我們將通過幾個步驟將此 API 集成到 Python 編程語言中。
我們需要一個 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’ 字段中并運行應用程序。
我們得到的回復如下:
在上一節中,我們可以使用 Python 腳本輕松構建基于 Web 的交互式新聞收集器或抓取器,只需在 Jupyter Notebook 中運行它們即可。
結果如下:
通過本文的詳細講解,相信讀者已經掌握了如何使用Scrapy+Selenium+Mediastack API構建新聞爬蟲系統的核心要點。這套解決方案不僅適用于新聞網站的數據采集,還可以擴展應用到其他網絡爬蟲場景。在實際應用中,建議讀者注意遵守網站的robots協議,合理控制爬取頻率,確保爬蟲程序穩定可靠地運行。隨著技術的不斷發展,我們也將持續優化和更新這套新聞采集方案,為用戶提供更好的數據獲取體驗。
答:News API通常提供與新聞相關的基本數據,例如新聞標題、新聞文本、新聞來源、發布日期和類似信息。這些數據通常以結構化的方式呈現,用戶可以輕松處理。
答:Mediastack 提供對龐大新聞網絡的訪問,支持 7500 多個新聞來源。這些來源包括世界各地的不同出版物、新聞網站、博客和其他新聞提供商。
答:Mediastack API 通常以 JSON 格式呈現數據,這是一種輕量級且用戶友好的結構。這種格式使數據易于處理、分析并集成到應用程序中。
答:通過在您的業務中使用News API,您可以進行市場分析、執行競爭對手分析、分析客戶反饋并收集有關危機管理等問題的信息。
答:冪簡集成是國內領先的API集成管理平臺,專注于為開發者提供全面、高效、易用的API集成解決方案。冪簡API平臺可以通過以下兩種方式找到所需API:通過關鍵詞搜索API、或者從API Hub分類頁進入尋找。
原文鏈接:https://blog.apilayer.com/how-to-make-news-scraping-automation-with-mediastack-api-and-python/