http文件服务器客户端,go http服务器/客户端
服务器端简单例子:
package main
import (
"fmt"
"io"
"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)
// 给客户端回复数据
io.WriteString(w, "hello, world!\n")
w.Write([]byte("lisa"))
}
func main() {
// 注册函数,用户连接, 自动调用指定处理函数
http.HandleFunc("/hello", HelloServer)
// 监听绑定
err := http.ListenAndServe(":12345", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
客户端简单例子
package main
import (
"fmt"
"net/http"
)
func main() {
respon, err := http.Get("http://www.baidu.com")
if err != nil {
fmt.Println("http.get:", err)
return
}
// 关闭
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 {
fmt.Println("Body.Read err:", err)
break
}
tmp += string(buf[:n])
}
fmt.Println("body:", tmp)
}
贴吧单线程爬取例子
package main
import (
"fmt"
"net/http"
"os"
"strconv"
)
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++ {
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
}
// 获取到内容然后写入文件
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(`
http文件服务器客户端,go http服务器/客户端相关推荐
- 文件服务器如何鉴权,服务器客户端鉴权方式
服务器客户端鉴权方式 内容精选 换一换 华为云会议提供了服务端API开放和客户端SDK开放,开发者基于自己的应用场景可以灵活地集成华为云会议的开放性接口.本文介绍了几个基于华为云会议集成的最佳实践,帮 ...
- 纯服务器 客户端文件,纯服务器 客户端文件
纯服务器 客户端文件 内容精选 换一换 目前数据库服务器备份Agent安装包需要提交工单进行获取.当前仅支持x86计算类型的服务器,暂不支持鲲鹏计算类型的服务器.用户需要启用数据库备份前,需先在弹性云 ...
- sql 服务器 客户端配置文件,sql 服务器 客户端配置
sql 服务器 客户端配置 内容精选 换一换 在进行二次开发时,要准备的开发环境如表1所示.同时需要准备运行调测的Linux环境,用于验证应用程序运行正常.选择Windows开发环境下,安装Eclip ...
- 把客户端文件发送到服务器,客户端向服务器发送文件
客户端向服务器发送文件 内容精选 换一换 Microsoft SQL Server提供的发布与订阅功能,利用复制技术来实现数据同步,可以通过其提供的发布与订阅功能实现数据的读写分离和线下线上数据同步. ...
- samba文件服务器怎么登录,客户端登录samba 服务器
客户端登录samba 服务器 内容精选 换一换 目前数据库服务器备份Agent安装包需要提交工单进行获取.当前仅支持x86计算类型的服务器,暂不支持鲲鹏计算类型的服务器.用户需要启用数据库备份前,需先 ...
- TCP聊天文件服务器v2.2 - 服务端客户端套接字解决分包/粘包问题 - SocketQueue继承以及减少冗余
TCP聊天+传输文件服务器服务器套接字v2.2 整个图当封面吧 所有版本记录: v1.0 : TCP聊天服务器套接字|PyQt5+socket(TCP端口映射+端口放行)+logging+Thread ...
- [linux][c语言]用socket实现简单的服务器客户端交互
Socket解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是"孔"或"插座".作为B ...
- socket 服务器浏览器与服务器客户端实例
一.服务器与浏览器 // 取得本机的loopback网络地址,即127.0.0.1 IPAddress address = IPAddress.Loopback; ...
- C#下如何实现服务器+客户端的聊天程序
C#下如何实现服务器+客户端的聊天程序 最近也在接触SOCKET编程,在当今这样一个网络时代,很多技术都以网络为中心在诞生,至少我认为是这样的,而SOCKET套接字接口,在实现网络通讯上处于关键地位, ...
最新文章
- 如何更好地利用Pmd、Findbugs和CheckStyle分析结果
- 每日一皮:这个食堂好...
- 安卓手机chroot linux,在Android设备上安装 GNU/Linux Chroot 环境
- SAP Cloud for Customer里的HTML Mashup的JavaScript编程功能
- pat 甲级 1072. Gas Station (30)
- 剑指 Offer 32 - II. 从上到下打印二叉树 II
- html js url 跳转页面内容,js跳转页面方法总结
- 面向对象——类设计(五)
- 八大排序算法思想介绍
- 二叉树:一入递归深似海,从此offer是路人
- Bing必应来帮忙之-查询虚拟主机服务器上的同IP网站
- np.mat()和np.transpose
- 网站服务器配置在哪里设置,web服务器配置参数 web服务器建立网站具体步骤
- (application)javaweb中application的用法
- 开源 | Objective-C Swift 最轻量级 Hook 方案
- hp服务器下的虚拟机安装系统安装,hp 服务器安装linux系统安装
- 英文B2C网站的SEO的优化
- java mp4 切片_视频完美切片存储方案 附自动化处理脚本
- linux 扫描局域网内所有主机
- 生活中意想不到的妙招