【问题标题】:Extract URLs from Google search result page从 Google 搜索结果页面中提取 URL
【发布时间】:2016-08-23 20:31:37
【问题描述】:

我正在尝试从 Google 搜索页面中获取所有 URL,我认为有两种方法可以做到,但我真的不知道该怎么做。

首先,我可以简单地从.r 标记中抓取它们并获取每个链接的href 属性。但是,这给了我一个很长的字符串,我必须解析它才能获取 URL。以下是必须解析的示例:

https://www.google.com/search?sourceid=chrome-psyapi2&ion=1&espv=2&ie=UTF-8&q=mh4u%20items&oq=mh4u%20items&aqs=chrome.0.0l2j69i59j69i60j0l2.1754j0j7/url?q=https://youknowumsayin.wordpress.com/2015/03/16/the-inventory-and-you-what-items-should-i-bring-mh4u/&sa=U&ei=n8NvVdSvBMOsyATSzYKoCQ&ved=0CEUQFjAL&usg=AFQjCNGyD5NjsqOncyLElJt9C0hqVQ7gyA

我想要的网址是:

https://youknowumsayin.wordpress.com/2015/03/16/the-inventory-and-you-what-items-should-i-bring-mh4u/

所以我必须在 https&sa 之间创建一个字符串,我不能 100% 确定该怎么做,因为 Google 给我的每个非常长的字符串都是不同的大小,所以只需使用切片并切割它最多“x”个字符不起作用。

第二,在 Google 搜索中的每个链接下方都有绿色文本的 URL。右键单击它并检查元素给出:cite class="_Rm"(在 V 形符号之间),我不知道如何使用 goquery 找到它,因为用我的小函数查找 cite 只会给我更多长字符串。

这是我的小功能,它目前在没有解析的情况下执行第一个选项,并给我一长串文本,只需要我到搜索页面:

func GetUrls(url string) {

    doc, err := goquery.NewDocument(url)

    if err != nil {
        panic(err)
    }

    doc.Find(".r").Each(func(i int, s *goquery.Selection) {

        doc.Find(".r a").Each(func(i int, s *goquery.Selection) {
            Link, _ := s.Attr("href")
            Link = url + Link
            fmt.Printf("link is [%s]\n", Link)
        })

    })

}

【问题讨论】:

    标签: html go screen-scraping


    【解决方案1】:

    标准库支持解析 URL。查看net/url 包。使用这个包,我们可以从 URL 中获取查询参数。

    请注意,您的原始原始网址包含您要在"aqs" 参数中提取的网址,格式为

    chrome.0.0l2j69i59j69i60j0l2.1754j0j7/url?q=https://youknowumsayin.wordpress.com/2015/03/16/the-inventory-and-you-what-items-should-i-bring-mh4u/
    

    这基本上是另一个 URL。

    让我们编写一个从原始 URL 文本中获取参数的小辅助函数:

    func getParam(raw, param string) (string, error) {
        u, err := url.Parse(raw)
        if err != nil {
            return "", err
        }
    
        q := u.Query()
        if q == nil {
            return "", fmt.Errorf("No query part")
        }
    
        v := q.Get(param)
        if v == "" {
            return "", fmt.Errorf("Param not found")
        }
        return v, nil
    }
    

    使用它我们可以从原始 URL 中获取 "aqs" 参数,再次使用它我们可以获取 "q" 参数,这正是您想要的 URL:

    raw := "https://www.google.com/search?sourceid=chrome-psyapi2&ion=1&espv=2&ie=UTF-8&q=mh4u%20items&oq=mh4u%20items&aqs=chrome.0.0l2j69i59j69i60j0l2.1754j0j7/url?q=https://youknowumsayin.wordpress.com/2015/03/16/the-inventory-and-you-what-items-should-i-bring-mh4u/&sa=U&ei=n8NvVdSvBMOsyATSzYKoCQ&ved=0CEUQFjAL&usg=AFQjCNGyD5NjsqOncyLElJt9C0hqVQ7gyA"
    aqs, err := getParam(raw, "aqs")
    if err != nil {
        panic(err)
    }
    fmt.Println(aqs)
    
    result, err := getParam(aqs, "q")
    fmt.Println(result)
    

    输出(在Go Playground上试试):

    chrome.0.0l2j69i59j69i60j0l2.1754j0j7/url?q=https://youknowumsayin.wordpress.com/2015/03/16/the-inventory-and-you-what-items-should-i-bring-mh4u/
    https://youknowumsayin.wordpress.com/2015/03/16/the-inventory-and-you-what-items-should-i-bring-mh4u/
    

    【讨论】:

    • 哇,这真的很有趣,我从来没有想过这样做。非常感谢!我会玩弄这个以确保我 100% 理解它
    • 我以为你的意思是“从谷歌搜索页面 html 中抓取 url”:p 哦,好吧
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2020-03-19
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多