pip install selenium
pip install webdriver_manager
代碼首先使用 selenium
的 webdriver.Chrome
創(chuàng)建瀏覽器驅(qū)動(dòng)程序,配置了瀏覽器最大化選項(xiàng),并加載目標(biāo)頁面(https://news.sina.com.cn/world/
)。這一步為后續(xù)抓取頁面內(nèi)容做準(zhǔn)備。
代碼定義了一個(gè)列表 url
用于存儲(chǔ)新聞鏈接。
代碼通過 WebDriverWait
顯式等待新聞項(xiàng)的加載,確保抓取到的內(nèi)容是完整的。目標(biāo)新聞項(xiàng)是通過 CSS 選擇器 .news-item
定位的。
在抓取到的 .news-item
列表中,代碼逐條提取 <a>
標(biāo)簽的 href
屬性,即新聞鏈接,將其存入 url
列表中。如果某一條鏈接提取失敗,會(huì)記錄錯(cuò)誤信息并繼續(xù)處理其他新聞項(xiàng)。
在抓取完成后,瀏覽器會(huì)被關(guān)閉以釋放系統(tǒng)資源。
代碼將抓取到的鏈接存儲(chǔ)到本地文件,文件名為 sina_YYYYMMDD.txt
,其中 YYYYMMDD
是當(dāng)天的日期。保存路徑為 ./inputs
,如果路徑不存在,會(huì)自動(dòng)創(chuàng)建。
start
函數(shù)實(shí)現(xiàn)了一個(gè)最多嘗試 10 次的重試邏輯。如果爬取失敗,則會(huì)重新嘗試,直到成功或嘗試次數(shù)達(dá)到上限。爬取完成后,代碼會(huì)打印成功信息和文件路徑。
通過 if __name__ == "__main__":
確保代碼入口,調(diào)用 start
函數(shù)開始執(zhí)行爬取操作。
以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()
Mediastack 是當(dāng)今企業(yè)和開發(fā)人員首選的最受歡迎的新聞 API 之一。將此 API 與競(jìng)爭(zhēng)對(duì)手區(qū)分開來的最重要功能之一是它支持 Java、Python、Go、JavaScript 和許多其他主要編程語言。它還在其開發(fā)人員友好的文檔中提供了多種編程語言的示例集成代碼。在本節(jié)中,我們將通過幾個(gè)步驟將此 API 集成到 Python 編程語言中。
我們需要一個(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è)試應(yīng)用程序,讓我們將 API 密鑰放在 ‘YOUR_ACCESS_KEY’ 字段中并運(yùn)行應(yīng)用程序。
我們得到的回復(fù)如下:
在上一節(jié)中,我們可以使用 Python 腳本輕松構(gòu)建基于 Web 的交互式新聞收集器或抓取器,只需在 Jupyter Notebook 中運(yùn)行它們即可。
結(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通常提供與新聞相關(guān)的基本數(shù)據(jù),例如新聞標(biāo)題、新聞文本、新聞來源、發(fā)布日期和類似信息。這些數(shù)據(jù)通常以結(jié)構(gòu)化的方式呈現(xiàn),用戶可以輕松處理。
答:Mediastack 提供對(duì)龐大新聞網(wǎng)絡(luò)的訪問,支持 7500 多個(gè)新聞來源。這些來源包括世界各地的不同出版物、新聞網(wǎng)站、博客和其他新聞提供商。
答:Mediastack API 通常以 JSON 格式呈現(xiàn)數(shù)據(jù),這是一種輕量級(jí)且用戶友好的結(jié)構(gòu)。這種格式使數(shù)據(jù)易于處理、分析并集成到應(yīng)用程序中。
答:通過在您的業(yè)務(wù)中使用News API,您可以進(jìn)行市場(chǎng)分析、執(zhí)行競(jìng)爭(zhēng)對(duì)手分析、分析客戶反饋并收集有關(guān)危機(jī)管理等問題的信息。
答:冪簡(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/
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)