package main

import (
"fmt"
"net/http"
"os"
"regexp"
"strings"
) var urls = "https://www.pengfu.com/xiaohua_%d.html" func DoHttpGet(urls string) (str string) { //创建一个Client
client := &http.Client{} //使用指定的方法、网址和可选的主题创建并返回一个新的*Request
request, err := http.NewRequest("GET", urls, nil)
if err != nil {
fmt.Println(err)
}
//添加请求头
request.Header.Add("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1")
response, _ := client.Do(request) defer response.Body.Close()
buf := make([]byte, 1024*10)
for {
n, _ := response.Body.Read(buf)
if n == 0 {
break
}
str += string(buf[:n])
}
return
} func SaveDataToLocal(index int, c chan<- int) {
//网络请求
str := DoHttpGet(fmt.Sprintf(urls, index))
//正则匹配所有的网址
regex := regexp.MustCompile(`<h1 class="dp-b"><a href="(.*?)" target="_blank">`)
findResult := regex.FindAllStringSubmatch(str, -1) var writeStr []string
//便利当前页所有的网址
for _, data := range findResult {
fmt.Println(data[1])
//网络请求详情页面
s := DoHttpGet(data[1])
//正则匹配标题
titleRegex := regexp.MustCompile(`<h1>(.*)</h1>`)
titleResult := titleRegex.FindAllStringSubmatch(s, 1)
title := strings.TrimSpace(titleResult[0][1]) //正则匹配内容
contentRegex := regexp.MustCompile(`<div class="content-txt pt10">\s?\n?(.*)<a`)
contentResult := contentRegex.FindAllStringSubmatch(s, 1)
content := strings.TrimSpace(contentResult[0][1]) //将标题与内容存到切片
writeStr = append(writeStr, fmt.Sprintf(`{"title": "%s", "content" : "%s"}`, title, content))
}
//创建json文件
f, err := os.Create(fmt.Sprintf("./page/%d.json", index))
if err != nil {
fmt.Println(err)
}
defer f.Close()
//将数据写入文件
f.WriteString(strings.Join(writeStr, ",") + "\n") //通知主协程爬取完毕
c <- index
} func ToDoWork(start, end int) {
//创建通道:通知每页爬取完毕
c := make(chan int)
//每一页都创建一个协程
for i := start; i <= end; i++ {
//将每一页数据保存到文件中
go SaveDataToLocal(i, c)
} for i := start; i <= end; i++ {
//阻塞等待协程通知
fmt.Printf("第%d页爬取完成\n", <-c)
}
} func main() {
//输入开始页与结束页
var start, end int
fmt.Print("请输入开始页码:")
fmt.Scan(&start)
if start <= 0 {
fmt.Println("参数不正确,请输入大于0的数字")
return
}
fmt.Print("请输入结束页码:")
fmt.Scan(&end)
if start > end {
fmt.Println("参数不正确,结束页码必须大于开始页码")
} //逻辑处理函数
ToDoWork(start, end)
}

运行:

结果:

{"title": "都是二胎惹的祸", "content" : "&nbsp; &nbsp; 小区门口修车师傅生意特好。人实在,只要不换零件,常常不收钱或只收个块把钱辛苦钱。最近发现他心黑了,价钱明显上调,就连充个气也收1块钱。旁边书报亭大妈是知情人,: 唉,多担待一下吧!他家上个月二胎,一窝生了四个带把的。。。。"},{"title": "讨价还价", "content" : "去小卖部买烟,10块钱一盒的,给老板100,老板喜咪咪的看着我说:“我没零钱找你,就让我闺女陪你一晚抵账得了。”我一激动:“你老别介啊,我攒个私房钱出来偷偷买烟,真的很不容易啊!”老板:“怎么,你不愿意?要不然我去把我闺女叫出来!”我:“别!别!这钱你不用找了,千万别让您闺女知道我藏私房钱啊!”老板:“好女婿,只要你经常来买东西,我保证不说!哈哈哈”"},{"title": "猪没事就是涨价了", "content" : "前天和同事去逛超市,说好久没买肉吃了,于是去看猪肉,结果看到的最便宜的猪肉都要十八块多,同事当场惊呼:“猪怎么了,这是!”卖肉的师傅笑着说:“猪没事,就是涨价了。”"},{"title": "心宽", "content" : "刚才在QQ上有个还在上大学的姑娘突然跟我讲:“朋友介绍我去打工,今天晚上要到一个酒吧领舞,现在有点不敢去。”我:“有什么不敢去的?”姑娘:“刚才在小摊上只吃了碗牛肉面,怕到时候饿。”──姑娘,你心太宽了!"},{"title": "缺心眼", "content" : "昨天路过单位餐厅门口的金鱼池,正好看到一条小金鱼蹦到外边了,还在张嘴,就捡起来扔到池子里。回到家跟老婆聊天时随口说起,老婆抱怨着说,“我说你个缺心眼的,怎么不去向它要幢别墅呢!”"},{"title": "贵重物品", "content" : "下车时导游小姐说:“请带好您的贵重物品。”他拉着我的手说:“快走,贵重物品。”"},{"title": "镇静剂", "content" : "医生:“去给那位今天出院的病人注射一针镇静剂。”护士不解:“都可以出院了,还打镇静剂干嘛?”医生:“等下要结账,我怕他受不了!”"},{"title": "欢迎下次再来", "content" : "我一大学同学毕业后搞了一年营销,发奋考上公务员,分到民政局婚姻登记处。头天上班,一大早就来了对新人登记,那男的客气,给了一包烟和一包糖,同学很激动,麻利的办好手续,起身握手送别,很有礼貌地说了句:欢迎下次再来。"},{"title": "我们在睡觉", "content" : "公司一女同事中午外出吃饭。手机落公司,然后她老公一个劲的打电话,旁边一哥们吃完午睡,很是反感,在电话响起的第N回后,哥们很气愤的拿起电话,吼道:“我们在睡觉,你老打电话,烦不烦。”不一会儿办公室门口就出现了个男的。"},{"title": "不白之冤", "content" : "老先生已有60多岁,而头发胡须却都是黑的。朋友开玩笑地说:“如果用年龄为标准来衡量,您的头发胡须可说是抱冤受屈了!”老先生惊问何故,朋友答道:“它们蒙受了不白之冤呀。”"}

页数过多会比较慢,在第二次网络请求时可以创建协程解决,有代码优化的可以评论。

Go语言 之捧腹网爬虫案例的更多相关文章

  1. python3制作捧腹网段子页爬虫

    0x01 春节闲着没事(是有多闲),就写了个简单的程序,来爬点笑话看,顺带记录下写程序的过程.第一次接触爬虫是看了这么一个帖子,一个逗逼,爬取煎蛋网上妹子的照片,简直不要太方便.于是乎就自己照猫画虎, ...

  2. Go语言之进阶篇爬捧腹网

    1.爬捧腹网 网页规律: https://www.pengfu.com/xiaohua_1.html   下一页 +1 https://www.pengfu.com/xiaohua_2.html 主页 ...

  3. Android实战:手把手实现“捧腹网”APP(三)-----UI实现,逻辑实现

    Android实战:手把手实现"捧腹网"APP(一)-–捧腹网网页分析.数据获取 Android实战:手把手实现"捧腹网"APP(二)-–捧腹APP原型设计.实 ...

  4. Android实战:手把手实现“捧腹网”APP(二)-----捧腹APP原型设计、实现框架选取

    Android实战:手把手实现"捧腹网"APP(一)-–捧腹网网页分析.数据获取 Android实战:手把手实现"捧腹网"APP(二)-–捧腹APP原型设计.实 ...

  5. Android实战:手把手实现“捧腹网”APP(一)-----捧腹网网页分析、数据获取

    Android实战:手把手实现"捧腹网"APP(一)-–捧腹网网页分析.数据获取 Android实战:手把手实现"捧腹网"APP(二)-–捧腹APP原型设计.实 ...

  6. py3+urllib+re,爬虫下载捧腹网图片

    实现原理及思路请参考我的另外几篇爬虫实践博客 py3+urllib+bs4+反爬,20+行代码教你爬取豆瓣妹子图:http://www.cnblogs.com/UncleYong/p/6892688. ...

  7. 用go语言爬取珍爱网 | 第三回

    前两节我们获取到了城市的URL和城市名,今天我们来解析用户信息. 用go语言爬取珍爱网 | 第一回 用go语言爬取珍爱网 | 第二回 爬虫的算法: 我们要提取返回体中的城市列表,需要用到城市列表解析器 ...

  8. Yeoman 官网教学案例:使用 Yeoman 构建 WebApp

    STEP 1:设置开发环境 与yeoman的所有交互都是通过命令行.Mac系统使用terminal.app,Linux系统使用shell,windows系统可以使用cmder/PowerShell/c ...

  9. GO语言的进阶之路-爬虫进阶之路

    GO语言的进阶之路-爬虫进阶之路 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 网络爬虫是一种自动获取网页内容的程序,是搜索引擎的重要组成部分.我们今天要介绍的就是一个简单的网络爬 ...

随机推荐

  1. 设计模式(三)——装饰器模式(Decorator Pattern)

    发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装 ...

  2. POJ1484(Blowing Fuses)--简单模拟

    题目链接:http://poj.org/problem?id=1484 这题直接简单模拟即可.给你n个容器,m个操作,最大容量C.模拟每一个对器件的开关操作.如果原来是关闭的,则打开,同时最大功耗加上 ...

  3. 对SPI进行参数化结构设计

    前言 为了避免每次SPI驱动重写,直接参数化,尽量一劳永逸. SPI master有啥用呢,你发现各种外围芯片的配置一般都是通过SPI配置的,只不过有3线和四线. SPI slave有啥用呢,当外部主 ...

  4. 在Linux下执行Jmeter脚本

    前言 Jmeter这款接口测试工具,已经在越来越多的公司被要求会使用了. 而且,现在应该部分小伙伴们都开始用起来了. 但是,你们知道除了在Windows用图形化界面的Jmeter执行脚本之外,还有其他 ...

  5. K2 BPM_当BPM遇上RPA | 企业合规和风险管理从此更高效_全球领先的工作流引擎

    强化企业合规与风险管理已成为全球企业发展的共识,尤其是对于药企.银行.地产这类对于合规性要求高的企业而言,识别预测潜在的管理风险和遵循不断升级的合规义务,是保证企业平稳运行的关键. 如何从流程层面降低 ...

  6. mysql打印用户权限的小技巧

    mysql5.5 5.6 SHOW GRANTS FOR mysql> SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host ...

  7. Join 和 App

    在关系型数据库系统中,为了满足第三范式(3NF),需要将满足“传递依赖”的表分离成单独的表,通过Join 子句将相关表进行连接,Join子句共有三种类型:外连接,内连接,交叉连接:外连接分为:left ...

  8. golang的select实现原理剖析

    写在最前面 select为golang提供了多路IO复用机制,和其他IO复用一样,用于检测是否有读写事件是否ready. 本文将介绍一下golang的select的用法和实现原理. 实现原理 gola ...

  9. TSN(Temporal Segment Networks)

    一.算法详解 二.代码解析(pytorch版) 训练代码:https://blog.csdn.net/u014380165/article/details/79058147 测试代码:https:// ...

  10. http服务详解(2)——httpd的配置文件常见设置

    HTTP服务器应用 http服务器程序 httpd apache nginx lighttpd 应用程序服务器 IIS .asp tomcat .jsp jetty 开源的servlet容器,基于Ja ...