20個群都來問我的AI早報,是這麼做的。

我自己的AI群裡,一直有一個傳統,就是每天早上,都會發一個AI早報,讓群友瞭解昨天AI圈發生了一些什麼大事。

就是這個東西。

從去年到今天,總有群友在問我每天的AI早報是咋做的。

其實吧,在國慶之前呢,都是5群的一個朋友@日不落太陽做的,他每天早上會發到5群裡,我每天只是負責轉發= =

那時候吧,其實也想著,不能總是依賴別人,這種東西最好還是自己做一個,不能老是麻煩別人。

但是吧,我自己本身就很忙,一來二去,就一直拖拖拖。

然後問題開始在時間的不確定性。有時早上9點就能收到早報,有時卻要等到11點之後,早報直接變午報了。群友們的催促聲此起彼伏,我只能尷尬地重覆著等等= =

壓倒我的最後一根稻草是國慶假期。那個早晨,我如往常一樣等待日報,卻遲遲未收到。

然後聯繫那位朋友才知道,他去旅遊了,時差都快干鏡像了,實在是無暇顧及早報。

所以,那天之後,我痛定思痛,決定還是自己來造一個吧。

既然自己做,那肯定不能天天自己手動整理,那也太der了,必定是先抓取各種各樣的數據源,然後全自動化的用AI總結。最後人轉到群裡。

之所以用人不用那種微信機器人,是我怕封號+炸群。

說干就干,我順藤摸瓜,反向搜索@日不落太陽最後發的內容,並找到儘可能早的信息來源。

然後就找到了一個AIBase.com,信息還挺全的。

仔細觀察後發現,這個網站的頁面結構很規律,新聞鏈接都是按數字遞增的。

這也太適合抓取了。。。

但是這次我吸取了上次的教訓,之前有一期做快手AI短劇評論分析的時候,買了八爪魚的軟件會員,一個月400,然後就沒什麼用了,後面再用還得開會員,虧死我了。

這次,我就想直接搞個python代碼一勞永逸。

我對代碼可以說一竅不懂,直懂一點Html和css的基礎知識,所以為了搞掂這個項目,我先在網上隨手找了一個爬蟲代碼,交給ChatGPT,希望他能按我給的URL修改。

但是,當我滿懷期待地放到本地運行它時,就是一頓哐哐報錯。。

跟ChatGPT溝通了半天,也搞不定問題,真的愁死我了,還直接給我o1的次數干乾淨了。

還好當天晚上,天降神兵,我跟朋友簡單「抽水」了兩句後,他給我發了個神器。

Crawl4ai。

就是下面這個star增長像火箭一樣的項目。

網址在此:https://github.com/unclecode/crawl4ai

Crawl4ai大大簡化了使用抓取內容所需要配置的步驟。

只需要十幾行代碼就能跑起來一個最簡單的項目。

比如下面這個快速開始的示例。

安裝也很簡單。

只有一行代碼。

然後我把特定的一個信息源的文章詳情地址替換進去。

牛批起飛,直接能爬下來了。

但是數據展示很混亂,我們肯定希望標題是單獨一行,時間是單獨一行,內容是單獨一行,現在直接糊成一坨了。

我這次實在不想指望AI了,直接求助朋友了。

很快,他就幫我搞掂了。

代碼我貼在下面了。

import json

import asyncio

from crawl4ai import AsyncWebCrawler

from crawl4ai.extraction_strategy import JsonCssExtractionStrategy

asyncdefextract_ai_news_article():

    print(“\n— 使用 JsonCssExtractionStrategy 提取 AIbase 新聞文章數據 —“)

# 定義提取 schema

    schema = {

“name”: “AIbase News Article”,

“baseSelector”: “div.pb-32”,  # 主容器的 CSS 選擇器

“fields”: [

            {

“name”: “title”,

“selector”: “h1”,

“type”: “text”,

            },

            {

“name”: “publication_date”,

“selector”: “div.flex.flex-col > div.flex.flex-wrap > span:nth-child(6)”,

“type”: “text”,

            },

            {

“name”: “content”,

“selector”: “div.post-content”,

“type”: “text”,  

            },

        ],

    }

# 創建提取策略

    extraction_strategy = JsonCssExtractionStrategy(schema, verbose=True)

# 使用 AsyncWebCrawler 進行爬取

asyncwith AsyncWebCrawler(verbose=True) as crawler:

        result = await crawler.arun(

            url=“https://www.aibase.com/zh/news/12386”,  # 替換為實際的目標 URL

            extraction_strategy=extraction_strategy,

            bypass_cache=True,  # 忽略緩存,確保獲取最新內容

        )

ifnot result.success:

            print(“頁面爬取失敗”)

return

# 解析提取的內容

        extracted_data = json.loads(result.extracted_content)

        print(f”成功提取 {len(extracted_data)} 條記錄”)

        print(json.dumps(extracted_data, indent=2, ensure_ascii=False))

return extracted_data

# 運行異步函數

if __name__ == “__main__”:

    asyncio.run(extract_ai_news_article())

直接跑一波,就可以獲得一篇文章的全文內容了。

效果很好,只有一處小bug。

閱讀時間和發佈時間沒有正確顯示。

不好意思再麻煩朋友了,我直接把整個網站的Html代碼和這段抓取的代碼,同時扔給了OpenAI o1,在思考了5秒後,他成功解決了這個錯誤。

刪去一些用不到的內容,下圖就是最後的輸出效果啦。

有標題,有時間,有內容。非常全面。

爬下來的內容會保存成一個JSON文件。

因為這個還是單個文章的方法,再做一個循環,不斷地抓就行。大概做了一個流程圖,如果有錯勿噴,我是一個純代碼小白。。。

接下來,終於到了我自己能解決的範圍里了,就是用AI,來總結這些抓取的內容。

因為每天都要輸出,大模型API還是挺重要的,需要便宜,不燒錢,而且畢竟就做個總結而已,我就選了智譜的GLM-4-Air的API,然後寫了一個prompt,讓模型自動把每條新聞概括成一句話。

這一步非常輕鬆,一個命令行版的AI日報工具就誕生了。

一般是每天早上8點左右會自動跑一遍程序,來找昨天早上8點到今天早上8點的所有新聞。

每次運行,它就會自動爬取最新新聞,用AI生成概要,然後在命令行里輸出結果。

我只需要複製到記事本里稍作排版,一份日報就大功告成了。

看著源源不斷湧現的新聞數據,我有種熱淚盈眶的感覺。

終於自己把這個小玩意幹出來了,可以自己每天跑早報,然後發給群友了。。。

但我很快意識到,這隻是開始。

因為每天這新聞也太特麼多了。。。

我自己篩選一遍,都特麼腦殼大。

然後壞消息總是一起到來,我的「得力助手」AIBase突然沒來由的,直接停更了。

行吧。。。

只能又重新找源了。

又找了一段時間,總算是讓我找到了一個更新速度飛快的科技新聞網站TechCrunch。

https://techcrunch.com/

然後防止他倆都不可靠,我又找了幾個其他的網站,來擴充我的數據源,甚至還花了2000多大洋買了個The Information和華爾街日報。

現在已經有了5個穩定的英文科技網站和3個中文AI資訊站作為背後的信息源,誰抽風一下,我也不慌了。

每天早上,我只需要打開電腦,運行一下腳本,新鮮出爐的AI新聞就會呈現在我面前。

然而,面對著黑乎乎的命令行界面,我總覺得少了點什麼。而且,每次都要人工手動複製到記事本編輯整理,那也太蠢了。

所以,重拾UI老本行,給它加個簡單的UI頁面吧,命令行界面,我實在扛不住。

我又開始了新一輪的折騰。

首先,我實現了每隔幾小時自動爬取一次新聞,並在網頁上顯示獲取到的內容。這下不用我盯著電腦看了,它會自動更新。

但是呢,雖然新聞自動更新了,我還是得手動複製到記事本里編輯。

於是為了把懶逼精神貫徹到底,我又加了個文本框,可以直接在網頁上編輯內容複製黏貼了。

可用著用著,我又覺得這個交互邏輯不夠順暢。

因為這還是得我自己複製再黏貼到這個網頁的文本框里,還是麻煩。

於是,想了一會,我又把概要做成了一個列表,每條新聞都有個複選框,我可以勾選最新最有趣的內容。它就會自動出現在右邊的預覽框里,可以實時預覽選中的內容。

然後再把編輯的文本框放在下面,根據勾選的內容自動加上日期和序號,再搞個一鍵複製按鈕,完成全傻瓜式AI早報製作。

還順便做了些小更新。

比如,為了便捷快速的調順序,又加了個拖動排序功能。

這下可好,鼠標點點選選就能搞掂一期日報,再也不用擔心被群友們催更了。

而我的電腦呢,就像個盡職盡責的小助手,每小時都會準時去各大網站巡邏一圈,看看有什麼新鮮有趣的AI新聞。

醜是稍微醜了點,但是反正自己用,就這樣也沒事,懶得改了哈哈哈。

再比如,隨著時間推移,我的JSON文件越來越大,加載速度也越來越慢。

為了提升用戶體驗,現學現賣,學著把數據遷移到了數據庫,並且每次只加載最新的50條新聞。這下加載速度嗖嗖的,用起來更順暢了。

經過這段時間的折騰,總算是「人工智能」了。

也能穩定每天早上給群友產出一份AI早報了,目前穩定運行15天,基本上沒有出任何岔子。

所以也敢寫下這篇文章,算是一個小小的複盤和總結。

人嘛,總是要不斷折騰不斷嚐鮮的。

就像馬斯克說的那一句:

成功了,就是進步的一大步。

失敗了也無所謂。

那也會是,夜空中最璀璨的星光。