refactor(data):重构股票价格信息获取功能

- 更新 SearchStockPriceInfo 函数签名,增加 stockName 参数
- 优化股票价格信息的爬取逻辑,支持不同市场类型的股票
- 调整输出格式,增加股票名称和时间信息
- 添加日志记录,方便调试和监控
This commit is contained in:
ArvinLovegood 2025-04-02 09:24:24 +08:00
parent 5de74f220f
commit fdaa80777d
4 changed files with 20 additions and 14 deletions

View File

@ -199,7 +199,7 @@ func (o OpenAi) NewChatStream(stock, stockCode, userQuestion string, sysPromptId
go func() { go func() {
defer wg.Done() defer wg.Done()
messages := SearchStockPriceInfo(stockCode, o.CrawlTimeOut) messages := SearchStockPriceInfo(stock, stockCode, o.CrawlTimeOut)
if messages == nil || len(*messages) == 0 { if messages == nil || len(*messages) == 0 {
logger.SugaredLogger.Error("获取股票价格失败") logger.SugaredLogger.Error("获取股票价格失败")
//ch <- "***❗获取股票价格失败,分析结果可能不准确***<hr>" //ch <- "***❗获取股票价格失败,分析结果可能不准确***<hr>"
@ -223,6 +223,8 @@ func (o OpenAi) NewChatStream(stock, stockCode, userQuestion string, sysPromptId
"role": "assistant", "role": "assistant",
"content": "\n## " + stock + "股价数据:\n" + price, "content": "\n## " + stock + "股价数据:\n" + price,
}) })
logger.SugaredLogger.Infof("SearchStockPriceInfo stock:%s stockCode:%s", stock, stockCode)
logger.SugaredLogger.Infof("SearchStockPriceInfo assistant:%s", "\n## "+stock+"股价数据:\n"+price)
}() }()
go func() { go func() {

View File

@ -9,7 +9,7 @@ import (
func TestNewDeepSeekOpenAiConfig(t *testing.T) { func TestNewDeepSeekOpenAiConfig(t *testing.T) {
db.Init("../../data/stock.db") db.Init("../../data/stock.db")
ai := NewDeepSeekOpenAi(context.TODO()) ai := NewDeepSeekOpenAi(context.TODO())
res := ai.NewChatStream("上海贝岭", "sh600171", "上海贝岭分析和总结", nil) res := ai.NewChatStream("中信证券", "hk06030", "中信证券分析和总结", nil)
for { for {
select { select {
case msg := <-res: case msg := <-res:

View File

@ -768,7 +768,7 @@ func GetRealTimeStockPriceInfo(ctx context.Context, stockCode string) (price, pr
return price, priceTime return price, priceTime
} }
func SearchStockPriceInfo(stockCode string, crawlTimeOut int64) *[]string { func SearchStockPriceInfo(stockName, stockCode string, crawlTimeOut int64) *[]string {
if strutil.HasPrefixAny(stockCode, []string{"SZ", "SH", "sh", "sz", "bj"}) { if strutil.HasPrefixAny(stockCode, []string{"SZ", "SH", "sh", "sz", "bj"}) {
//if strutil.HasPrefixAny(stockCode, []string{"bj", "BJ"}) { //if strutil.HasPrefixAny(stockCode, []string{"bj", "BJ"}) {
@ -778,7 +778,7 @@ func SearchStockPriceInfo(stockCode string, crawlTimeOut int64) *[]string {
// }) + ".BJ" // }) + ".BJ"
//} //}
return getSHSZStockPriceInfo(stockCode, crawlTimeOut) return getSHSZStockPriceInfo(stockName, stockCode, crawlTimeOut)
} }
if strutil.HasPrefixAny(stockCode, []string{"HK", "hk"}) { if strutil.HasPrefixAny(stockCode, []string{"HK", "hk"}) {
return getHKStockPriceInfo(stockCode, crawlTimeOut) return getHKStockPriceInfo(stockCode, crawlTimeOut)
@ -838,6 +838,7 @@ func getUSStockPriceInfo(stockCode string, crawlTimeOut int64) *[]string {
messages = append(messages, text) messages = append(messages, text)
}) })
logger.SugaredLogger.Infof("messages: %s", messages)
return &messages return &messages
} }
@ -855,10 +856,12 @@ func getHKStockPriceInfo(stockCode string, crawlTimeOut int64) *[]string {
crawlerAPI = crawlerAPI.NewCrawler(ctx, crawlerBaseInfo) crawlerAPI = crawlerAPI.NewCrawler(ctx, crawlerBaseInfo)
url := fmt.Sprintf("https://stock.finance.sina.com.cn/hkstock/quotes/%s.html", strings.ReplaceAll(stockCode, "hk", "")) url := fmt.Sprintf("https://stock.finance.sina.com.cn/hkstock/quotes/%s.html", strings.ReplaceAll(stockCode, "hk", ""))
htmlContent, ok := crawlerAPI.GetHtml(url, ".deta_hqContainer >.deta03 ", true) logger.SugaredLogger.Infof("CrawlHKStockPriceInfo url:%s", url)
htmlContent, ok := crawlerAPI.GetHtml(url, "div.deta_hqContainer >.deta03>ul ", false)
if !ok { if !ok {
return &[]string{} return &[]string{}
} }
//logger.SugaredLogger.Infof("CrawlHKStockPriceInfo htmlContent:%s", htmlContent)
document, err := goquery.NewDocumentFromReader(strings.NewReader(htmlContent)) document, err := goquery.NewDocumentFromReader(strings.NewReader(htmlContent))
if err != nil { if err != nil {
logger.SugaredLogger.Error(err.Error()) logger.SugaredLogger.Error(err.Error())
@ -890,6 +893,7 @@ func getHKStockPriceInfo(stockCode string, crawlTimeOut int64) *[]string {
messages = append(messages, text) messages = append(messages, text)
}) })
logger.SugaredLogger.Infof("messages: %s", messages)
return &messages return &messages
} }
@ -919,12 +923,12 @@ func getZSInfo(name, stockCode string, crawlTimeOut int64) string {
hqTime := strutil.RemoveWhiteSpace(document.Find("div#hqTime").First().Text(), false) hqTime := strutil.RemoveWhiteSpace(document.Find("div#hqTime").First().Text(), false)
var markdown strings.Builder var markdown strings.Builder
markdown.WriteString(fmt.Sprintf("### %s%s 时间:%s\n", name, price, hqTime)) markdown.WriteString(fmt.Sprintf("### 时间:%s %s%s \n", hqTime, name, price))
GetTableMarkdown(document, "div#hqDetails table", &markdown) GetTableMarkdown(document, "div#hqDetails table", &markdown)
return markdown.String() return markdown.String()
} }
func getSHSZStockPriceInfo(stockCode string, crawlTimeOut int64) *[]string { func getSHSZStockPriceInfo(stockName, stockCode string, crawlTimeOut int64) *[]string {
url := "https://finance.sina.com.cn/realstock/company/" + stockCode + "/nc.shtml" url := "https://finance.sina.com.cn/realstock/company/" + stockCode + "/nc.shtml"
crawlerAPI := CrawlerApi{} crawlerAPI := CrawlerApi{}
crawlerBaseInfo := CrawlerBaseInfo{ crawlerBaseInfo := CrawlerBaseInfo{
@ -950,7 +954,7 @@ func getSHSZStockPriceInfo(stockCode string, crawlTimeOut int64) *[]string {
hqTime := strutil.RemoveWhiteSpace(document.Find("div#hqTime").First().Text(), false) hqTime := strutil.RemoveWhiteSpace(document.Find("div#hqTime").First().Text(), false)
var markdown strings.Builder var markdown strings.Builder
markdown.WriteString(fmt.Sprintf("### 当前股价:%s 时间:%s\n", price, hqTime)) markdown.WriteString(fmt.Sprintf("### %s现价%s 现价时间:%s\n", stockName, price, hqTime))
GetTableMarkdown(document, "div#hqDetails table", &markdown) GetTableMarkdown(document, "div#hqDetails table", &markdown)
return &[]string{markdown.String()} return &[]string{markdown.String()}
} }

View File

@ -47,13 +47,13 @@ func TestSearchStockInfoByCode(t *testing.T) {
func TestSearchStockPriceInfo(t *testing.T) { func TestSearchStockPriceInfo(t *testing.T) {
db.Init("../../data/stock.db") db.Init("../../data/stock.db")
//SearchStockPriceInfo("hk06030", 30) //SearchStockPriceInfo("中信证券", "hk06030", 30)
//SearchStockPriceInfo("sh600171", 30) //SearchStockPriceInfo("上海贝岭", "sh600171", 30)
//SearchStockPriceInfo("gb_aapl", 30) SearchStockPriceInfo("苹果公司", "gb_aapl", 30)
//SearchStockPriceInfo("bj430198", 30) //SearchStockPriceInfo("微创光电", "bj430198", 30)
getZSInfo("创业板指数", "sz399006", 30) getZSInfo("创业板指数", "sz399006", 30)
getZSInfo("上证综合指数", "sh000001", 30) //getZSInfo("上证综合指数", "sh000001", 30)
getZSInfo("沪深300指数", "sh000300", 30) //getZSInfo("沪深300指数", "sh000300", 30)
} }