最后我们来进行一次网络段子的爬虫,爬取捧腹网的段子数据

1.爬取网页的段子链接:

程序代码:

package mainimport ("fmt""net/http""regexp""strconv"
)func Duanzi_HttpGet(url string) (result string, err error) {resp, err1 := http.Get(url) //发送get请求if err1 != nil {err = err1return}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 Duanzi_SpiderPage(i int) {//爬取的url--https://www.pengfue.com/xiaohua_1.htmlurl := "https://www.pengfue.com/xiaohua_"+strconv.Itoa(i)+".html"fmt.Printf("正在爬取第%d个网页:%s\n", i, url)//开始爬取页面内容result, err := Duanzi_HttpGet(url)if err != nil {fmt.Println("Duanzi_HttpGet err = ",err)return}//取    <h1 class="dp-b"><a href="   段子url地址  "=====>>>正则表达式//解释表达式re := regexp.MustCompile(`<h1 class="dp-b"><a href="(?s:(.*?))"`)if re == nil {fmt.Println("regexp.MustCompile err")return}//取关键信息===>>每一页的段子链接组成一个切片joyUrls := re.FindAllStringSubmatch(result, -1)//取网址//第一个返回下标,第二个返回内容for _, data := range joyUrls {fmt.Println("url = ", data[1])}
}func Duanzi_DoWork(start ,end int) {fmt.Println("准备爬取第%d页到%d页的网址",start, end)for i := start; i <= end; i++ {//定义一个函数爬取页面Duanzi_SpiderPage(i)}
}func main()  {var start, end intfmt.Println("输入爬取的起始页(>=1)")fmt.Scan(&start)fmt.Println("输入爬取的终止页(>=start)")fmt.Scan(&end)Duanzi_DoWork(start,end)
}

运行结果:

2.爬取每一个段子的标题和内容,并存储进文件:

程序代码:

package mainimport ("fmt""net/http""os""regexp""strconv""strings"
)func Duanzi_HttpGet(url string) (result string, err error) {resp, err1 := http.Get(url) //发送get请求if err1 != nil {err = err1return}defer resp.Body.Close()//读取网页内容buf := make([]byte, 1024*4)for {n, _ := resp.Body.Read(buf)if n == 0 {break}result += string(buf[:n])    //累加读取内容}return
}//开始爬取每一个笑话,每一个段子 title, content, err := SpiderOneJoy(url)
func SpiderOneJoy(url string) (title, content string, err error) {//开始爬取页面内容result, err1 := Duanzi_HttpGet(url)if err1 != nil {//     fmt.Println("HttpGet err = ", err)err = err1return}/**取关键信息*///1.取标题====》》<h1>标题</h1>  只取一个re1 := regexp.MustCompile(`<h1>(?s:(.*?))</h1>`)if re1 == nil {err = fmt.Errorf("%s", "regexp.MustCompile err")return}//存储标题tmpTitle := re1.FindAllStringSubmatch(result, 1)      //最后一个参数为 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}//取内容====》》<div class="content-txt pt10">内容<a id="prev" href="re2 := regexp.MustCompile(`<div class="content-txt pt10">(?s:(.*?))<a id="prev" href="`)if re2 == nil {err = fmt.Errorf("%s", "regexp.MustCompile err2")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, "<br />", "", -1)content = strings.Replace(content, "&nbsp;", "", -1)break}return
}//把内容写入文件
func 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])f.WriteString("\n############################################################\n")}
}func Duanzi_SpiderPage(i int, page chan int) {//爬取的url--https://www.pengfue.com/xiaohua_1.htmlurl := "https://www.pengfue.com/xiaohua_"+strconv.Itoa(i)+".html"fmt.Printf("正在爬取第%d个网页:%s\n", i, url)//开始爬取页面内容result, err := Duanzi_HttpGet(url)if err != nil {fmt.Println("Duanzi_HttpGet err = ",err)return}//取    <h1 class="dp-b"><a href="   段子url地址  "=====>>>正则表达式//解释表达式re := regexp.MustCompile(`<h1 class="dp-b"><a href="(?s:(.*?))"`)if re == nil {fmt.Println("regexp.MustCompile err")return}//取关键信息===>>每一页的段子链接组成一个切片joyUrls := re.FindAllStringSubmatch(result, -1)//定义切片fileTitle := make([]string, 0)fileContent := make([]string, 0)//取网址//第一个返回下标,第二个返回内容for _, data := range joyUrls {//开始爬取每一个笑话,每一个段子title, content, err := SpiderOneJoy(data[1])if err != nil {fmt.Println("SpiderOneJoy err = ", err)continue}//fmt.Println("title = ", title)//fmt.Println("content = ", content)fileTitle = append(fileTitle, title)       //追加标题fileContent = append(fileContent, content) //追加内容}//把内容写入文件StoreJoyToFile(i, fileTitle, fileContent)page <- i //写内容,写num
}func Duanzi_DoWork(start ,end int) {fmt.Printf("准备爬取第%d页到%d页的网址",start, end)//添加管道,是程序知道哪个页面完成page := make(chan int)for i := start; i <= end; i++ {//定义一个函数,爬取主页面go Duanzi_SpiderPage(i, page) //只加go是不行的,程序执行太快,完了就死了}for i := start; i <= end; i++ {fmt.Printf("第%d个页面爬取完成\n", <-page)}
}func main()  {var start, end intfmt.Println("输入爬取的起始页(>=1)")fmt.Scan(&start)fmt.Println("输入爬取的终止页(>=start)")fmt.Scan(&end)Duanzi_DoWork(start,end)
}

运行结果:

Go语言段子爬虫--捧腹网相关推荐

  1. go 实战并发爬虫(捧腹网)

    package mainimport ("fmt""strconv""net/http""regexp""st ...

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

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

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

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

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

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

  5. java爬取捧腹网段子

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

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

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

  7. java爬取捧腹网段子(多线程版)

    前文链接 : java爬取捧腹网段子 上一篇文章讲述了如何使用Java爬取内容并写入文件,但是速度堪忧,今天将代码搞成了多线程版本, 具体方式如下: 新建一个splider类,继承callable接口 ...

  8. java 段子_java爬取捧腹网段子

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

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

    APP原型设计 在APP的开发过程中,原型设计是必不可少的.用户界面原型必须在先启阶段的初期或在精化阶段一开始建立.整个系统(包括它的"实际"用户界面)的分析.设计和实施必须在原型 ...

最新文章

  1. perl导入文本至mysql_Perl 脚本实现MySQL 异机导入导出-阿里云开发者社区
  2. Gym 101606 F-Flipping Coins(概率dp)
  3. Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】
  4. Ext.LoadMask遮罩的效果几种实现方式
  5. 轻松构建基于 Serverless 架构的弹性高可用视频处理系统
  6. Year-End Review
  7. python两个 list 获取交集,并集,差集的方法
  8. jmeter 压力测试教程全解
  9. matlab colormap详解 (2
  10. SpringMVC设置不拦截静态资源css,js
  11. kinect 2.0 SDK-深度图与彩色图对齐
  12. ISO18000-6B和ISO18000-6C(EPC C1G2)标准的优点区别
  13. javascript常用校验器
  14. 计算机出现测试模式,win10系统右下角显示测试模式内部版本10601的详细步骤
  15. 街头篮球上读取服务器维护,《街头篮球》九月新版引入超级服务器
  16. 李嘉诚80个人生经典语录
  17. Scala-Day13
  18. 基于U3D的VR开发教程:(1)基础环境配置
  19. 计算机信息管理基础考试试题及答案,计算机信息管理基础复习题A及答案
  20. html银河特效编码,html5 canvas银河星系动画特效

热门文章

  1. H3C 交换机重置console密码
  2. python 读入文件列表_Python将文件读入列表
  3. 骁龙820A:座舱域控制器介绍
  4. 基于51单片机的水箱水位监测控制系统proteus仿真原理图PCB
  5. 安装HeidiSQL
  6. linux更换内核后无法启动,am437更换内核无法启动
  7. CAD坐标有哪些输入方式?来看看这些CAD坐标输入方式!
  8. 详细实例全面解析SQL存储过程
  9. Gis-ArcGis简单加载地图信息
  10. Open-falcon 通过docker方式进行安装部署