Go语言段子爬虫--捧腹网
最后我们来进行一次网络段子的爬虫,爬取捧腹网的段子数据
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, " ", "", -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语言段子爬虫--捧腹网相关推荐
- go 实战并发爬虫(捧腹网)
package mainimport ("fmt""strconv""net/http""regexp""st ...
- python3制作捧腹网段子页爬虫
0x01 春节闲着没事(是有多闲),就写了个简单的程序,来爬点笑话看,顺带记录下写程序的过程.第一次接触爬虫是看了这么一个帖子,一个逗逼,爬取煎蛋网上妹子的照片,简直不要太方便.于是乎就自己照猫画虎, ...
- python爬虫之爬取捧腹网段子
原文链接:http://www.nicemxp.com/articles/12 背景:抓取捧腹网首页的段子和搞笑图片链接 如图: 地址:https://www.pengfu.com/ 首页中有很多子页 ...
- Golang实现并发版网络爬虫:捧腹网段子爬取并保存文件
爬取捧腹网段子 url分页分析 https://www.pengfu.com/xiaohua_1.html 1 下一页+1 https://www.pengfu.com/xiaohua_2.html ...
- java爬取捧腹网段子
先上效果图: 准备工作: /*** 建立http连接*/ public static String Connect(String address) {HttpURLConnection conn = ...
- Go语言之进阶篇爬捧腹网
1.爬捧腹网 网页规律: https://www.pengfu.com/xiaohua_1.html 下一页 +1 https://www.pengfu.com/xiaohua_2.html 主页 ...
- java爬取捧腹网段子(多线程版)
前文链接 : java爬取捧腹网段子 上一篇文章讲述了如何使用Java爬取内容并写入文件,但是速度堪忧,今天将代码搞成了多线程版本, 具体方式如下: 新建一个splider类,继承callable接口 ...
- java 段子_java爬取捧腹网段子
先上效果图: 准备工作: /** * 建立http连接 */ public static String Connect(String address) { HttpURLConnection conn ...
- Android实战:手把手实现“捧腹网”APP(二)-----捧腹APP原型设计、实现框架选取
APP原型设计 在APP的开发过程中,原型设计是必不可少的.用户界面原型必须在先启阶段的初期或在精化阶段一开始建立.整个系统(包括它的"实际"用户界面)的分析.设计和实施必须在原型 ...
最新文章
- perl导入文本至mysql_Perl 脚本实现MySQL 异机导入导出-阿里云开发者社区
- Gym 101606 F-Flipping Coins(概率dp)
- Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】
- Ext.LoadMask遮罩的效果几种实现方式
- 轻松构建基于 Serverless 架构的弹性高可用视频处理系统
- Year-End Review
- python两个 list 获取交集,并集,差集的方法
- jmeter 压力测试教程全解
- matlab colormap详解 (2
- SpringMVC设置不拦截静态资源css,js
- kinect 2.0 SDK-深度图与彩色图对齐
- ISO18000-6B和ISO18000-6C(EPC C1G2)标准的优点区别
- javascript常用校验器
- 计算机出现测试模式,win10系统右下角显示测试模式内部版本10601的详细步骤
- 街头篮球上读取服务器维护,《街头篮球》九月新版引入超级服务器
- 李嘉诚80个人生经典语录
- Scala-Day13
- 基于U3D的VR开发教程:(1)基础环境配置
- 计算机信息管理基础考试试题及答案,计算机信息管理基础复习题A及答案
- html银河特效编码,html5 canvas银河星系动画特效