package mainimport ("fmt""net/http""os""regexp""strings"
)var urls = "https://www.pengfu.com/xiaohua_%d.html"func DoHttpGet(urls string) (str string) {//创建一个Clientclient := &http.Client{}//使用指定的方法、网址和可选的主题创建并返回一个新的*Requestrequest, 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 intfmt.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多岁,而头发胡须却都是黑的。朋友开玩笑地说:“如果用年龄为标准来衡量,您的头发胡须可说是抱冤受屈了!”老先生惊问何故,朋友答道:“它们蒙受了不白之冤呀。”"}

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

转载于:https://www.cnblogs.com/yang-2018/p/11176799.html

Go语言 之捧腹网爬虫案例相关推荐

  1. Go语言段子爬虫--捧腹网

    最后我们来进行一次网络段子的爬虫,爬取捧腹网的段子数据 1.爬取网页的段子链接: 程序代码: package mainimport ("fmt""net/http&quo ...

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

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

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

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

  4. python爬虫之爬取捧腹网段子

    原文链接:http://www.nicemxp.com/articles/12 背景:抓取捧腹网首页的段子和搞笑图片链接 如图: 地址:https://www.pengfu.com/ 首页中有很多子页 ...

  5. Golang实现并发版网络爬虫:捧腹网段子爬取并保存文件

    爬取捧腹网段子 url分页分析 https://www.pengfu.com/xiaohua_1.html 1 下一页+1 https://www.pengfu.com/xiaohua_2.html ...

  6. 安卓外包公司—捧腹网Android与iPhone客户端(最新上线案例分享)

         捧腹网是中国领先的幽默笑话分享网站,致力于提供一个分享各类幽默笑话,搞笑图片,动态图,搞笑视频,经典段子,冷笑话,冏人冏事等幽默内容的互动平台,为大家带去欢乐和笑声.让我们一起分享快乐,捧腹 ...

  7. java爬取捧腹网段子

    先上效果图: 准备工作: /*** 建立http连接*/ public static String Connect(String address) {HttpURLConnection conn = ...

  8. golang实现捧腹网爬取笑话

    爬虫的步骤见:here 以下golang代码实现对捧腹网笑话的爬取,并保存到本地的joy文件夹(程序会自行创建)内 package mainimport ("fmt""n ...

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

    APP页面实现 根据原型图,我们可以看出,UI分为两部分,底部Tab导航+上方列表显示. 所以此处,我们通过 FragmentTabHost+Fragment,来实现底部的导航页面,通过Recycle ...

最新文章

  1. 从杂技表演到日剧BGM(r12笔记第23天)
  2. C#高级编程9 第18章 部署
  3. [Frank kelly] 经济学理论对TCP的收敛性和公平性做出分析,从理论上论证了TCP在互联网环境下的稳定性和有效性
  4. 三维分子模型软件PyMOL
  5. 从Netty基础到聊天系统和RPC实战-卷二
  6. 阿里RocketMQ创始人首次分享出这份RocketMQ技术内木神级架构手册
  7. linux的idr机制
  8. 快手挂小黄车和快手小店有什么区别?如何开通快手小店?
  9. Cesium更换地球背景
  10. ORB特征和FAST关键点 笔记
  11. windowsXP源代码下载磁力链接,仅做保存!
  12. 树存储结构的几种表示方法
  13. 从少量访问日志还原黑客攻击过程
  14. 发那科机器人回原位置先上升_机器人小知识 | 发那科机器人位置信息修改介绍...
  15. babel5升级到babel6总结
  16. 微信小程序案例:获取微信访问用户的openid
  17. Source code license
  18. Insight.Numerics.inFlux.v1.0通风和气体扩散CFD软件
  19. HDR视频能不能在非HDR屏幕上播放呢
  20. 潮阳实验学校文件服务器,今天,潮阳实验学校发出!

热门文章

  1. 配置Sublime的C语言环境
  2. Linux Ubuntu 22.04安装Dash to Panel替换系统自带的dock panel
  3. 性能工具之Taurus使用(入门篇)
  4. 【武汉理工大学】软件工程总复习 知识点整合
  5. 算法-动态规划-股票交易
  6. 工时及资源管理:管理者五大挑战与解决方案
  7. 从密码学的角度看腾讯QQ通信协议
  8. Ubuntu搭建全分布式Hadoop
  9. 工程建设业主企业数字化管理解决方案
  10. 虚拟专用网协议之PPTP