package mainimport ("fmt""strconv""net/http""regexp""strings""os"
)func main() {var start,end intfmt.Printf("请输入起始页( >= 1) :")fmt.Scan(&start)fmt.Printf("请输入终止页( >= 起始页) :")fmt.Scan(&end)DoWork(start,end) //工作函数
}func DoWork(start,end int) {fmt.Printf("准备爬取第%d页到%d页的网址\n", start, end)page := make(chan int)for i:= start; i<= end; i++{//定义一个函数 并发 爬主页面go SpiderPape(i,page)}for i:= start; i<= end;i++{fmt.Printf("第%d个页面爬取完成\n", <-page)}
}func SpiderPape(i int, page chan int) {url := "https://www.pengfu.com/xiaohua_"+ strconv.Itoa(i) + ".html"fmt.Printf("正在爬取第%d个网页:%s\n", i, url)//开始爬取页面内容result,err:= HttpGet(url)if err != nil{fmt.Println("HttpGet err = ",err)return}//写正则过滤 urlre := regexp.MustCompile(`<h1 class="dp-b"><a href="(?s:(.*?))"`)if re == nil{fmt.Println("regexp.MustCompile err")return}//取关键信息joyUrls := re.FindAllStringSubmatch(result, -1)fmt.Println("joyUrls = ", joyUrls)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}fileTitle = append(fileTitle, title)       //追加内容fileContent = append(fileContent, content) //追加内容}fmt.Println("fileTitle= ", fileTitle)fmt.Println("fileContent= ", fileContent)//把内容写入到文件StoreJoyToFile(i, fileTitle, fileContent)page <- i //写内容,写num
}func StoreJoyToFile(num int, fileTitle, fileContent []string)  {//新建文件f, err := os.Create(strconv.Itoa(num) + ".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] + "\n")f.WriteString("\n=================================================================\n")}
}//开始爬取每一个笑话,每一个段子 title, content, err := SpiderOneJoy(url)
func SpiderOneJoy(url string)  (title,content string, err error){//开始爬取页面内容result,err1 := HttpGet(url)if err1!= nil{err = err1return}//取关键信息//取标题  <h1>  标题 </h1>  只取1个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, "\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 {//fmt.Println("regexp.MustCompile err")err = fmt.Errorf("%s", "regexp.MustCompile err2")return}//取内容tmpContent := re2.FindAllStringSubmatch(result, -1)for _, data := range tmpContent {content = data[1]content = strings.Replace(content, "\t", "", -1)content = strings.Replace(content, "\n", "", -1)content = strings.Replace(content, "\r", "", -1)content = strings.Replace(content, "<br />", "", -1)break}return
}func 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, 4*1024)for{n,_:= resp.Body.Read(buf)if n == 0{break}result += string(buf[:n]) //累加读取内容}return
}

go 实战并发爬虫(捧腹网)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

    "捧腹网"页面结构分析 捧腹网M站地址: http://m.pengfu.com/ 捧腹网M站部分截图:      从截图中(可以直接去网站看下),我们可以看出,该网站相对简单,一 ...

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

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

  9. java爬取捧腹网段子

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

最新文章

  1. linux kernel and user space通信机制,Linux内核与用户空间通信机制研究.pdf
  2. 【oracle】oracle经典sql,exception,database link纠错
  3. 转:MVC3系列:~Html.BeginForm与Ajax.BeginForm
  4. 大学计算机用的笔记本,推荐一款大学生用笔记本电脑
  5. Log4net数据表
  6. matlab 归一化_机器学习中如何用Fscore进行特征选择(附Matlab代码)
  7. 旧版eclipse安装maven_厉害!Eclipse 已经开始可以支持 Java 14~
  8. PAT-乙级-1016 部分A+B
  9. 想要改变自己,请先突破这3个自我限制
  10. java中日历类的用法_java日期类的用法
  11. 上市公司风险预警案例可视化演示系统(附代码)
  12. 关于pandas的安装
  13. idea中使用eclipse快捷键的常用快捷键
  14. 中国区块链专利数量全球第一 BAT专利数稳居世界20强
  15. 号外,号外,《React Native移动开发实战》出版啦
  16. windows 安装SNMP MIB Browser
  17. PHP Class各种方法和类的使用
  18. [ML](回归和分类)
  19. PHP函数array_intersect_assoc
  20. 百城百店 宝瓷林.北京SKP商场品牌店开业

热门文章

  1. JavaScript基础-逗号和三目运算符
  2. SQLMap 使用详解
  3. 解决windows未识别的网络问题
  4. sqlserver当前属于哪个季度_sqlserver 日期比较、日期查询常用语句:月的第一天,季度的第一天等...
  5. 以中国纳税表为标准逻辑练习
  6. 苹果安装移动卡显示无服务器,sim卡没坏但苹果手机无服务
  7. MATLAB生成随机点
  8. 隐私成“皇帝的新衣”,大数据时代谁能成用户隐私的保护伞?
  9. Easydict 简洁易用的翻译词典,带你轻松优雅地查找单词或翻译文本。
  10. Vue代理解决生产环境跨域问题 部署必备干货