Python3.10 + Firecrawl 下載公眾號文章

獲取Firecrawl apikey

打開官網,使用github賬號登錄
https://www.firecrawl.dev/
在這里插入圖片描述
進入個人中心
https://www.firecrawl.dev/app/api-keys
在這里插入圖片描述

使用PyCharm創建python項目

在這里插入圖片描述

創建.env

# API配置
FIRECRAWL_API_KEY=fc-9*********0816d5ac6b20
# 輸出配置
OUTPUT_DIR=output

創建url_list.txt

https://mp.weixin.qq.com/s/NH4Odi-xT_hlmZdGe0dw6Q

創建wechat_crawler.py

import os
from typing import Dict, Any, List
from firecrawl import FirecrawlApp
from dotenv import load_dotenv
import logging
import re# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)# 加載.env文件
load_dotenv()class WeChatCrawler:def __init__(self, api_key: str = None):"""初始化微信公眾號爬蟲Args:api_key: Firecrawl API密鑰"""self.api_key = api_key or os.getenv('FIRECRAWL_API_KEY')if not self.api_key:raise ValueError("請提供Firecrawl API密鑰")self.app = FirecrawlApp(api_key=self.api_key)self.output_dir = os.getenv('OUTPUT_DIR', 'output')# 創建輸出目錄if not os.path.exists(self.output_dir):os.makedirs(self.output_dir)def read_urls_from_file(self, file_path: str = 'url_list.txt') -> List[str]:"""從文件中讀取URL列表Args:file_path: URL列表文件路徑Returns:List[str]: URL列表"""urls = []try:with open(file_path, 'r', encoding='utf-8') as file:for line in file:url = line.strip()if url and url.startswith('http'):  # 確保是有效的URLurls.append(url)logger.info(f"從 {file_path} 讀取到 {len(urls)} 個URL")except FileNotFoundError:logger.error(f"文件 {file_path} 不存在")except Exception as e:logger.error(f"讀取文件時出錯: {e}")return urlsdef scrape_url(self, url: str) -> Dict[str, Any]:"""爬取單個URL的文章內容Args:url: 要爬取的URLReturns:Dict: 爬取結果"""try:logger.info(f"開始爬取: {url}")# 使用Firecrawl爬取URLresult = self.app.scrape_url(url, formats=['markdown', 'html'])logger.info(f"成功爬取: {url}")return resultexcept Exception as e:logger.error(f"爬取 {url} 時出錯: {e}")return {'error': str(e)}def save_markdown(self, content: str, filename: str) -> None:"""保存Markdown內容到文件Args:content: Markdown內容filename: 文件名"""try:file_path = os.path.join(self.output_dir, filename)with open(file_path, 'w', encoding='utf-8') as file:file.write(content)logger.info(f"成功保存: {file_path}")except Exception as e:logger.error(f"保存文件 {filename} 時出錯: {e}")def generate_filename(self, url: str) -> str:"""根據URL生成文件名Args:url: URLReturns:str: 生成的文件名"""try:# 嘗試從微信URL中提取標識符# 微信公眾號文章URL格式: https://mp.weixin.qq.com/s/標識符match = re.search(r'/s/([A-Za-z0-9_-]+)', url)if match:identifier = match.group(1)return f"wechat_article_{identifier}.md"else:# 如果解析失敗,使用時間戳import timetimestamp = int(time.time())return f"wechat_article_{timestamp}.md"except:# 如果解析失敗,使用時間戳import timetimestamp = int(time.time())return f"wechat_article_{timestamp}.md"def crawl_all_urls(self) -> None:"""爬取所有URL并保存為Markdown文件"""urls = self.read_urls_from_file()if not urls:logger.warning("沒有找到要爬取的URL")returnlogger.info(f"開始爬取 {len(urls)} 個URL")for i, url in enumerate(urls, 1):logger.info(f"正在處理第 {i}/{len(urls)} 個URL")result = self.scrape_url(url)# 檢查返回結果中是否包含markdown內容# 處理可能的超時或其他錯誤try:# 檢查是否有錯誤if hasattr(result, 'error') and result.error:logger.error(f"爬取 {url} 出錯: {result.error}")continue# 檢查是否有markdown內容if hasattr(result, 'markdown') and result.markdown:filename = self.generate_filename(url)self.save_markdown(result.markdown, filename)else:# 嘗試轉換為字典result_dict = result.dict() if hasattr(result, 'dict') else resultif isinstance(result_dict, dict) and 'markdown' in result_dict and result_dict['markdown']:filename = self.generate_filename(url)self.save_markdown(result_dict['markdown'], filename)else:logger.error(f"無法獲取 {url} 的Markdown內容")except Exception as e:logger.error(f"處理 {url} 的結果時出錯: {e}")if __name__ == "__main__":try:# 創建爬蟲實例crawler = WeChatCrawler()# 爬取所有URLcrawler.crawl_all_urls()print("所有文章爬取完成!")except Exception as e:logger.error(f"程序執行出錯: {e}")print(f"程序執行出錯: {e}")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93101.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IoT/透過oc_lwm2m/boudica150 源碼中的AT指令序列,分析NB-IoT接入華為云物聯網平臺IoTDA的工作機制

文章目錄概述指令調用順序具體接入指令分析ATE0 關閉回顯ATQREGSWT 設置(平臺)注冊模式ATQLWSREGIND0 手動注冊平臺set_autoconnect / ATNCONFIGATNBANDx,xset_plmn / ATCOPS_set_apn / ATCGDCONT(安全)接入參數 CDPDTLSPSKATNNMI 設置新消息指示_check_…

Android UI(一)登錄注冊 - Compose

UI - 登錄注冊 - Compose一、聲明式UI1. **顛覆傳統開發模式**2. **技術優勢**3. **開發效率提升**4. **未來生態方向**5. **實際影響**二、創建項目1. Compose UI結構2. Scaffold3. 可組合函數三、創建組件頁面1. LoginPage2. RegisterPage3. MainPage四、導航1. 添加依賴2. 使…

分享10個ai生成ppt網站(附ai生成ppt入口)

實測對比:15頁PPT從3小時壓縮到3分鐘的秘密武器 當ChatGPT能寫方案、Midjourney能畫圖,做PPT還在手動排版就OUT了!這些AI生成PPT網站已實現「輸入文案秒出設計稿」,無論職場匯報、畢業答辯還是路演融資,零設計基礎也能…

最強開源視頻模型通義萬相wan2.1在comfyui中的安裝應用詳解

摘要:阿里巴巴開源通義萬相Wan2.1模型,支持文生視頻、圖生視頻等多種功能,并整合關鍵環節簡化創作流程。官方和Kiji版本需配套使用各自工作流。低顯存顯卡可使用GGUF模型解決方案,最低適配4G顯存。ComfyUI已原生支持該模型&#x…

機器學習:基于OpenCV和Python的智能圖像處理 實戰

機器學習:基于OpenCV和Python的智能圖像處理實戰——待填坑圖像處理基礎圖像的基本表示方法圖像處理的基本操作圖像運算圖像的色彩空間轉換圖像幾何變換4.1 仿射變換4.2 重映射4.3 投影變換 4.4 極坐標變換5 圖像直方圖處理7 圖像閾值處理8 圖像形態學處理github地址…

proteus實現簡易DS18B20溫度計(stm32)

一、新建proteus工程 具體看前面文章 二、搭建電路 需要配置供電網絡以及尋找元器件,細節看前面文章,下面給出電路圖 電路包含了五個部分: 1、DS18B20:數據引腳記得上拉 2、stm32電路 3、串口電路(右下角那個器件…

Autoppt-AI驅動的演示文稿生成工具

本文轉載自:Autoppt-AI驅動的演示文稿生成工具 - Hello123工具導航 ** 一、 Autoppt:AI 驅動的智能演示文稿生成工具 Autoppt 是一款基于人工智能的在線演示文稿生成平臺,通過輸入主題或上傳文檔(Word/PDF/ 圖片等)&…

Flink on YARN啟動全流程深度解析

Flink on YARN 模式啟動流程及核心組件協作詳解整個過程分為三個主要階段:??JobManager 啟動??(作業提交與 AM 初始化)??TaskManager 資源分配與啟動????任務部署與執行??第一階段:作業提交與 JobManager (AM) 啟動?…

安卓開發者自學鴻蒙開發1基礎入門

1.基礎 聲明式UI:?? ??核心:?? 你??聲明??你想要UI是什么樣子(在build()方法里描述),而不是一步步命令式地創建和操作View對象(findViewById, setText, setOnClickListener)。 模塊化…

彈性擴展新范式:分布式LLM計算的FastMCP解決方案

本文較長,建議點贊收藏,以免遺失。更多AI大模型應用開發學習視頻及資料,盡在聚客AI學院。如果你想系統學習AI大模型應用開發,挑戰AI高薪崗位,可在文章底部聯系。在現代大語言模型(LLM)應用架構中…

springboot項目不同平臺項目通過http接口AES加密傳輸

前言: 在公司協作開發的過程中,自己的項目是公共調用平臺,也可以說是中轉平臺,供公司其他團隊的項目進行接口調用。因為是不同團隊項目之間的相互調用,所以不能通過openFeign遠程調用。只能通過http遠程調用&#xff…

推薦5個網頁模板資源網

1. 企業模板官方網站: http://www.qimoban.com介紹:企業模板(qimoban.com )是一個專注于提供豐富多樣的企業模板的優質平臺,致力于為企業和個人打造高效、專業、個性化的模板獲取渠道。該平臺提供海量的企業模板資源,涵蓋企業官網…

Redis持久化機制(RDB AOF)

1. RDB RDB 持久化是把當前進程數據生成快照保存到硬盤的過程,觸發 RDB 持久化過程分為手動觸發和 自動觸發,存儲的是二進制數據。 1.1 手動觸發 使用 save 和 bgsave 命令觸發: save:Redis服務主進程阻塞式執行持久化操作&…

【css】讓瀏覽器支持小于12px的文字

【css】讓瀏覽器支持小于12px的文字.demo {display: inline-block;/** 使用Webkit引擎的變換屬性(主要針對舊版Safari/Chrome) **/-webkit-transform: scale(0.8); }注意:display: inline-block; 一定要加上!1.transform: scale(…

機器學習-基礎入門:從概念到核心方法論

在人工智能飛速發展的今天,機器學習作為其核心技術,正深刻改變著我們的生活與工作。從 AlphaGo 戰勝圍棋世界冠軍,到日常的智能推薦、人臉識別,機器學習的應用無處不在。本文將從基礎概念出發,帶你系統了解機器學習的核…

《Leetcode》-面試題-hot100-動態規劃

題目列表 70. 爬樓梯 簡單難度 leetcode鏈接 118. 楊輝三角 簡單難度 leetcode鏈接 198. 打家劫舍 中等難度 leetcode鏈接 279.完全平方數 中等難度 leetcode鏈接 322.零錢兌換 中等難度 leetcode鏈接 139.單詞拆分 中等難度 leetcode鏈接 300.最長遞增子序列 中等難度 l…

數巔中標中建科技AI知識庫項目,開啟建筑業數智化新篇章

AI正以前所未有的迅猛態勢滲透進建筑業的每一處脈絡。在這場數智化轉型浪潮中,AI技術如何與建筑業基因深度融合?如何充分釋放數據價值?近日,數巔成功中標中建科技集團有限公司“企業AI知識庫研發”項目,這一“大語言模…

想要PDF翻譯保留格式?用對工具是關鍵

嘿,朋友!最近有沒有被PDF翻譯的事兒搞得焦頭爛額呀?尤其是碰到韓文PDF文件的時候,是不是更頭疼了?別擔心,我最近也遇到了類似的問題,試了不少軟件,發現有五款軟件在處理韓文PDF翻譯時…

【MySQL?】服務器安裝 MySQL 及配置相關操作

1. 安裝 MySQL 在安裝 MySQL 時,如果使用官方 RPM 源,會遇到 GPG 密鑰驗證失敗的錯誤,可以按照以下步驟解決: 解決 GPG 密鑰驗證失敗的問題下載 MySQL 官方 GPG 密鑰 使用以下命令下載并安裝 MySQL 的官方 GPG 密鑰: w…

大數據量返回方案(非分頁)

一、普通方式返回100萬條數據RestController RequestMapping("/bad") public class BadController {Autowiredprivate UserRepository userRepository;/*** 危險&#xff01;一次性加載 100 萬條到內存*/GetMapping("/all-users")public List<User> …