http文件服务器客户端,go http服务器/客户端

 2023-09-13 阅读 38 评论 0

摘要:服务器端简单例子:package mainimport ("fmt""io"文件服务器和ftp服务器的区别、"log""net/http")// hello world, the web server// w: 给客户端回复数据, req: 读取客户端发送的数据func HelloServer(w http.ResponseWriter, req *h

服务器端简单例子:

package main

import (

"fmt"

"io"

文件服务器和ftp服务器的区别、"log"

"net/http"

)

// hello world, the web server

// w: 给客户端回复数据, req: 读取客户端发送的数据

func HelloServer(w http.ResponseWriter, req *http.Request) {

免费文件服务器。// 打印客户端头信息

fmt.Println(req.Method)

fmt.Println(req.Header)

fmt.Println(req.Body)

fmt.Println(req.URL)

// 给客户端回复数据

go服务器框架,io.WriteString(w, "hello, world!\n")

w.Write([]byte("lisa"))

}

func main() {

// 注册函数,用户连接, 自动调用指定处理函数

http.HandleFunc("/hello", HelloServer)

go web服务器?// 监听绑定

err := http.ListenAndServe(":12345", nil)

if err != nil {

log.Fatal("ListenAndServe: ", err)

}

}

架设个人文件服务器?客户端简单例子

package main

import (

"fmt"

"net/http"

)

基于go的轻量级文件服务器。func main() {

respon, err := http.Get("http://www.baidu.com")

if err != nil {

fmt.Println("http.get:", err)

return

}

web服务器和文件服务器怎样关联,// 关闭

defer respon.Body.Close()

fmt.Println("status:", respon.Status)

fmt.Println("header:", respon.Header)

fmt.Println("StatusCode:", respon.StatusCode)

//fmt.Println("body:", respon.Body)

服务器 客户端?//body是一个指针地址,需要读

var tmp string

buf := make([]byte, 1024*4)

for {

n, err := respon.Body.Read(buf)

if n == 0 {

ubuntu服务器做文件服务器、fmt.Println("Body.Read err:", err)

break

}

tmp += string(buf[:n])

}

fmt.Println("body:", tmp)

go语言搭建服务器、}

贴吧单线程爬取例子

package main

import (

"fmt"

"net/http"

网站服务器,"os"

"strconv"

)

func main() {

var start, end int

fmt.Println("请输入起始页(>=1):")

ftp服务器和文件服务器、fmt.Scan(&start)

fmt.Println("请输入终止页(>=1):")

fmt.Scan(&end)

DoWork(start, end)

}

func DoWork(start, end int) {

自己搭建个人文件服务器、//提示信息

fmt.Printf("正在爬取 %d 到 %d 页面\n", start, end)

for i := start; i <= end; i++ {

url := "http://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9F&ie=utf-8&pn=" + strconv.Itoa((i-1)*50)

// 爬取内容

fmt.Println(url)

企业文件服务器。resp, err := SpiderPage(url)

if err != nil {

fmt.Println("SpiderPage:", err)

continue //这里要用continue

}

// 获取到内容然后写入文件

fileserver文件服务器,fileName := strconv.Itoa(i) + ".html"

// 新建文件(会覆盖)

f, fErr := os.Create(fileName)

if fErr != nil {

fmt.Println("os.Create:", fErr)

continue //这里要用continue

局域网文件服务器?}

// 写入信息

f.WriteString(resp)

f.Close()

}

}

文件服务器解决方案、// 爬取

func SpiderPage(url string) (resp string, err error) {

// 获取内容

resp1, err1 := http.Get(url)

if err1 != nil {

err = err

return

}

defer resp1.Body.Close()

// 如果没错就获取内容

buf := make([]byte, 1024*4)

for {

// 读body内容

n, bErr := resp1.Body.Read(buf)

if n == 0 { // 读取结束或者出问题

fmt.Println("resp.Body.Read:", bErr)

break //这里读取结束要break,n=0就是结束

}

resp += string(buf[:n])

}

return

}

贴吧多线程爬虫简单例子

package main

import (

"fmt"

"net/http"

"os"

"strconv"

)

// 声明一个管道,来保证爬取完毕

var page = make(chan int)

func main() {

var start, end int

fmt.Println("请输入起始页(>=1):")

fmt.Scan(&start)

fmt.Println("请输入终止页(>=1):")

fmt.Scan(&end)

DoWork(start, end)

}

func DoWork(start, end int) {

//提示信息

fmt.Printf("正在爬取 %d 到 %d 页面\n", start, end)

for i := start; i <= end; i++ {

// 封装函数, 开协成

go SpiderPage(i)

// 管道阻塞

// fmt.Printf("第%d页爬完了\n",

}

// 记住一定要单独接收管道消息!!!

for i := start; i <= end; i++ {

//管道阻塞

fmt.Printf("第%d页爬完了\n",

}

}

func SpiderPage(i int) {

url := "http://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9F&ie=utf-8&pn=" + strconv.Itoa((i-1)*50)

// 爬取内容

fmt.Println(url)

resp, err := GetUrlContent(url)

if err != nil {

fmt.Println("SpiderPage:", err)

return

}

// 获取到内容然后写入文件

fileName := strconv.Itoa(i) + ".html"

// 新建文件(会覆盖)

f, fErr := os.Create(fileName)

if fErr != nil {

fmt.Println("os.Create:", fErr)

return

}

// 写入信息

f.WriteString(resp)

f.Close()

// 爬完一个就给管道传递数据

page

}

// 爬取

func GetUrlContent(url string) (resp string, err error) {

// 获取内容

resp1, err1 := http.Get(url)

if err1 != nil {

err = err

return

}

defer resp1.Body.Close()

// 如果没错就获取内容

buf := make([]byte, 1024*4)

for {

// 读body内容

n, bErr := resp1.Body.Read(buf)

if n == 0 { // 读取结束或者出问题

fmt.Println("resp.Body.Read:", bErr)

break //这里读取结束要break,n=0就是结束

}

resp += string(buf[:n])

}

return

}

多线程爬取多个页面例子

package main

import (

"fmt"

"net/http"

"os"

"strings"

//"os"

"regexp"

"strconv"

)

// 声明一个管道,来保证爬取完毕

var page = make(chan int)

func main() {

var start, end int

fmt.Println("请输入起始页(>=1):")

fmt.Scan(&start)

fmt.Println("请输入终止页(>=1):")

fmt.Scan(&end)

DoWork(start, end) //工作函数

}

func DoWork(start, end int) {

//提示信息

fmt.Printf("正在爬取 %d 到 %d 页面\n", start, end)

for i := start; i <= end; i++ {

// 定义一个函数,爬取主页面

go SpiderPage(i)

}

// 记住一定要单独接收管道消息!!!

for i := start; i <= end; i++ {

//管道阻塞

fmt.Printf("第%d页爬完了\n",

}

}

func SpiderPage(i int) {

url := "https://www.pengfu.com/xiaohua_" + strconv.Itoa(i) + ".html"

// 爬取内容

fmt.Println(url)

resp, err := GetUrlContent(url)

if err != nil {

fmt.Println("GetUrlContent:", err)

return

}

// 正则表达式取内容

re := regexp.MustCompile(`

if re == nil {

fmt.Println("regexp.MustCompile err")

return

}

// 取关键信息

joyUrls := re.FindAllStringSubmatch(resp, -1) //-1代表所有

//fmt.Println(joyUrls)

// 切片

fileTitle := make([]string, 0)

fileContent := make([]string, 0)

//第一个返回下标,第二个返回值

for _, data := range joyUrls {

// 获取每一个对应到的url

title, content, err := SpiderOneJoy(data[1])

if err != nil {

fmt.Println("SpiderOneJoy err", err)

continue

}

// fmt.Printf("title=#%v#", title)

// fmt.Printf("content=#%v#", content)

fileTitle = append(fileTitle, title)

fileContent = append(fileContent, content)

}

// 写成文件

StoreJoyToFile(i, fileTitle, fileContent)

}

// 写入文件

func StoreJoyToFile(i int, fileTitle, fileContent []string) {

// 新建文件

f, err := os.Create(strconv.Itoa(i) + ".txt")

if err != nil {

fmt.Println("os.create err", err)

return

}

defer f.Close()

// 写内容

n := len(fileTitle)

for i := 0; i < n; i++ {

f.WriteString(fileTitle[i] + "\n")

f.WriteString(fileContent[i] + "\n")

f.WriteString("\n===============\n")

}

// 爬完了

page

return

}

// 爬取单个内容

func SpiderOneJoy(url string) (title string, content string, err error) {

// 获取内容,发送get请求

resp1, err1 := GetUrlContent(url)

if err1 != nil {

err = err1

return

}

// 正则取关键信息

// 取标题

re1 := regexp.MustCompile(`

(?s:(.*?))

`)

if re1 == nil {

// 返回error

err = fmt.Errorf("%s", "regexp.MustCompile title err")

return

}

tmpTitle := re1.FindAllStringSubmatch(resp1, 1) //1过滤一个

for _, data := range tmpTitle {

title = data[1]

// 处理换行

//title = strings.Replace(title, "\n", "", -1)

//title = strings.Replace(title, "\r", "", -1)

//title = strings.Replace(title, " ", "", -1)

title = strings.Replace(title, "\t", "", -1)

break // 防止有多次直接break

}

// 取内容

re2 := regexp.MustCompile(`

(?s:(.*?))

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/61273.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息