当前位置: 首页 > wzjs >正文

如何在linux服务器上架设网站律师建网站

如何在linux服务器上架设网站,律师建网站,网站建设加推广,批量关键词排名查询工具因为最近工作量有点大,都是反复的做那几个事情,正好之前有用GO语言写的爬虫,现在稍微修改下,然后实现高并发实现快速抓取数据,因为有些属于商业机密,我就写成一个通用的模版以供大家参考。 下面是一个使用G…

因为最近工作量有点大,都是反复的做那几个事情,正好之前有用GO语言写的爬虫,现在稍微修改下,然后实现高并发实现快速抓取数据,因为有些属于商业机密,我就写成一个通用的模版以供大家参考。

在这里插入图片描述

下面是一个使用Go语言编写的高并发爬虫程序模板,采用工作池模式实现高效并发处理,并包含美观的UI界面展示爬取结果。

package mainimport ("fmt""io""net/http""sync""time""fyne.io/fyne/v2""fyne.io/fyne/v2/app""fyne.io/fyne/v2/container""fyne.io/fyne/v2/data/binding""fyne.io/fyne/v2/widget"
)// 爬虫任务结构体
type CrawlTask struct {URL string
}// 爬取结果结构体
type CrawlResult struct {URL        stringStatus     intTitle      stringSize       intDuration   time.DurationError      error
}func main() {// 创建Fyne应用myApp := app.New()myWindow := myApp.NewWindow("Go高并发爬虫")myWindow.Resize(fyne.NewSize(800, 600))// 创建数据绑定urls := binding.NewStringList()results := binding.NewStringList()activeWorkers := binding.NewInt()completedTasks := binding.NewInt()failedTasks := binding.NewInt()totalSize := binding.NewInt()// 初始化数据urls.Set([]string{"https://golang.org","https://golang.org/pkg","https://golang.org/pkg/net/http/","https://golang.org/doc","https://golang.org/blog","https://golang.org/pkg/fmt/","https://golang.org/pkg/os/","https://golang.org/pkg/encoding/json/",})activeWorkers.Set(0)completedTasks.Set(0)failedTasks.Set(0)totalSize.Set(0)// 创建UI组件title := widget.NewLabelWithStyle("Go高并发爬虫", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})urlList := widget.NewListWithData(urls,func() fyne.CanvasObject {return widget.NewLabel("template")},func(i binding.DataItem, o fyne.CanvasObject) {o.(*widget.Label).Bind(i.(binding.String))})addUrlEntry := widget.NewEntry()addUrlEntry.SetPlaceHolder("输入要爬取的URL...")addButton := widget.NewButton("添加URL", func() {if addUrlEntry.Text != "" {current, _ := urls.Get()urls.Set(append(current, addUrlEntry.Text))addUrlEntry.SetText("")}})statusGrid := container.NewGridWithColumns(4,widget.NewLabel("活跃工作协程:"),widget.NewLabelWithData(binding.IntToString(activeWorkers)),widget.NewLabel("已完成任务:"),widget.NewLabelWithData(binding.IntToString(completedTasks)),widget.NewLabel("失败任务:"),widget.NewLabelWithData(binding.IntToString(failedTasks)),widget.NewLabel("总下载量:"),widget.NewLabelWithData(binding.IntToStringWithFormat(totalSize, "%.0f KB")),)resultList := widget.NewListWithData(results,func() fyne.CanvasObject {return widget.NewLabel("result template")},func(i binding.DataItem, o fyne.CanvasObject) {o.(*widget.Label).Bind(i.(binding.String))})// 创建控制按钮startButton := widget.NewButton("开始爬取", nil)stopButton := widget.NewButton("停止", nil)clearButton := widget.NewButton("清空结果", func() {results.Set([]string{})completedTasks.Set(0)failedTasks.Set(0)totalSize.Set(0)})// 创建任务通道和控制通道taskQueue := make(chan CrawlTask, 100)resultChan := make(chan CrawlResult, 100)stopChan := make(chan struct{})var wg sync.WaitGroup// 更新开始按钮功能startButton.OnTapped = func() {// 重置统计completedTasks.Set(0)failedTasks.Set(0)totalSize.Set(0)results.Set([]string{})// 获取URL列表urlList, _ := urls.Get()// 启动工作池workerCount := 5for i := 0; i < workerCount; i++ {wg.Add(1)go worker(taskQueue, resultChan, stopChan, &wg, activeWorkers)}// 添加任务到队列go func() {for _, u := range urlList {taskQueue <- CrawlTask{URL: u}}close(taskQueue)}()// 处理结果go func() {for result := range resultChan {// 更新统计信息if result.Error != nil {failedTasks.Set(failedTasks.Get() + 1)} else {completedTasks.Set(completedTasks.Get() + 1)totalSize.Set(totalSize.Get() + result.Size/1024) // 转换为KB}// 添加结果到列表current, _ := results.Get()var status stringif result.Error != nil {status = fmt.Sprintf("失败: %s", result.Error)} else {status = fmt.Sprintf("成功: %d 字节 (耗时: %v)", result.Size, result.Duration)}newResult := fmt.Sprintf("[%s] %s", result.URL, status)results.Set(append(current, newResult))}}()// 等待所有工作完成go func() {wg.Wait()close(resultChan)}()}// 停止按钮功能stopButton.OnTapped = func() {close(stopChan)}// 布局界面topBar := container.NewHBox(addUrlEntry, addButton)controlBar := container.NewHBox(startButton, stopButton, clearButton)content := container.NewBorder(container.NewVBox(title, topBar, statusGrid, controlBar),nil,nil,nil,container.NewHSplit(container.NewBorder(widget.NewLabel("待爬取URL列表"), nil, nil, nil, urlList),container.NewBorder(widget.NewLabel("爬取结果"), nil, nil, nil, resultList),),)myWindow.SetContent(content)myWindow.ShowAndRun()
}// 工作协程函数
func worker(tasks <-chan CrawlTask, results chan<- CrawlResult, stopCh <-chan struct{}, wg *sync.WaitGroup, active binding.Int) {defer wg.Done()active.Set(active.Get() + 1)defer func() {active.Set(active.Get() - 1)}()for task := range tasks {select {case <-stopCh:returndefault:start := time.Now()// 执行HTTP请求resp, err := http.Get(task.URL)if err != nil {results <- CrawlResult{URL:   task.URL,Error: err,}continue}defer resp.Body.Close()// 读取响应体body, err := io.ReadAll(resp.Body)if err != nil {results <- CrawlResult{URL:   task.URL,Error: err,}continue}// 创建结果duration := time.Since(start)results <- CrawlResult{URL:      task.URL,Status:   resp.StatusCode,Size:     len(body),Duration: duration,}}}
}

程序功能说明

这个Go语言爬虫程序具有以下特点:

1、高并发处理

  • 使用工作池模式(worker pool)管理并发
  • 通过通道(channel)实现任务队列
  • 使用sync.WaitGroup等待所有任务完成

2、用户友好界面

  • 使用Fyne框架构建跨平台GUI
  • 实时显示爬取进度和结果
  • 清晰的统计信息展示

3、核心功能

  • 添加/管理待爬取的URL列表
  • 启动/停止爬取过程
  • 显示每个URL的爬取结果(状态、大小、耗时)
  • 实时统计:活跃工作协程、已完成任务、失败任务、总下载量

4、错误处理

  • 网络请求错误处理
  • 响应读取错误处理
  • 通过停止通道实现优雅停止

使用说明

  1. 在顶部输入框中输入要爬取的URL,点击"添加URL"按钮
  2. 点击"开始爬取"按钮启动爬虫
  3. 右侧结果面板将实时显示爬取进度
  4. 统计信息区域显示当前状态
  5. 可随时点击"停止"按钮终止爬取过程
  6. 点击"清空结果"可重置统计信息和结果列表

运行要求

运行此程序需要安装以下依赖:

go get fyne.io/fyne/v2

此程序可在Windows、macOS和Linux上运行,并自动适配本地主题。

扩展建议

1、增加深度爬取功能(从页面中提取新链接)

2、添加请求延迟控制,避免对目标服务器造成过大压力

3、实现更复杂的结果解析(如提取标题、关键词等)

4、添加结果导出功能

5、实现更精细的错误分类和统计

这个模板提供了高并发爬虫的核心架构,根据自己项目要求可以进一步扩展功能,如果遇到技术上的问题,欢迎随时留言讨论。


文章转载自:

http://fYiSvTq2.nqgjn.cn
http://ZW0DCVme.nqgjn.cn
http://WYnvMdX6.nqgjn.cn
http://VFQ31puN.nqgjn.cn
http://c3qYwgR7.nqgjn.cn
http://AVm5QFEo.nqgjn.cn
http://YyuYiXol.nqgjn.cn
http://pnbkuIc7.nqgjn.cn
http://660ceFME.nqgjn.cn
http://Jno369Wx.nqgjn.cn
http://gaw5vTlh.nqgjn.cn
http://2yqXGgWO.nqgjn.cn
http://AqKYeR1l.nqgjn.cn
http://HlgDiDqf.nqgjn.cn
http://8VySn8tI.nqgjn.cn
http://5v76axNN.nqgjn.cn
http://NScmtbGU.nqgjn.cn
http://0OGTdVZD.nqgjn.cn
http://2OuJSSN6.nqgjn.cn
http://yGINOX4W.nqgjn.cn
http://w037TYTA.nqgjn.cn
http://VkNG9YdE.nqgjn.cn
http://FscvY3TA.nqgjn.cn
http://DYXt2eOB.nqgjn.cn
http://MyGl2a4r.nqgjn.cn
http://ENL6AfYD.nqgjn.cn
http://rMiCtj8i.nqgjn.cn
http://0HZF7iUy.nqgjn.cn
http://LVQou8wt.nqgjn.cn
http://6SyhuWyP.nqgjn.cn
http://www.dtcms.com/wzjs/605752.html

相关文章:

  • 如何在百度云上建设网站企业网上购物系统
  • 广东建设行业招聘 什么网站西安企业网站制作
  • 电脑怎么打不开建设银行网站huntt wordpress主题
  • 网站提速网站网络营销推广制作
  • vps搭建网站教程建网站程序下载
  • asp网站制作工具宜昌网站建设选择宜昌慧享互动
  • 淘宝运营是做什么的工作网站ul优化
  • 千博网站后台闵行网站建设哪家好
  • 标题制作网站科技网站小编
  • wordpress 手机网站支付宝深圳手机集团网站建设
  • 花卉市场网站建设基本步骤公众号小程序注册
  • 建设好的网站怎么发布招聘门户网站开发人员
  • 做网站需要服务器和什么软件广州确诊病例最新消息
  • 用dw怎么做网站首页在国外服务器上做网站项目如何赚钱吗
  • 风中有朵雨做的云电影网站ceac网页设计师
  • 网站设计建设企业做公众号时图片的网站
  • 简单学校网站模板个人做小程序商店
  • 郑州新闻联播西宁网站建设优化
  • 如何网站建设网页深圳手机app软件开发
  • 渭南网站建设哪家好曲靖网站建设0doit
  • 网上商城 网站建设 解决方案wordpress恢复插件
  • 科技公司网站建设典型的c2c平台有哪些
  • 餐饮公司网站模板河南省建设厅职称网站
  • 湛洪波.jsp网站开发详解企业网站本身应该就是企业( )的一部分
  • 怎么做网站流量竞品分析做类似淘宝的网站前景
  • 淘客网站建设平台公司工作总结
  • 在县城做哪个招聘网站比较赚钱兰州电商平台网站建设
  • 手机网站设计与实现是什么小程序制作推广费用
  • 网站开发运营维护方案建议网站验证钱的分录怎么做
  • 网站阵地建设wordpress 多功能插件