在上一篇文章——中,我叙述了如何白嫖Jetbrains公司的一系列编译器(当然,这不是必要掌握和实践的),这篇文章,我将使用它的针对Go语言开发的编译器——GoLand进行HTTP的编程(刷一些文章的浏览量和简单的爬虫)。
GoLand下载安装和使用
近几年来jetbrains推出的产品备受开发者喜爱,不管是intellij IDEA还是WebStorm等开发工具,都成为了开发界的一款利器。(intellij IDEA主要是在Java中使用的比较多,但是它可以安装任何的插件,你可以使用它来编译任何你想要使用的语言,只不过是需要安装插件的,此处就不在详细叙述)
相信很多的开发者在选取编译器时都很迷茫,现在网络上有很多各式各类的编译器,那么我在这里所推荐的这款编译器是jetbrains公司的产品--GoLand。
近几年来jetbrains推出的产品备受开发者喜爱,不管是intellij IDEA还是WebStorm等开发工具,都成为了开发界的一款利器。(intellij IDEA主要是在Java中使用的比较多,但是它可以安装任何的插件,你可以使用它来编译任何你想要使用的语言,只不过是需要安装插件的,此处就不在详细叙述)
1.GoLand下载地址:https://www.jetbrains.com/go/2.安装
傻瓜式一键安装即可。
3.登录这里需要登录你的jetBrains账号(该公司产品都有点小贵,建议各位谨慎剁手,但对于学生和老师可以免费试用一年,等到了下一年再重新登录即可,学生注册可以参考身为学生所拥有的巨额财富,当然你可以教我微信私聊,我给你我的注册码)
这样就完成了 GoLang的安装,就可以使用了:
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
以上就是GoLand的安装和使用教程。
HTTP编程在进行http编程时,Go语言标准库内建提供了net/http包,涵盖了HTTP客户端和服务器的具体实现。使用net/http包,我们可以很方便的编写HTTP客户端或者服务端的程序,在平时进行web端的开发中,理解HTTP编程思想是十分重要的。
看到这里了,就来点干货吧,当你分析过一个网站的浏览量规律就会发现它们都是有机可乘的,就像简书、博客园、CSDN等,例如简书,你可以发现,当你在非登录状态刷新自己的文章,每刷新一次页面,就是一次浏览量;CSDN每两到三分钟刷新一次页面,浏览量就会增加;以下就是CSDN浏览量刷新规律的代码,直接将自己文章的链接放进去即可,亲测有效。
package main
import (
"fmt"
"net/http"
"time"
)
//初始化一个数,进行计数
var lcc = 0
func lcc_CSDNjp() {
//以下url均为所需要点击的链接,即要点击的网页
url := "文章链接"
//使用Get请求,模拟点击
http.Get(url)
//打印url
println(url)
url1 := "文章链接"
http.Get(url1)
println(url1)
//点击数加一
lcc
}
func main() {
//获取当前时间
time1 := time.Now().Unix()
//调用方法
lcc_CSDNjp()
//打印次数
fmt.Println(lcc)
//死循环,除非强制停止,否则一直执行
for i := 0; i >= 0; i {
//如果距离上一次点击时间间隔大于120秒
if (time.Now().Unix() - time1) > 120 {
lcc_CSDNjp()
fmt.Println(lcc)
time1 = time.Now().Unix()
}
}
}
如图所示:
40行代码即可进行简单的爬虫。
如若想要对个人主页的所有文章进行模拟点击请私信我(仅用于学习测试)。
爬取一些文章或资源HTTP编程除了可以进行简单的模拟点击效果,还可以对网页中的信息提取,只要简单的分析HTML的代码,即可简单的获取想要的资源,下面是对一个简单的段子网进行爬虫。
地址:http://duanziwang.com/
代码:
package main
import (
"fmt"
"net/http"
"os"
"regexp"
"strconv"
"strings"
)
func test_HttpGet(url string) (result string, err error) {
resp, err1 := http.Get(url)
if err1 != nil {
err = err1
return
}
defer resp.Body.Close()
buf := make([]byte, 1024*4)
for {
n,_ := resp.Body.Read(buf)
if n == 0 {
break
}
result = string(buf[:n])
}
return
}
func test_SpiderOneJoy(url string) (title, content string, err error) {
result, err1 := test_HttpGet(url)
if err1 != nil {
err = err1
return
}
//取标题
re1 := regexp.MustCompile(`<h1 class="post-title">(?s:(.*?))</h1>`)
if re1 == nil {
err = fmt.Errorf("%s","regexp.MustCompile err")
return
}
tmpTitle := re1.FindAllStringSubmatch(result, -1)
for _, data := range tmpTitle{
title = data[1]
title = strings.Replace(title, "\r","",-1)
title = strings.Replace(title, "\n","",-1)
title = strings.Replace(title, "","",-1)
title = strings.Replace(title, "\t","",-1)
break
}
re2 := regexp.MustCompile(`<section class="post-content">(?s:(.*?))</section>`)
if re2 == nil {
err = fmt.Errorf("%s","regexp.MustCompile err")
return
}
tmpContent := re2.FindAllStringSubmatch(result, -1)
for _, data := range tmpContent{
content = data[1]
content = strings.Replace(content, "\r","",-1)
content = strings.Replace(content, "\n","",-1)
content = strings.Replace(content, "","",-1)
content = strings.Replace(content, "\t","",-1)
content = strings.Replace(content, "<p>","",-1)
content = strings.Replace(content, "</p>","",-1)
content = strings.Replace(content, "<br>","\n",-1)
break
}
return
}
func test_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")
f.WriteString("\n")
}
}
func test_SpiderPage(i int, page chan int) {
//http://duanziwang.com/page/1/
url := "http://duanziwang.com/page/" strconv.Itoa(i)
fmt.Printf("正在爬取第%d个页面\n",i)
result, err := test_HttpGet(url)
if err != nil {
fmt.Println("CSDN_HttpGet err = ", err)
return
}
//取 <h1 class="dp-b"><a href=" 段子url地址 "=====>>>正则表达式
re := regexp.MustCompile(`<h1 class="post-title"><a href="(?s:(.*?))">`)
if re == nil {
fmt.Println("regexp.MustCompile err")
return
}
//取关键信息===>>每一页的段子链接组成一个切片
joyUrl := re.FindAllStringSubmatch(result,-1)
fileTitle := make([]string,0)
fileContent := make([]string,0)
//取网址
for _,data := range joyUrl{
title, content, err := test_SpiderOneJoy(data[1])
if err != nil {
fmt.Println("test_SpiderOneJoy err = ",err)
continue
}
fileTitle = append(fileTitle, title)
fileContent = append(fileContent, content)
}
test_StoreJoyToFile(i,fileTitle,fileContent)
page <- i //写内容,写num
}
func test_Dowork(start, end int) {
fmt.Printf("准备爬取第%d到%d页的网址\n",start,end)
page := make(chan int)
for i := start; i <= end ; i {
go test_SpiderPage(i,page)
}
for i := start; i<= end; i {
fmt.Printf("第%d个页面爬取完成\n", <-page)
}
}
func main() {
var start, end int
fmt.Println("输入爬取的起始页(>=1)")
fmt.Scan(&start)
fmt.Println("输入爬取的起始页(>=start)")
fmt.Scan(&end)
test_Dowork(start,end)
}
文件1.txt、2.txt、3.txt均为段子的存储文件:
以上就是对段子爬虫的一个简单实例。
HTTP编程最常用的实例就是网络爬虫,但网络爬虫存在一定的风险,也就是所谓的在河边走,每年都会有程序员因为一段爬虫程序而请去喝茶,所以请各位谨慎。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved