Go语言之进阶篇爬捧腹网
1、爬捧腹网
网页规律:
https://www.pengfu.com/xiaohua_1.html 下一页 +1
https://www.pengfu.com/xiaohua_2.html
主页面规律:
<h1 class="dp-b"><a href=" 一个段子url连接 “
段子url:
<h1> 标题 </h1> 只取1个
<div class="content-txt pt10"> 段子内容 <a id="prew" href=">
2、爬捧腹网
示例: 并发版本
- package main
- import (
- "fmt"
- "net/http"
- "os"
- "regexp"
- "strconv"
- "strings"
- )
- func HttpGet(url string) (result string, err error) {
- resp, err1 := http.Get(url) //发送get请求
- if err1 != nil {
- err = err1
- return
- }
- defer resp.Body.Close()
- //读取网页内容
- buf := make([]byte, 4*1024)
- 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 := HttpGet(url)
- if err1 != nil {
- //fmt.Println("HttpGet err = ", err)
- err = err1
- return
- }
- //取关键信息
- //取标题 <h1> 标题 </h1> 只取1个
- re1 := regexp.MustCompile(`<h1>(?s:(.*?))</h1>`)
- if re1 == nil {
- //fmt.Println("regexp.MustCompile err")
- 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 {
- //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 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] + "\n")
- f.WriteString("\n=================================================================\n")
- }
- }
- func SpiderPape(i int, page chan int) {
- //明确爬取的url
- //https://www.pengfu.com/xiaohua_1.html
- 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
- }
- //fmt.Println("r = ", result)
- //取,<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)
- //fmt.Println("joyUrls = ", joyUrls)
- fileTitle := make([]string, 0)
- fileContent := make([]string, 0)
- //取网址
- //第一个返回下标,第二个返回内容
- for _, data := range joyUrls {
- //fmt.Println("url = ", data[1])
- //开始爬取每一个笑话,每一个段子
- title, content, err := SpiderOneJoy(data[1])
- if err != nil {
- fmt.Println("SpiderOneJoy err = ", err)
- continue
- }
- //fmt.Printf("title = #%v#", title)
- //fmt.Printf("content = #%v#", content)
- fileTitle = append(fileTitle, title) //追加内容
- fileContent = append(fileContent, content) //追加内容
- }
- //fmt.Println("fileTitle= ", fileTitle)
- //fmt.Println("fileContent= ", fileContent)
- //把内容写入到文件
- StoreJoyToFile(i, fileTitle, fileContent)
- page <- i //写内容,写num
- }
- 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 main() {
- var start, end int
- fmt.Printf("请输入起始页( >= 1) :")
- fmt.Scan(&start)
- fmt.Printf("请输入终止页( >= 起始页) :")
- fmt.Scan(&end)
- DoWork(start, end) //工作函数
- }
执行结果:
- D:\GoFiles\src\hello_01>go run get_pengfu.go
- 请输入起始页( >= 1) :1
- 请输入终止页( >= 起始页) :5
- 准备爬取第1页到5页的网址
- 正在爬取第5个网页:https://www.pengfu.com/xiaohua_5.html
- 正在爬取第2个网页:https://www.pengfu.com/xiaohua_2.html
- 正在爬取第3个网页:https://www.pengfu.com/xiaohua_3.html
- 正在爬取第4个网页:https://www.pengfu.com/xiaohua_4.html
- 正在爬取第1个网页:https://www.pengfu.com/xiaohua_1.html
- 第4个页面爬取完成
- 第3个页面爬取完成
- 第1个页面爬取完成
- 第5个页面爬取完成
- 第2个页面爬取完成
Go语言之进阶篇爬捧腹网的更多相关文章
- Go语言之进阶篇爬百度贴吧并发版
1.爬百度贴吧并发版 示例: package main import ( "fmt" "net/http" "os" "strco ...
- python3制作捧腹网段子页爬虫
0x01 春节闲着没事(是有多闲),就写了个简单的程序,来爬点笑话看,顺带记录下写程序的过程.第一次接触爬虫是看了这么一个帖子,一个逗逼,爬取煎蛋网上妹子的照片,简直不要太方便.于是乎就自己照猫画虎, ...
- Android实战:手把手实现“捧腹网”APP(三)-----UI实现,逻辑实现
Android实战:手把手实现"捧腹网"APP(一)-–捧腹网网页分析.数据获取 Android实战:手把手实现"捧腹网"APP(二)-–捧腹APP原型设计.实 ...
- Android实战:手把手实现“捧腹网”APP(二)-----捧腹APP原型设计、实现框架选取
Android实战:手把手实现"捧腹网"APP(一)-–捧腹网网页分析.数据获取 Android实战:手把手实现"捧腹网"APP(二)-–捧腹APP原型设计.实 ...
- Android实战:手把手实现“捧腹网”APP(一)-----捧腹网网页分析、数据获取
Android实战:手把手实现"捧腹网"APP(一)-–捧腹网网页分析.数据获取 Android实战:手把手实现"捧腹网"APP(二)-–捧腹APP原型设计.实 ...
- go语言之进阶篇接口转换
1.go语音之进阶篇 示例: package main import "fmt" type Humaner interface { //子集 sayhi() } type Pers ...
- go语音之进阶篇爬百度贴吧单线程版本
一.爬什么? 1.明确目标 : 知道你准备在那个范围或者网站去搜索 2.爬: 将所有的网站的内容全部爬下来 3.取:去掉对我们没用处的数据 4.处理数据:按照我们想要的方式存储或使用 二.百度贴吧小爬 ...
- go语言之进阶篇通过select实现斐波那契数列
一.select作用 Go里面提供了一个关键字select,通过select可以监听channel上的数据流动. select的用法与switch语言非常类似,由select开始一个新的选择块,每个选 ...
- go语言之进阶篇创建goroutine协程
1.goroutine是什么 goroutine是Go并行设计的核心.goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现 ...
随机推荐
- 初探Runloop(一)
iOS 的最大特点就是运行时. 保证运行时的就是RunLoop 1.什么是RunLoop呢? 从字面理解就是:运行循环 引用下官方文档的介绍: A run loop is an event proce ...
- php模板引擎之blade
一.简介模板引擎 模板引擎是将网站的页面设计和PHP应用程序几乎完全分离的一种解决方案,它能让前端工程师专注页面搭建,让后台工程师专注功能实现,以便实现逻辑分离,让每个人发挥所长.模板引擎技术的核心是 ...
- 洛谷P1220关路灯[区间DP 提前计算代价]
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- Codeforces.1040E.Network Safety(思路 并查集)
题目链接 \(Description\) 有一张\(n\)个点\(m\)条边的无向图,每个点有点权.图是安全的当且仅当所有边的两个端点权值不同.保证初始时图是安全的. 现在有权值为\(x\)的病毒,若 ...
- Using Dtrace OEL 6.X
http://www.hhutzler.de/blog/using-dtrace/ http://docs.oracle.com/cd/E37670_01/E38608/html/dt_sdtparg ...
- WinForm通用自动更新器AutoUpdater项目实战
一.项目背景介绍 最近单位开发一个项目,其中需要用到自动升级功能.因为自动升级是一个比较常用的功能,可能会在很多程序中用到,于是,我就想写一个自动升级的组件,在应用程序中,只需要引用这个自动升级组件, ...
- 玩一下C#的语音识别
在.NET4.0中,我可以借助System.Speech组件让电脑来识别我们的声音. 以上,当我说"name",显示"Darren",我说"age&q ...
- 迭代dict的value
我们已经了解了dict对象本身就是可迭代对象,用 for 循环直接迭代 dict,可以每次拿到dict的一个key. 如果我们希望迭代 dict 对象的value,应该怎么做? dict 对象有一个 ...
- arcgis的afcore_libfnp.dll经常被360杀毒,删除,请到恢复区恢复
arcgis的afcore_libfnp.dll经常被360杀毒,删除,请到恢复区恢复
- WebApp分析建模的工具
最近Web工程课在学习分析建模工具的内容.这周作业就写我对WebApp建模工具的认识.Web建模工具有很多,但是专门为分析开发的却相对很少.下面介绍在进行分析时可以用的四类工具. UML工具.使用统一 ...