今天整理资料,惊奇发现去年7月份参加GDG的“七周七语言”活动时候,写的一个Go语言程序的。程序很简单,主要是访问一个博客网站,下载并保存网页,具体要求请见
http://be001.com/jams/110
先上程序:
package main
import (
"fmt"
"os"
"log"
"net/http"
"io/ioutil"
"bytes"
"encoding/base64"
"path"
"strings"
"regexp"
)
const (
BASEURL = "http://blog.csdn.net/xushiweizh"
PATTERN = "href=\"([^<\"]+)\""
INDEX = len(BASEURL)
ROOT = "C:/docs/GoCode/disk/"
)
func getContent(url string) string{
resp,err := http.Get(url)
if err != nil{
//handle error
log.Fatal(err)
}
defer resp.Body.Close()
body,err := ioutil.ReadAll(resp.Body)
return string(body)
}
func base64Encoding(s string)string{
var buf bytes.Buffer
encoder := base64.NewEncoder(base64.StdEncoding, &buf)
defer encoder.Close()
encoder.Write([]byte(s))
return buf.String()
}
func saveFile(content,filename string)error{
base64Name := base64Encoding(filename)
if base64Name == "" {
return nil
}
fout,err := os.Create(path.Join(ROOT,base64Name))
defer fout.Close()
if err != nil{
//handler error
log.Fatal(err)
return err
}
for _,line := range strings.Split(content,"\r\n"){
fout.WriteString(line + "\r\n")
}
return nil
}
func save(url string,links map[string]bool){
content := getContent(url)
err := saveFile(content,url[INDEX:])
if err != nil{
log.Fatal(err)
}
links[url]=true
}
func traverse(regxp *regexp.Regexp, url string, links map[string]bool){
LAST := strings.LastIndex(BASEURL,"/")
for _, scan := range regxp.FindAllStringSubmatch(getContent(BASEURL),-1){
var url string
if strings.Contains(scan[1],"http://"){
if strings.Contains(scan[1],BASEURL){
url = scan[1]
}else{
continue
}
}else{
if strings.Contains(scan[1],BASEURL[LAST:]){
url = BASEURL[:LAST]+scan[1]
}else{
continue
}
}
if v,ok := links[url];ok{
if v == true {
fmt.Println("Has download")
}else{
save(url,links)
}
}else{
save(url,links)
}
}
}
func main(){
links := make(map[string] bool)
regxp,err := regexp.Compile(PATTERN)
if err != nil{
log.Fatal(err)
}
traverse(regxp,BASEURL,links)
for key,val := range links{
if !val{
traverse(regxp,key,links)
}
}
}
分享到:
相关推荐
如何实现一个爬虫系统或则简单的小脚本?一般是定义一个入口页面,然后一个页面会有其他页面...golang由于其编译速度很快,而且对并发(goroutine)的天然支持,配合chan的协程处理,可以很好地实现一个稳定高效的爬虫系统.
go语言爬虫,git上大神写的代码,分享供大家学习一下。
golang爬虫源码,支持图片列表以及单页面图片爬取,对于初学者有参考意义。该版本支持采集列表规则,页码{{n}}为变量 如:《https://www.58pic.com/collect/fav-{{n}}.html》 其中n为页码,起始页码一般默认为1 ####...
google资深工程师深度讲解Go语言的并发版的爬虫源码实现
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...
此代码为 Google资深工程师深度讲解Go语言的单任务版爬虫源码
go语言链接爬虫 go语言链接爬虫 go语言链接爬虫 go语言链接爬虫 go语言链接爬虫
非常难得的关于Golang开发的高级实战课程,之前已经发布了非常多的Go语言基础学习教程,本次的课程是关于实战应用篇的技术教学。课程内容分为两个大的部分,第一部分就是非常重要的第一次关于GO语言的爬虫开发实战...
主要面向有一定基础Go编程的开发人员,Go语言编程由浅入深进行讲解、演练。希望和大家一起学习,一起分项。
Go语言编写单机版,并发版,分布式版网络爬虫
此项目是微信公众号批量自动化爬虫的核心实现, 面向开发者开源, 可以当做go语言包引入到自己项目中, 完整产品必须二次开发实现,QQ交流群: 563954381 微信的防作弊一直在不断更新完善,过于频繁的抓取可能导致微信...
golang爬虫库
百度云爬虫
GO 语言编写的websocket实例,非常简单实用,很好地说明了websoket在go语言中的应用
一个golang实现的轻量级爬虫包,只提供了爬虫最核心的调度功能,所以整体实现非常精简,使用也非常简单并且易于上手
golang爬虫将爬取的数据存入mongodb
go语言单并发版爬虫--crawler-v1-v4 crawler-v1-v4 资源中包含一个完成的go语言并发...更多详细信息参考笔者博文: [golang笔记16--go语言并发版爬虫](https://blog.csdn.net/u011127242/article/details/114161224)
相关文章:https://blog.csdn.net/superwebmaster/article/details/80319502
Golang爬虫 爬取豆瓣电影Top250
此代码为跟着Google资深工程师讲解Go语言单任务版爬虫的获取城市列表和url的代码