从Google搜索结果页

时间:2015-06-04 05:02:06

标签: html go screen-scraping

我正试图从Google搜索页面抓取所有网址,我认为有两种方法可以做到,但我真的不知道如何做到这一点。

首先,我可以简单地从.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

我想要的URL是:

  

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

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

第二,在Google搜索的每个链接下方都有绿色文字的网址。右键单击并检查元素会给出: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)
        })

    })

}

1 个答案:

答案 0 :(得分: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文本中获取参数:

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
}

使用此功能,我们可以从原始网址获取"aqs"参数,并再次使用此参数,我们可以获得"q"参数,这是您所需的网址:

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/