手动添加的url返回的url不限制数量
This commit is contained in:
+26
-8
@@ -240,8 +240,8 @@ func (c *Crawler) runPriorityWorker() {
|
||||
|
||||
log.Printf("[crawler] priority crawl started: %s", rawURL)
|
||||
|
||||
// 直接调用 visitURL,绕过队列调度
|
||||
hrefs := c.visitURL(rawURL)
|
||||
// 直接调用 visitURLUnlimited,绕过队列调度和链接数限制
|
||||
hrefs := c.visitURLUnlimited(rawURL)
|
||||
|
||||
// 将子链接加入优先队列(保持优先级)
|
||||
if len(hrefs) > 0 {
|
||||
@@ -436,15 +436,15 @@ func (c *Crawler) Run(entryURL string, maxEpoch int) {
|
||||
}
|
||||
}
|
||||
|
||||
// visitURL 抓取一个 URL,提取关键词、缓存摘要、更新网站元信息,返回页面中发现的子链接。
|
||||
func (c *Crawler) visitURL(rawURL string) (hrefs []string) {
|
||||
// visitURLRaw 抓取 URL 的核心逻辑,提取标题、描述、正文、子链接。
|
||||
// 不包含链接数限制,用于优先级爬取。
|
||||
func (c *Crawler) visitURLRaw(rawURL string) (title, desc, text string, hrefs []string) {
|
||||
// recover 保护:防止任何模块(analyzer/storage/parser)的 panic 杀死 goroutine
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Printf("[crawler] visitURL panic recovered: url=%s error=%v", rawURL, r)
|
||||
}
|
||||
}()
|
||||
atomic.AddInt64(&c.stats.VisitedURLs, 1) // 计数器 +1
|
||||
|
||||
// 使用 sync.WaitGroup + select 实现硬超时包装器,
|
||||
// 确保即使 http.Client.Timout 被某些底层操作忽略,goroutine 也不会永久阻塞。
|
||||
@@ -478,7 +478,7 @@ func (c *Crawler) visitURL(rawURL string) (hrefs []string) {
|
||||
atomic.AddInt64(&c.stats.SuccessURLs, 1) // 成功计数器 +1
|
||||
|
||||
// 解析 HTML:提取标题、描述、正文和所有超链接
|
||||
title, desc, text, hrefs := parser.ParseHTML(res.Body, res.FinalURL)
|
||||
title, desc, text, hrefs = parser.ParseHTML(res.Body, res.FinalURL)
|
||||
|
||||
// 计算正文内容哈希(FNV-1a),用于增量重爬检测
|
||||
contentHash := fnvHash(text)
|
||||
@@ -539,13 +539,31 @@ func (c *Crawler) visitURL(rawURL string) (hrefs []string) {
|
||||
})
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// visitURL 抓取一个 URL,提取关键词、缓存摘要、更新网站元信息,返回页面中发现的子链接。
|
||||
// 限制返回的链接数,防止下一轮队列爆炸。
|
||||
func (c *Crawler) visitURL(rawURL string) (hrefs []string) {
|
||||
atomic.AddInt64(&c.stats.VisitedURLs, 1) // 计数器 +1
|
||||
_, _, _, hrefs = c.visitURLRaw(rawURL)
|
||||
|
||||
// 限制返回的链接数,防止下一轮队列爆炸
|
||||
if len(hrefs) > 100 {
|
||||
hrefs = sampleStrings(hrefs, 100)
|
||||
maxLinks := config.MaxPriorityChildren()
|
||||
if maxLinks > 0 && len(hrefs) > maxLinks {
|
||||
hrefs = sampleStrings(hrefs, maxLinks)
|
||||
}
|
||||
return hrefs
|
||||
}
|
||||
|
||||
// visitURLUnlimited 抓取一个 URL,返回页面中发现的子链接(无链接数限制)。
|
||||
// 用于手动添加的 Priority URL,保留全部子链接。
|
||||
func (c *Crawler) visitURLUnlimited(rawURL string) (hrefs []string) {
|
||||
atomic.AddInt64(&c.stats.VisitedURLs, 1) // 计数器 +1
|
||||
_, _, _, hrefs = c.visitURLRaw(rawURL)
|
||||
return hrefs
|
||||
}
|
||||
|
||||
// updateSiteFailure 当某 URL 抓取失败时,更新该网站的访问成功率(指数衰减)。
|
||||
func (c *Crawler) updateSiteFailure(rawURL string) {
|
||||
host := netloc(rawURL)
|
||||
|
||||
Reference in New Issue
Block a user