golang网页内容摘要提取插件goreadability的使用
golang网页内容摘要提取插件goreadability的使用
简介
goreadability是一个用于提取网页主要可读内容的工具。它是arc90’s readability项目的Go语言移植版,基于ruby-readability。
从v2.0版本开始,goreadability会优先使用opengraph标签值(如果存在)。您可以通过设置Option.LookupOpenGraphTags
为false
来禁用opengraph查找并遵循传统的readability规则。
安装
go get github.com/philipjkim/goreadability
使用示例
下面是一个完整的示例demo,展示如何使用goreadability提取网页内容:
package main
import (
"log"
"github.com/philipjkim/goreadability"
)
func main() {
// 要提取内容的URL(标题、描述、图片等)
url := "https://en.wikipedia.org/wiki/Lego"
// 创建默认选项
opt := readability.NewOption()
// 如果需要可以修改某些选项值
opt.ImageRequestTimeout = 3000 // 毫秒
// 提取网页内容
content, err := readability.Extract(url, opt)
if err != nil {
log.Fatal(err)
}
// 输出提取的内容
log.Println(content.Title) // 网页标题
log.Println(content.Description) // 网页描述
log.Println(content.Images) // 网页中的图片
}
测试
要运行测试,可以使用以下命令:
go test
# 或者如果你想查看详细日志:
DEBUG=true go test -v
命令行工具
(目前尚未实现)
相关项目
- ruby-readability 是本项目的基础
- fastimage 通过获取尽可能少的数据来查找远程图像的类型和/或大小
潜在问题
(目前尚未记录)
许可证
MIT许可证
更多关于golang网页内容摘要提取插件goreadability的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang网页内容摘要提取插件goreadability的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用goreadability提取网页内容摘要
goreadability是一个Go语言实现的网页内容提取库,类似于Python的readability-lxml,它可以从网页中提取主要内容并去除无关的广告、导航等元素。
安装goreadability
go get github.com/RadhiFadlillah/go-readability
基本使用方法
package main
import (
"fmt"
"log"
"net/http"
"time"
"github.com/RadhiFadlillah/go-readability"
)
func main() {
// 目标URL
url := "https://example.com/article"
// 创建HTTP客户端
client := &http.Client{Timeout: 30 * time.Second}
// 获取网页内容
resp, err := client.Get(url)
if err != nil {
log.Fatalf("Failed to fetch URL: %v", err)
}
defer resp.Body.Close()
// 解析网页内容
article, err := readability.FromReader(resp.Body, url)
if err != nil {
log.Fatalf("Failed to parse article: %v", err)
}
// 输出提取的内容
fmt.Println("标题:", article.Title)
fmt.Println("作者:", article.Byline)
fmt.Println("内容长度:", len(article.TextContent))
fmt.Println("主要内容:")
fmt.Println(article.TextContent)
}
高级功能
1. 自定义解析选项
// 创建自定义解析器
parser := readability.Parser{
MaxContentLength: 100000, // 最大内容长度
MinTextLength: 100, // 最小文本长度
RemoveUnlikely: true, // 移除不太可能是内容的元素
}
// 使用自定义解析器
article, err := parser.Parse(resp.Body, url)
2. 处理重定向
client := &http.Client{
Timeout: 30 * time.Second,
CheckRedirect: func(req *http.Request, via []*http.Request) error {
// 记录重定向
fmt.Println("Redirected to:", req.URL)
return nil
},
}
3. 错误处理增强
article, err := readability.FromReader(resp.Body, url)
if err != nil {
switch err {
case readability.ErrParseFailed:
fmt.Println("解析失败,可能是非文章页面")
case readability.ErrNoContent:
fmt.Println("没有找到有效内容")
default:
fmt.Println("未知错误:", err)
}
return
}
实际应用示例
下面是一个完整的HTTP服务示例,提供网页内容摘要提取API:
package main
import (
"encoding/json"
"log"
"net/http"
"time"
"github.com/RadhiFadlillah/go-readability"
)
type SummaryResponse struct {
URL string `json:"url"`
Title string `json:"title"`
Author string `json:"author"`
Content string `json:"content"`
Length int `json:"length"`
Excerpt string `json:"excerpt"`
SiteName string `json:"site_name"`
}
func handleSummary(w http.ResponseWriter, r *http.Request) {
url := r.URL.Query().Get("url")
if url == "" {
http.Error(w, "URL parameter is required", http.StatusBadRequest)
return
}
// 获取网页内容
client := &http.Client{Timeout: 30 * time.Second}
resp, err := client.Get(url)
if err != nil {
http.Error(w, "Failed to fetch URL", http.StatusBadGateway)
return
}
defer resp.Body.Close()
// 解析内容
article, err := readability.FromReader(resp.Body, url)
if err != nil {
http.Error(w, "Failed to extract content", http.StatusInternalServerError)
return
}
// 准备响应
response := SummaryResponse{
URL: url,
Title: article.Title,
Author: article.Byline,
Content: article.TextContent,
Length: len(article.TextContent),
Excerpt: article.Excerpt,
SiteName: article.SiteName,
}
// 返回JSON响应
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(response)
}
func main() {
http.HandleFunc("/summary", handleSummary)
log.Println("Starting server on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
性能优化建议
- 缓存结果:对频繁请求的URL进行缓存
- 并发控制:使用worker pool限制并发解析数量
- 超时设置:为HTTP请求和解析过程设置合理的超时
- 用户代理:设置合理的User-Agent减少被屏蔽的概率
// 带缓存的解析函数
var cache = make(map[string]*readability.Article)
func getCachedArticle(url string) (*readability.Article, error) {
if article, ok := cache[url]; ok {
return article, nil
}
// 获取并解析内容
client := &http.Client{
Timeout: 30 * time.Second,
Transport: &http.Transport{
DisableKeepAlives: true,
},
}
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("User-Agent", "Mozilla/5.0 (compatible; MyBot/1.0)")
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
article, err := readability.FromReader(resp.Body, url)
if err != nil {
return nil, err
}
// 缓存结果
cache[url] = article
return article, nil
}
goreadability是一个简单但功能强大的库,适合需要从网页中提取主要内容的Go应用程序。通过合理配置和错误处理,可以构建出稳定可靠的网页内容摘要服务。