package main
import (
"fmt"
"io"
"net/http"
"os"
"regexp"
"strconv"
"strings"
)
// 网页规律:
// https://www.pengfue.com/xiaohua_1.html
// https://www.pengfue.com/xiaohua_2.html
// https://www.pengfue.com/xiaohua_3.html
// 主页面规律:
// <div class="list-item bg1 b1 boxshadow" id="1857269">
// <h1 class="dp-b"><a href="https://www.pengfue.com/content_1857269_1.html" target="_blank">标题</a></h1>
func main() {
var start, end int;
fmt.Printf("请输入起始页(>= 1):");
fmt.Scan(&start);
fmt.Printf("请输入终止页(>= 起始页):");
fmt.Scan(&end);
//
SpiderPages(start, end);
}
func SpiderPages(start, end int) {
baseUrl := "https://www.pengfue.com/xiaohua_";
fmt.Printf("正在爬取 %d 到 %d 的页面", start, end);
//
for i := start; i <= end; i++ {
// 1)明确目标(要知道你准备在哪个范围或者网站去搜索)
url := baseUrl + strconv.Itoa(i) + ".html";
fmt.Printf("正在爬取第%d个网页:%s\n", i, url);
// 定义暂存数据,待会要写入文件的
fileTitles := make([]string, 0);
fileContents := make([]string, 0);
// 2)爬(将所有网站的内容抓取下来
result, httpGetErr := HttpGet(url); //fmt.Println(result);
if httpGetErr != nil {
fmt.Println("HttpGetErr =", httpGetErr);
}
// 解释表达式
re := regexp.MustCompile(`<h1 class="dp-b"><a href="(?s:(.*?))" target="_blank">`);
if re == nil {
fmt.Println("regexp.MustCompile err =");
return;
}
// 取关键信息
joyUrls := re.FindAllStringSubmatch(result, -1); // 返回一个二维数组
//fmt.Println(joyIds);
//
for _, jValue := range joyUrls {
joyUrl := jValue[1]; // 每个笑话的详情网址
title, content, oneJoyErr := SpiderOneJoy(joyUrl);
if oneJoyErr != nil {
fmt.Println("oneJoyErr err =", oneJoyErr);
continue;
}
//// 结果展示
//fmt.Printf("title = %s\n", title);
//fmt.Printf("content = %s\n", content);
// 写入暂存数组
fileTitles = append(fileTitles, title);
fileContents = append(fileContents, content);
}
// 3)把内容写进文件
saveJoys(i, fileTitles, fileContents);
//fileName := "./iofiles/tieba.hsnc-" + strconv.Itoa(i) + ".html";
//f, fCreateErr := os.Create(fileName);
//if fCreateErr != nil {
// fmt.Println("fCreateErr =", fCreateErr);
// continue; // 这里不能用return,要不后面的也没法存了
//}
//f.WriteString(result);https://github.com/yuan1994/tpadmin
//f.Close();
}
}
func SpiderOneJoy(url string) (title, content string, err error) {
result, httpGetErr := HttpGet(url);
if httpGetErr != nil {
err = httpGetErr;
return;
}
// 标题<h1>标题</h1> 只取1个
re := regexp.MustCompile(`<h1>(?s:(.*?))</h1>`);
if re == nil {
err = fmt.Errorf("%s", "regexp.MustCompile err");
return;
}
// 取标题
tempTitle := re.FindAllStringSubmatch(result, 1);
for _, data := range tempTitle {
title = trimStr(data[1]);
break;
}
// 内容<div class="content-txt pt10">内容<a id="prev" 只取1个
re2 := regexp.MustCompile(`<div class="content-txt pt10">(?s:(.*?))<a id="prev"`);
if re2 == nil {
err = fmt.Errorf("%s", "regexp.MustCompile err");
return;
}
// 取内容
tempContent := re2.FindAllStringSubmatch(result, 1);
for _, data := range tempContent {
content = trimStr(data[1]);
break;
}
//
return;
}
func HttpGet(url string) (result string, err error) {
resp, httpGetErr := http.Get(url);
if httpGetErr != nil {
return "", httpGetErr;
}
//
defer resp.Body.Close();
//
buf := make([]byte, 1024*4);
result = "";
for {
n, respReadErr := resp.Body.Read(buf);
if n == 0 { // 读取结束或者出问题
if respReadErr == io.EOF {
fmt.Println("GET读取结束");
} else {
fmt.Println("respReadErr =", respReadErr);
}
break;
}
//
result += string(buf[:n]);
}
return result, nil;
}
func trimStr(str string) string {
str = strings.Replace(str, "\t", "", -1);
str = strings.Replace(str, "\n", "", -1);
str = strings.Replace(str, "\r", "", -1);
str = strings.Replace(str, "<br />", "", -1);
str = strings.Replace(str, " ", "", -1);
//
return str;
}
func saveJoys(page int, fileTitles, fileContents []string) {
f, fileErr := os.Create("./iofiles/joy-" + strconv.Itoa(page) + ".txt");
if fileErr != nil {
fmt.Println("or.Create err =", fileErr);
return;
}
defer f.Close();
//
length := len(fileTitles);
for i := 0; i < length; i++ {
// 正式写入
_, fileWriteErr := f.WriteString(fileTitles[i] + "\r\n" + fileContents[i] + "\r\n\r\n");
if fileWriteErr != nil {
fmt.Println("WriteString err =", fileWriteErr);
continue;
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
20个小时快速入门go语言 源码
共125个文件
go:124个
gitignore:1个
需积分: 5 0 下载量 46 浏览量
2024-02-29
21:23:52
上传
评论
收藏 69KB ZIP 举报
温馨提示
20个小时快速入门go语言 手打源码 https://www.bilibili.com/video/BV1UW411x7Ve/?spm_id_from=333.999.0.0&vd_source=f20343deebdd19ca1e28efddcc5452c1
资源推荐
资源详情
资源评论
收起资源包目录
20个小时快速入门go语言 源码 (125个子文件)
.gitignore 30B
77_段子爬虫.go 5KB
77A_段子爬虫(并发版).go 4KB
72_并发聊天服务器.go 4KB
54_设备文件操作.go 2KB
76A_百度贴吧爬虫(并发版).go 2KB
76_百度贴吧爬虫.go 2KB
50_字符串.go 2KB
07A-server2.go 2KB
69_TCP-Server.go 2KB
53_json解析.go 2KB
71_文件-Sender.go 1KB
69A_TCP-Client.go 1KB
71A_文件-Receiver.go 1KB
31A_猜数字2.go 1KB
62_无缓存通道.go 1KB
13-surface.go 1KB
55_文件复制.go 1KB
45_接口.go 1KB
47_空接口与类型断言.go 1005B
29_冒泡排序.go 968B
19-sha256.go 956B
07B-Lissajous.go 945B
16_回调函数.go 937B
52-json.go 921B
63_有缓存通道.go 883B
32_map.go 881B
14-mandelbrot.go 880B
05-Lissajous.go 862B
61_通道.go 853B
51_正则表达式.go 837B
74_http服务器.go 837B
30_切片.go 835B
67_Select.go 815B
06A-fetchall.go 789B
18-netflag.go 771B
14A_不定参数类型.go 750B
46_接口的继承.go 741B
64_单向通道.go 726B
43_方法的继承与重写.go 711B
38_匿名字段.go 694B
65_Timer.go 647B
44_方法值和方法表达式.go 624B
73_http请求.go 623B
04A-maxinput.go 618B
11B-convrun.go 615B
31_猜数字.go 604B
75_http客户端.go 601B
41_面向对象函数.go 599B
52A-struct_tag.go 599B
33_结构体.go 574B
36_结构体作为函数参数.go 560B
68_Select超时机制.go 540B
17_匿名函数.go 538B
48_error.go 529B
31_切片扩容特点.go 529B
65A_Timer的停止和重置.go 525B
42_值语义和引用语义.go 480B
24_指针.go 474B
27_二维数组.go 443B
16-comma.go 441B
40_指针类型匿名字段.go 437B
57_gosched.go 425B
26_数组.go 425B
test.go 421B
73A_测试服务器.go 420B
19_defer.go 401B
06-fetch.go 392B
39_匿名字段2.go 387B
35_结构体比较.go 383B
14_不定参数函数.go 375B
12-popcount.go 375B
11A_switch实验.go 368B
56_goroutine.go 365B
58_goexit.go 365B
70_文件.go 358B
15A_通过递归实现累加.go 356B
60_资源竞争.go 352B
28_随机数的使用.go 352B
02_变量.go 351B
17-printints.go 345B
11-temperature.go 344B
08-FtoC.go 343B
07-server.go 334B
08A-CtoF.go 326B
20_defer实验.go 320B
15-basename.go 310B
06_多重变量赋值.go 305B
01_HelloWorld.go 303B
49_recover.go 293B
09-Pointer.go 288B
12_for和range的使用.go 280B
05_常量.go 279B
04-dup.go 263B
07_iota枚举.go 261B
59_多核并发.go 256B
04_多重赋值.go 254B
10-flag.go 251B
34_结构体指针变量.go 250B
13_goto的使用.go 248B
共 125 条
- 1
- 2
资源评论
BUG弄潮儿
- 粉丝: 2575
- 资源: 93
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功