golang 使用 goquery 和通道进行爬取网页所有的子链接,但是跑一会就报错了

wmd_nb · 2022-04-22 11:52:30 · 2338 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-04-22 11:52:30 的主题,其中的信息可能已经有所发展或是发生改变。

代码如下

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"

    "github.com/PuerkitoBio/goquery"
)

func urllist(url string) ([]string, error) {
    var backurl []string
    resp, err := http.Get(url)
    if err != nil {
        return nil, err
    }
    if resp.StatusCode != http.StatusOK {
        resp.Body.Close()
        return nil, fmt.Errorf("getting %s: %s", url, resp.Status)
    }
    fmt.Println(url)
    dom, err := goquery.NewDocumentFromReader(resp.Body)
    if err != nil {
        return nil, err
    }
    dom.Find("a").Each(func(i int, selection *goquery.Selection) {
        href, true := selection.Attr("href")
        if true {
            link, _ := resp.Request.URL.Parse(href)
            backurl = append(backurl, link.String())
        }
    })
    return backurl, nil
}

func main() {
    firsturl := make(chan []string)
    uniqurl := make(chan string)
    go func() { firsturl <- os.Args[1:] }()

    for i := 0; i < 20; i++ {
        go func() {
            for link := range uniqurl {
                foundlink, err := urllist(link)
                if err != nil {
                    log.Print(err)
                }
                go func() { firsturl <- foundlink }()
            }
        }()
    }

    seen := make(map[string]bool)
    for list := range firsturl {
        for _, link := range list {
            if !seen[link] {
                seen[link] = true
                uniqurl <- link
            }
        }
    }
}

执行:go run pachong.go http://news.baidu.com

报错: goroutine 36 [running]: net/url.(*URL).String(0x0) /usr/local/Cellar/go/1.17/libexec/src/net/url/url.go:813 +0x40 main.urllist.func1(0xc00019e340, 0xc000660780) /Users/baby/Desktop/go/study/goroutine/goquery/pachong.go:31 +0x6b github.com/PuerkitoBio/goquery.(*Selection).Each(0xc001084270, 0xc00042ff28) /Users/baby/Library/go/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/iteration.go:10 +0x46 main.urllist({0xc0001c8b70, 0x1c}) /Users/baby/Desktop/go/study/goroutine/goquery/pachong.go:27 +0x15e main.main.func2() /Users/baby/Desktop/go/study/goroutine/goquery/pachong.go:45 +0x68 created by main.main /Users/baby/Desktop/go/study/goroutine/goquery/pachong.go:43 +0x9f exit status 2

求指点


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2338 次点击  
加入收藏 微博
2 回复  |  直到 2022-04-28 10:14:04
yikouyitian
yikouyitian · #1 · 3年之前

测试了一下,不考虑代码逻辑,感觉都是因为没有进行相应的判断出现了空指针赋值。微信截图_20220424162511.png 修改后我跑了一遍,再没出现错误退出

wmd_nb
wmd_nb · #2 · 3年之前
yikouyitianyikouyitian #1 回复

测试了一下,不考虑代码逻辑,感觉都是因为没有进行相应的判断出现了空指针赋值。![微信截图_20220424162511.png](https://static.golangjob.cn/220424/d9e4d84407e2ec7d32b0ef5ec3486db7.png) 修改后我跑了一遍,再没出现错误退出

666,我来试试

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传