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语言之进阶篇爬捧腹网的更多相关文章

  1. Go语言之进阶篇爬百度贴吧并发版

    1.爬百度贴吧并发版 示例: package main import ( "fmt" "net/http" "os" "strco ...

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

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

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

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

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

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

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

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

  6. go语言之进阶篇接口转换

    1.go语音之进阶篇 示例: package main import "fmt" type Humaner interface { //子集 sayhi() } type Pers ...

  7. go语音之进阶篇爬百度贴吧单线程版本

    一.爬什么? 1.明确目标 : 知道你准备在那个范围或者网站去搜索 2.爬: 将所有的网站的内容全部爬下来 3.取:去掉对我们没用处的数据 4.处理数据:按照我们想要的方式存储或使用 二.百度贴吧小爬 ...

  8. go语言之进阶篇通过select实现斐波那契数列

    一.select作用 Go里面提供了一个关键字select,通过select可以监听channel上的数据流动. select的用法与switch语言非常类似,由select开始一个新的选择块,每个选 ...

  9. go语言之进阶篇创建goroutine协程

    1.goroutine是什么 goroutine是Go并行设计的核心.goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现 ...

随机推荐

  1. android listView 点两下才监听到

    因为 对应的控件设置了 android:focusableInTouchMode="true" 意思是 触摸模式下 点击第一次 是 获得焦点.===

  2. [TC11326]ImpossibleGame

    [TC11326]ImpossibleGame 题目大意: 一类字符串仅由'A','B','C','D'四种字母组成.对于这样的一个字符串\(S\),可以用以下两种方式之一修改这个字符串: 交换\(S ...

  3. 如何修改vs2010中html的默认模板

    用vs2010开发,新建html时,html页面会生成HTML 4 XHTML的header,下面介绍一下如何把它改成干净的html5风格 百度经验:jingyan.baidu.com 工具/原料 v ...

  4. 【转】JavaScript eval处理JSON数据 为什么要加括号

    由于Ajax的兴起,JSON这种轻量级的数据格式作为客户端与服务器之间的传输格式逐渐地流行起来,进而出现的问题是如何将服务器端构建好的JSON数据转化为可用的JavaScript对象.利用eval函数 ...

  5. .NET 4.0中使用内存映射文件实现进程通讯

    操作系统很早就开始使用内存映射文件(Memory Mapped File)来作为进程间的共享存储区,这是一种非常高效的进程通讯手段.Win32 API中也包含有创建内存映射文件的函数,然而,这些函数都 ...

  6. windows操作系统查看占用端口的进程

    在开发中有时我们需要确定哪个占用了8080端口,在windows命令行窗口下执行: netstat -aon|findstr 命令执行后打印出来的结果如下所示:

  7. ashx文件获取$.ajax()方法发送的数据

    今天在使用Jquery的ajax方法发送请求时,发现在后台中使用ashx文件无法接收到ajax方法中传递的参数,上网查了一下原因后发现了问题所在,原来是我在$.ajax方法中指明了"cont ...

  8. 总结ASP.NET MVC视图页使用jQuery传递异步数据的几种方式

    在ASP.NET MVC的视图页向控制器传递异步数据,可能是数组,JavaScript对象,json,表单数据,等等. 关于数据,JavaScript对象有时候和json长得一模一样,有么有? var ...

  9. 使用SQL Database Migration Wizard把SQL Server 2008迁移到Windows Azure SQL Database

    本篇体验使用SQL Database Migration Wizard(SQLAzureMW)将SQL Server 2008数据库迁移到 Azure SQL Database.当然,SQLAzure ...

  10. Mybatis-Plus 多表联查分页

    原文:https://www.jianshu.com/p/759b6430ed5b 分析 使用的工程,依旧是 spring-boot,关于分页,官网给出了一个单表的 demo,其实多表分页实现原理相同 ...