打卡
文章平均质量分 92
学习打卡
程序员彬哥
致力于开发出高效,简洁的代码
展开
-
Linux性能优化(一)
作为一个完美主义者,一学起原理类的东西,真的不要太容易跑偏😂经常是看着某个重要原理,就想着找找看相关内容,然后就各种跳转搜索,以前最开始学数据结构的定义,都能跑到编译原理上,最后开始计算二进制了。比如,当遇到 I/O 性能问题时,可以参考图片最下方的 I/O 子系统,使用 iostat、iotop、blktrace 等工具分析磁盘 I/O 的瓶颈。第 5 个综合实战模块,还原真实的工作场景,手把手带你在“高级战场”中演练,这样你能把前面学到的所有知识融会贯通,并且看完专栏,马上就能用在工作中。原创 2023-04-18 21:50:53 · 592 阅读 · 0 评论 -
Go分布式爬虫(二十五)
轮到我们就餐时,我们占据了一个座位,也就是占据了一个令牌,这时我们就可以开吃了。令牌桶算法的原理很简单,我们可以想象这样一个场景,你去海底捞吃饭,里面只有 10 个座位,我们可以将这 10 个座位看作是桶的容量。现在,由于座位已经满了,服务员就帮我们叫了个号,我们随即进入到了等待的状态。有时候我们还会有一些更复杂的需求,例如有多层限速器的需求(细粒度限速器限制每秒的请求,粗粒度限速器限制每分钟、每小时或每天的请求)。到这里,我们就不再需要在爬取数据时固定休眠了,只要使用限速器来控制速度的就可以了。原创 2023-04-17 21:33:38 · 848 阅读 · 0 评论 -
Go分布式爬虫(二十四)
不过我们还需要完成一轮抽象,因为后端引擎会处理的事务比较繁琐,它不仅仅包含了存储,还包含了缓存、对表头的拼接、数据的处理等。所以,我们要创建一个更加底层的模块,只进行数据的存储。爬虫项目的一个重要的环节就是把最终的数据持久化存储起来,数据可能会被存储到 MySQL、MongoDB、Kafka、Excel 等多种数据库、中间件或者是文件中。创建了一个接口 Storage 作为数据存储的接口,Storage 中包含了 Save 方法,任何实现了 Save 方法的后端引擎都可以存储数据。原创 2023-04-16 22:39:44 · 1954 阅读 · 0 评论 -
Go分布式爬虫笔记(二十三)
我们在 Task 中加入了 Name 字段,将其作为一个任务唯一的标识。Task 里除了之前具有的最大深度、等待时间等属性,我们还加入了Rule, 规则条件中 Root 生成了初始化的爬虫任务。Trunk 为爬虫任务中的所有规则。// 一个任务实例, type Task struct {Name string // 用户界面显示的名称(应保证唯一性) Url string Cookie string WaitTime time . Duration。原创 2023-04-15 11:06:48 · 865 阅读 · 0 评论 -
Go分布式爬虫笔记(二十二)
以我们之前写好的 ParseURL 函数为例,在添加下一层的 URL 时,我们将 Depth 加 1,这样就标识了下一层的深度。我们之前的 Request 结构体会在每一次请求时发生变化,但是我们希望有一个字段能够表示一整个网站的爬取任务,因此我们需要抽离出一个新的结构。随机生成 User-Agent 的逻辑位于 extensions/randomua.go 中,里面枚举了不同型号的浏览器和不同型号的版本,并且通过排列组合产生了不同的 User-Agent。最后一步,我们在爬取新的网页之前,判断最大深度。原创 2023-04-14 08:29:57 · 1126 阅读 · 0 评论 -
Go分布式爬虫笔记(二十一)
Go 语言中的负载因子为 6.5,当哈希表负载因子的大小超过 6.5 时,Map 就会扩容,变为旧表的两倍。当进行 Map 的 delete 函数时,delete 函数会根据 Key 找到指定的桶,如果存在指定的 Key,那么就释放掉 Key 与 Value 引用的内存。试想一下,如果桶的数量只有 1 个,这个时候负载因子到达最大,搜索就和遍历数组一样了,它的复杂度为 o(n)。我们看下面的例子,bar 执行了 append 函数之后,最终也修改了 foo 的最后一个元素,这是一个在实践中非常常见的陷阱。原创 2023-04-13 19:24:05 · 1071 阅读 · 0 评论 -
Go分布式爬虫笔记(二十)
如果之后有协程读取数据,那么读取协程会立即读取 sendq 队列中第一个等待的协程,并将该协程对应的元素拷贝到读取协程中,同时调用 goready 唤醒写入协程,将写入协程放入到可运行队列中等待被调度器调度。如果 select 找不到准备就绪的通道,这时和单个协程的堵塞一样,它会将当前协程放入到所有通道的等待队列中,并陷入到休眠状态。而对于带缓冲区的通道来说,假设缓存队列的数量为 N,那么如果写入的数据量不大于 N,写入协程就不会陷入到休眠状态,所有数据都会存储在缓冲队列中。第三部分涉及到协程的唤醒。原创 2023-04-12 20:35:32 · 1920 阅读 · 4 评论 -
Go分布式爬虫笔记(十九) 4月Day3
以下图中的拓扑结构为例,节点 A 标识的是爬取的初始网站,在网站 A 中,有 B、C 两个链接需要爬取,以此类推。查找完之后,再是 C、F,最后是 G。如果我们现在只知道每门课程的前序课程,不清楚完整的学习路径,我们要怎么设计这一系列课程学习的顺序,确保我们在学习任意一门课程的时候,都已经学完了它的前序课程呢?查看 HTML 文本的规则会发现,正本包含在xxxx当中,所以我们可以用正则表达式这样书写规则函数,意思是当发现正文中有对应的文字,就将当前帖子的 URL 写入到 Items 当中。原创 2023-04-05 23:01:47 · 1007 阅读 · 1 评论 -
Go分布式爬虫笔记(十八) 4月Day2
条件: 当两个以上协程同时访问相同的内存空间,并且至少有一个写操作时问题解决方法AddInt64函数将变量增加了 1CompareAndSwap: 它能够对比并替换元素值下面这个例子中,atomic.CompareAndSwapInt64 会判断 flag 变量的值是否为 0,如果是,则将 flag 的值设置为 1。这一系列操作都是原子性的,不会发生数据争用,也不会出现内存操作乱序问题。通过 sync/atomic 包中的原子操作,我们能构建起一种自旋锁,只有获取该锁,才能执行区域中的代码。下面这段原创 2023-04-03 20:06:59 · 581 阅读 · 0 评论 -
Go分布式爬虫笔记(十七) 4月Day1
我们知道,Go 语言比较容易开发高并发的程序,这得益于 Go 语言在线程之上创建了更轻量级的协程 G。相比于线程,协程在时间和空间上都有明显的优势。同时,Go 运行时抽象出了逻辑处理器 P 和代表线程的 M,P 与 M 一一绑定。借助 M 中特殊的协程 g0,Go 运行时能够完成对于协程公平并且高效的调度。协程一般是被动调度的,当它陷入堵塞后,会主动让渡自己的执行权利,这和操作系统通常强制执行线程的上下文有所不同。原创 2023-04-01 23:52:44 · 831 阅读 · 0 评论 -
Go分布式爬虫学习笔记(十六)
我们来定义一个新Handler:ChanHandler,该Handler实现将日志写入channel的行为(用来模拟日志写入kafka),我们来建立该ChanHandler:我们看到ChanHandler内嵌了slog.JSONHandler,对slog.Handler接口的实现多半由内嵌的JSONHandler去完成,唯一不同的是Handle方法,这里要把JSONHandler处理完的日志copy出来并发送到channel中。= nil {// 模拟channel的消费者,用来消费日志 for {原创 2023-03-31 09:43:30 · 567 阅读 · 0 评论 -
Go分布式爬虫学习笔记(十五)
代理是指在客户端和服务器之间路由流量的服务,用于实现系统安全、负载均衡等功能。在爬虫项目中,代理服务器常常扮演着重要的角色,它能帮助我们突破服务器带来的限制和封锁,达到正常抓取数据的目的。原创 2023-03-30 08:32:30 · 1070 阅读 · 3 评论 -
Go分布式爬虫学习笔记(十四)
当定时器到期时,会调用 cancel 方法关闭通道,级联关闭当前 Context 派生的子 Context,并取消与父 Context 的绑定关系。每个派生出的子 Context 都会创建一个新的退出通道,这样,只要组织好 Context 之间的关系,就可以实现继承链上退出信号的传递。我们需要借助通道的 close 机制,这个机制会唤醒所有监听该通道的协程,并触发相应的退出逻辑。如下图所示,服务器处理 HTTP 请求一般会单独开辟一个协程,假设该处理协程调用了函数 A,函数 A 中也可能创建一个新的协程。原创 2023-03-27 21:38:41 · 1091 阅读 · 0 评论 -
Go分布式爬虫学习笔记(十三)
可以看到直接函数调用的速度最快,为 1.95 ns/op, 方法接收者为指针的接口调用和函数调用的速度类似,为 2.37 ns/op, 方法接收者为非指针的接口调用却慢了数倍,为 14.6 ns/op。由于 Selenium 整合了不同的浏览器驱动,因此它对于不同的浏览器都具有良好的兼容性。Selenium 为每一种语言(例如 Java、Python、Ruby 等)都准备了一个对应的 clinet 库,它整合了不同浏览器的驱动(这些驱动由浏览器厂商提供,例如谷歌浏览器的驱动和火狐浏览器的驱动)。原创 2023-03-26 23:11:48 · 901 阅读 · 0 评论 -
Go分布式爬虫学习笔记(十二)
例如,微软办公软件 Words 在 2007 之后的版本的底层数据就是通过 XML 文件描述的。我们前面在 XPath 例子的中使用的 div[@class=“news_li”],在 CSS 选择器中可以简单地表示为 div.news_li。这是一种更加简单的表示方法。在 CSS 文件中,我们可以定义一个或多个 HTML 中的标签的路径,并指定这些标签的样式。在类似如下的日志文件中,包含了很多订单号的信息,即 order_id 后面的一串数字。在 Go 语言中,字符串是默认通过 UTF-8 的形式编码的。原创 2023-03-25 23:44:22 · 862 阅读 · 0 评论 -
Go分布式爬虫学习笔记(十一)
项目的所有第三方依赖都可以存放在当前项目的 Vendor 目录下,再也不用为了应用不同版本的依赖对 GOPATH 环境变量“偷梁换柱”了,Go 编译器优先感知和使用 Vendor 目录下缓存的第三方包。2019 年 9 月,Go1.13 发布,只要目录下有 go.mod 文件,Go 编译器都会默认使用 Modules 来管理依赖。为了加快构建程序的速度,快速切换、获取项目中依赖项的更新,Go 维护了下载到本地计算机上的所有模块的缓存,缓存目前默认位于 $GOPATH/pkg/mod 目录下。原创 2023-03-24 23:57:29 · 334 阅读 · 2 评论 -
Go分布式爬虫学习笔记(十)
HTTP服务器HTTP请求OSI 7层模型OSI 4层模型应用层传输层TLS网络层网络接入层数据传输路由协议交换机 二层路由器 三层自治系统内部路由协议外部路由协议R Introduction to Computer Networks and Cybersecurity 计算机网络与网络安全导论 12-13章 路由协议R Computer Networking A Top-Down Approach 6th 计算机网络:自顶向下方法 路由器内部处理方式数据包解析。原创 2023-03-21 22:10:40 · 822 阅读 · 2 评论 -
Go分布式爬虫笔记(九)
[建议] 当某个部分等待完成时,可用。原创 2023-03-20 14:11:29 · 1537 阅读 · 3 评论 -
Go分布式爬虫笔记(八)
业务需求爬虫引擎为基础的推送系统提供用户需求功能需求产品需求前端页面设计用户交互设计数据分析设计数据推送设计。原创 2023-03-19 21:38:58 · 544 阅读 · 0 评论 -
Go分布式爬虫学习(七)
此文章为3月Day6学习笔记,内容来源于极客时间《Go分布式爬虫实战》,强烈推荐该课程!服务发现、服务注册、负载均衡。数据一致性的诞生背景。原创 2023-03-18 23:20:33 · 287 阅读 · 0 评论 -
Go分布式爬虫笔记(六)
。原创 2023-03-17 13:22:34 · 716 阅读 · 0 评论 -
Go分布式爬虫笔记(五)
。原创 2023-03-15 22:25:20 · 692 阅读 · 0 评论 -
Go爬虫学习笔记(四)
Go 是以同步的方式来处理网络 I/O 的,它会等待网络 I/O 就绪后,才继续下面的流程,这是符合开发者直觉的处理方式。Go 语言高效,是因为在同步处理的表象下,Go 运行时封装 I/O 多路复用,灵巧调度协程,实现了异步的处理,也实现了对 CPU 等资源的充分利用。阻塞与非阻塞IO密集型:如果程序的大多数时间花费在等待 I/O 上,这种程序就是 I/O 密集型(I/O bound)的。原创 2023-03-14 22:23:33 · 515 阅读 · 0 评论 -
Go爬虫学习笔记(三)
Scrum 框架的缺点:感觉 Scrum 框架更讲究迅速,看起来更适合小型、要求先快速交付一版的新项目,很多环节由文档转变为面对面沟通,对于长期迭代的项目来说,可能会导致一些重要材料的丢失,如果项目人员流动大,可能会对后续的长期维护埋坑。不知道是否理解正确。数据发布者已决定将数据公开,例如暴露了 API;用户无需创建帐户或登录即可访问的数据;该网站的 robots.txt 文件允许访问的数据。原创 2023-03-13 22:26:14 · 1325 阅读 · 0 评论 -
Go爬虫学习笔记(二)
时间与复利思维思维模型垃圾回收Go进阶GMP模型在 GMP 模型中,G 代表的是 Go 语言中的协程(Goroutine),M 代表的是实际的线程,而 P 代表的是 Go 逻辑处理器(Process)。Go 语言为了方便协程调度与缓存,抽象出了逻辑处理器的概念。在任一时刻,一个 P 可能在本地包含多个 G,同时,一个 P 在任一时刻只能绑定一个 M。随着我们对协程、运行时协程调度的理解越来越深入,我们的知识组块、知识体系都可能会有所更新。原创 2023-03-10 21:09:52 · 2048 阅读 · 0 评论 -
Go爬虫学习笔记
etcd 这个名字是 etc distributed 的缩写。我们知道,在 Linux 中 etc 目录存储了系统的配置文件,所以 etcd 代表了分布式的配置中心系统。然而,它能够实现的功能远不是同步配置文件这么简单。etcd 可以作为分布式协调的组件帮助我们实现分布式系统。etcd 完整的读写流程。在整个复杂的流程中,核心模块无外乎是 GRPC 请求、权限和参数的检查、WAL 日志的存储、Raft 节点的网络协调以及执行操作更新状态机的状态等。原创 2023-03-09 21:28:05 · 3792 阅读 · 0 评论