【Go语言】golang 解析新闻URL获取新闻内容

今天介绍怎么通过Golang解析一个新闻的URL然后抓取新闻内容。
小小的尝试,基本实现了抓取新浪,搜狐、凤凰网、网易、腾讯和新华网这几大网站上的新闻。当然我用的办法是最笨的,就是获取网页所有内容然后想法子把新闻的内容抠出来。现在先上代码吧,代码比较全,注释也很多。

package main

import (

"fmt"

"github.com/axgle/mahonia"

"io/ioutil"

"log"

"net/http"

"strings"

)

//获取URL内容

func getBody(URL string) []byte {

res, err := http.Get(URL)

if err != nil {

log.Fatal(err)

}

robots, err := ioutil.ReadAll(res.Body)

res.Body.Close()

if err != nil {

log.Fatal(err)

}

return robots

}

//处理新闻

func processNews(URL string) {

body := getBody(URL)

sbody := fmt.Sprintf("%s", body)

//fmt.Println(sbody)

var content_slice []byte //内容切片

var mainContentBegin int //开始点

var mainContentEnd int //结束点

//判断URL来自哪里的新闻

if strings.Contains(URL, "xinhuanet") { //新华社新闻

mainContentBegin = strings.Index(sbody, `<div id="content">`) //开始

mainContentEnd = strings.Index(sbody, "<!--分享-->") //结束

content_slice = body[mainContentBegin : mainContentEnd-1] //切片出内容

} else if strings.Contains(URL, "ifeng.com") { //凤凰网新闻

mainContentBegin = strings.Index(sbody, "<!--mainContent begin-->")

mainContentEnd = strings.Index(sbody, "<!--mainContent end-->")

content_slice = body[mainContentBegin:mainContentEnd]

} else if strings.Contains(URL, "sina.com") { //新浪网新闻

encoding := mahonia.NewDecoder("gbk") //转码

body = []byte(encoding.ConvertString(sbody))

mainContentBegin = strings.Index(string(body), "publish_helper")

mainContentEnd = strings.Index(string(body), "publish_helper_end ")

content_slice = body[mainContentBegin:mainContentEnd]

} else if strings.Contains(URL, "qq.com") { //腾讯网新闻

encoding := mahonia.NewDecoder("gbk") //转码

body = []byte(encoding.ConvertString(sbody))

//fmt.Printf("%s", body)

mainContentBegin = strings.Index(string(body), `bossZone="content"`)

mainContentEnd = strings.Index(string(body), "正文已结束")

content_slice = body[mainContentBegin:mainContentEnd]

} else if strings.Contains(URL, "sohu.com") { //搜狐新闻

encoding := mahonia.NewDecoder("gbk")

body = []byte(encoding.ConvertString(sbody))

//fmt.Printf("%s", body)

mainContentBegin = strings.Index(string(body), `articleBody`)

mainContentEnd = strings.Index(string(body), `<!-- 分享 -->`)

content_slice = body[mainContentBegin:mainContentEnd]

} else if strings.Contains(URL, "163.com") { //网易新闻

encoding := mahonia.NewDecoder("gbk")

body = []byte(encoding.ConvertString(sbody))

//fmt.Printf("%s", body)

mainContentBegin = strings.Index(string(body), `<div id="endText">`)

mainContentEnd = strings.Index(string(body), `<!-- 分页 -->`)

content_slice = body[mainContentBegin:mainContentEnd]

}

//整理内容

processSlice(fmt.Sprintf("%s", content_slice))

}

//去除HTML标记

func processSlice(content string) {

//HTML标记数组

var count []int

//确定标记位置

for k, v := range content {

if string(v) == `<` || string(v) == `>` {

count = append(count, k)

}

}

//打印内容

for k, _ := range count {

//确定k范围

if k > 0 && k+1 < len(count) {

if k%2 == 1 {

//如果第一个是<

if string(content[count[0]]) == "<" {

fmt.Printf("%s", content[count[k]+1:count[k+1]])

} else { //如果第一个是>

fmt.Printf("%s", content[count[k-1]+1:count[k]])

}
}
}
}
}
//主函数

func main() {

//URL

var URL string = "写上URL"

//执行

processNews(URL)

}

整份代码注释很多,应该可以看懂。
使用的时候传入一个URL,限于新浪,搜狐、凤凰网、网易、腾讯和新华网这几个网站上的新闻网页,基本能够保证抓取新闻。我试了,凤凰网和新华网的比较严格,抓取成功率较高,而腾讯的是最没有规律的,会抓取到一些额外的东西。主要难点是对字符串的分析和处理上。我用的方法还不是很好,期待会有所改进。
附上图两张:


整体效果就这样了。

刘凯宁@C2P
20140804

Share

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*


*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>