package mainimport ("fmt""strconv""net/http""regexp""strings""os"
)//地址的规律
//第一页:https://www.pengfu.com/xiaohua_1.html
//第二页:https://www.pengfu.com/xiaohua_2.html
//第三页:https://www.pengfu.com/xiaohua_3.html//查看每个页面的源码,可以看到标题的“<h1 class="dp-b"><a href="”有10个,它的实际搜索条件为<h1 class="dp-b"><a href="段子的地址"
//进行到段子的地址后,有两个h1,就是标题,但是我在使用的时候发现网页里有两个地方使用了h1的标签,后面过滤一下,只
//可能过滤到两个,只取一个
//内容开头<div class="content-txt pt10"> 结尾<a id="prev" href="https://www.pengfu.com/content_1850587_1.html"></a>

func HttpGet(url string) (result string, err error) {resp, err1 := http.Get(url)if err1 != nil {err = err1return}defer resp.Body.Close()  //关闭//读取网络内容buf := make([]byte, 4*1024)for true {n, _ := resp.Body.Read(buf)if n == 0 {break}result += string(buf[:n])//累加读取的内容
    }return
}func SpiderOneJoy(url string) (title, content string, err error) {//爬取页面内容result, err1 := HttpGet(url)if err1 != nil {fmt.Println("SpiderOneJoy HttpGet err = ", err)err = err1return}//取关键信息,标题re1 := regexp.MustCompile(`<h1>(.*?)</h1>`)if re1 == nil {err = fmt.Errorf("%s", "SpiderOneJoy regexp.MustCompile err ")return}//取内容tmpTitle := re1.FindAllStringSubmatch(result, 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}//取关键信息,内容re2 := regexp.MustCompile(`<div class="content-txt pt10">(?s:(.*?))<a id="prev" href="`)if re2 == nil {err = fmt.Errorf("%s", "SpiderOneJoy regexp.MustCompile err ")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, "\t", "", -1)content = strings.Replace(content, "<br>", "", -1)content = strings.Replace(content, "<br/>", "", -1) //这种方式不太好,肯定有更好的办法break}return
}func StoreJoyToFile(i int, fileTitile, 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(fileTitile)for i := 0; i < n; i++{//写标题f.WriteString(fileTitile[i] + "\n")//写内容f.WriteString(fileContent[i] + "\n")f.WriteString("--------------------------------------\n")}
}func SpiderPage(i int, page chan <- int)  {url := "https://www.pengfu.com/xiaohua_" + strconv.Itoa(i) + ".html"fmt.Printf("正在爬取%s\n", url)//爬取页面内容result, err := HttpGet(url)if err != nil {fmt.Println("HttpGet err = ", err)return}//fmt.Println("r = ", result)//取内容<h1 class="dp-b"><a href="”有10个,它的实际搜索条件为<h1 class="dp-b"><a href="段子的地址",这里只需要地址内容re := regexp.MustCompile(`<h1 class="dp-b"><a href="(.*?)"`)if re == nil {fmt.Println("regexp.MustCompile err ")return}//解析表达式、并取关键信息joyUrls := re.FindAllStringSubmatch(result, -1)fileTitle := make([]string, 0)fileContent := make([]string, 0)//fmt.Println("url = ", joyUrls)//取网址,遍历后第一个返回下标,这里不要,第二个返回内容for _, data := range joyUrls{fmt.Println("data = ", data[1])//爬取每一个段子title, content, err := SpiderOneJoy(data[1])//它应该返回标题和内容,并可能会有报错,共三个返回值if err != nil {fmt.Println("SpiderOneJoy err ", err)continue}//fmt.Printf("title = #%v#\n", title)//使用这种方式打印就能看到结果里是否包含一些空格//fmt.Printf("content = #%v#\n", content)fileTitle = append(fileTitle, title) //将所有的标题放在一个切片里fileContent = append(fileContent, content) //将所有的内容放在一个内容里
    }//将内容写入到文件
    StoreJoyToFile(i, fileTitle, fileContent)page <- i //告诉程序是哪一页爬完了
}func DoWork(start, end int)  {fmt.Printf("准备爬取第%d页到第%d页的网址\n", start, end)page := make(chan int)for i:=start; i<=end; i++ {//定义一个函数,爬主页面
        go SpiderPage(i, page)}for i:=start; i<=end; i++ {fmt.Printf("第%d个页面爬取完成", <-page)}
}func main() {var start, end intfmt.Printf("请输入起始页>=1:> ")fmt.Scan(&start)fmt.Printf("请输入结束页:> ")fmt.Scan(&end)DoWork(start, end)
}

转载于:https://www.cnblogs.com/baylorqu/p/9707620.html

[GO]并的爬取捧腹的段子相关推荐

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

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

  2. java爬取捧腹网段子

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

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

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

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

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

  5. java的段子_java爬取捧腹网段子(多线程版)

    上一篇文章讲述了如何使用Java爬取内容并写入文件,但是速度堪忧,今天将代码搞成了多线程版本, 具体方式如下: 新建一个splider类,继承callable接口,用于存放我们需要多线程执行的逻辑: ...

  6. python爬取捧腹网gif图片

    #_*_coding:utf-8_*_ #爬取捧腹网GIF图片 import urllib,re import urllib.request import chardet #需要导入这个模块,检测编码 ...

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

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

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

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

  9. 转 Python爬虫实战一之爬取糗事百科段子

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

最新文章

  1. 2018.10.22-dtoi1443奶牛逃亡(cowrun)
  2. Python 哪种方式循环最快,或许颠覆你的认知
  3. 多组两两比较用什么检验方法_用SPSS进行不同变量多组间两两比较卡方检验.pdf...
  4. amazon云服务_亚马逊Simple Worklfow服务的骆驼演示
  5. 将本地源代码程序推送远程Github仓库
  6. 机器人总动员中的小草_机器人总动员读后感
  7. vue中如何实现用JavaScript调用函数的方式使用一个通用的通知组件
  8. 计算机协会未来的发展,计算机协会
  9. java模拟键盘操作,java自动化操作
  10. matlab仿真数字电路,基于matlab的数字逻辑电路仿真
  11. 菜鸟站长之家收集分享一些比较出名的外链发布地址
  12. docker搭建sftp服务器
  13. Beyond Compare 30天评估期结束解决办法
  14. 工作中常用的27个Excel函数公式
  15. #9733;如何解释特修斯之船问题?
  16. Ubuntu论坛的开通
  17. 《管理者必读12篇》如何购买
  18. AI三大主义:符号主义、联结主义、行为主义
  19. 机器学习思维导图(更新中)
  20. 【其他】记录这次曲折的域名选择及搜索引擎seo优化的过程

热门文章

  1. 看到刷机的东西就冲动,过年的时候把psp刷坏了,以后找台路由器刷着玩
  2. COMET彗星(一)SERVER PUSH介绍
  3. 洛谷P4124 [CQOI2016]手机号码
  4. 网易BOBO:在互联网上建设娱乐梦工场
  5. XenDesktop vDisk更新Error Field Format错误
  6. 什么软件可以把照片变成漫画?试试这几款图片处理工具
  7. 漫谈WinCE的手写识别技术 一
  8. 语音合成-声学概念和变声变调
  9. 故障排除经验——Win10文件关联(文件的默认打开方式)修改不了
  10. 中文依存句法分析接口