[GO]并的爬取捧腹的段子
package main import (
"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 = err1
return
}
defer resp.Body.Close() //关闭 //读取网络内容
buf := make([]byte, *)
for true {
n, _ := resp.Body.Read(buf)
if n == {
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 = err1
return
}
//取关键信息,标题
re1 := regexp.MustCompile(`<h1>(.*?)</h1>`)
if re1 == nil {
err = fmt.Errorf("%s", "SpiderOneJoy regexp.MustCompile err ")
return
}
//取内容
tmpTitle := re1.FindAllStringSubmatch(result, )//因为我只过滤第一个内容
for _, data := range tmpTitle{
title = data[]
title = strings.Replace(title, "\r", "", -)
title = strings.Replace(title, "\n", "", -)
title = strings.Replace(title, " ", "", -)
title = strings.Replace(title, "\t", "", -)
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, -)
for _, data := range tmpContent{
content = data[]
content = strings.Replace(content, "\r", "", -)
content = strings.Replace(content, "\n", "", -)
content = strings.Replace(content, " ", "", -)
content = strings.Replace(content, "\t", "", -)
content = strings.Replace(content, "\t", "", -)
content = strings.Replace(content, "<br>", "", -)
content = strings.Replace(content, "<br/>", "", -) //这种方式不太好,肯定有更好的办法
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 := ; 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, -) fileTitle := make([]string, )
fileContent := make([]string, ) //fmt.Println("url = ", joyUrls)
//取网址,遍历后第一个返回下标,这里不要,第二个返回内容
for _, data := range joyUrls{
fmt.Println("data = ", data[])
//爬取每一个段子
title, content, err := SpiderOneJoy(data[])//它应该返回标题和内容,并可能会有报错,共三个返回值
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 int
fmt.Printf("请输入起始页>=1:> ")
fmt.Scan(&start)
fmt.Printf("请输入结束页:> ")
fmt.Scan(&end)
DoWork(start, end)
}
[GO]并的爬取捧腹的段子的更多相关文章
- python3制作捧腹网段子页爬虫
0x01 春节闲着没事(是有多闲),就写了个简单的程序,来爬点笑话看,顺带记录下写程序的过程.第一次接触爬虫是看了这么一个帖子,一个逗逼,爬取煎蛋网上妹子的照片,简直不要太方便.于是乎就自己照猫画虎, ...
- Python爬虫实战三之爬取嗅事百科段子
一.前言 俗话说,上班时间是公司的,下班了时间才是自己的.搞点事情,写个爬虫程序,每天定期爬取点段子,看着自己爬的段子,也是一种乐趣. 二.Python爬取嗅事百科段子 1.确定爬取的目标网页 首先我 ...
- Python爬虫-爬取糗事百科段子
闲来无事,学学python爬虫. 在正式学爬虫前,简单学习了下HTML和CSS,了解了网页的基本结构后,更加快速入门. 1.获取糗事百科url http://www.qiushibaike.com/h ...
- python学习(十六)写爬虫爬取糗事百科段子
原文链接:爬取糗事百科段子 利用前面学到的文件.正则表达式.urllib的知识,综合运用,爬取糗事百科的段子先用urllib库获取糗事百科热帖第一页的数据.并打开文件进行保存,正好可以熟悉一下之前学过 ...
- Python爬虫实战一之爬取糗事百科段子
大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
- 转 Python爬虫实战一之爬取糗事百科段子
静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...
- 8.Python爬虫实战一之爬取糗事百科段子
大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
- 爬虫——URL模块爬取糗事百科段子
最简单的爬取网页找有用信息,难点应该是正则锁定有用信息部分,看了一些其他大神的正则,最后还是决定按照自己理解写一个,果然我头脑相对简单,写出来的粗糙而易理解,也完成了自己想要的需求,就这样了~ # - ...
- python爬取糗事百科段子
初步爬取糗事百科第一页段子(发布人,发布内容,好笑数和评论数) #-*-coding:utf--*- import urllib import urllib2 import re page = url ...
随机推荐
- DOM的基本概念
1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 2.Window对象操作 一.属性和方法: 属性(值或者子对象): op ...
- 解决jenkins产生的日志过大以及一些衍生问题
jenkins使用一段时间后,会导致出现比较大的日志问题,经常占满硬盘空间(因为我们使用的硬盘大小20G,无额外存储要求).在硬盘空间占满之后,会导致一些基本的命令都无法使用,譬如tab都 ...
- VS2015 异常 :遇到异常。这可能是由某个扩展导致的
原因是安装程序时将注册表修改了,解决方案: 修改注册表: 64位机器: [HKEY_CLASSES_ROOT\CLSID\{73B7DC00-F498-4ABD-AB79-D07AFD52F395}\ ...
- 嵌入式Linux驱动和固件有何区别?供应商是如何用固件压缩成本的?
作为一个驱动开发者, 你可能发现你面对一个设备必须在它能支持工作前下载固件到它里面. 硬件市场的许多地方的竞争是如此得强烈, 以至于甚至一点用作设备控制固件的 EEPROM 的成本制造商都不愿意花费. ...
- iconv 解决utf-8和gb2312编码转换问题
$content = iconv("utf-8","gb2312//IGNORE",$content); //utf-8转gbk $content = icon ...
- python学习笔记(十三): 多线程多进程
一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...
- 远程Servie通信AIDL
不可以直接通过binder了. 1.先编写一个aidl文件,里边包含我们要通信的方法.(Android studio 有直接新建AIDL选项) interface myInterface { /** ...
- 在C#中控制ListBox某一行的字体颜色
例1 private void Form1_Load(object sender, EventArgs e) { listBox1.Items.Add("红色"); listBox ...
- GNU/Linux操作系统总览
计算机科学本科的专业课包括高等数学.离散数学.模拟电子技术.数字电子技术.微机原理.汇编语言原理.高级程序语言.操作系统原理.高级编译原理.嵌入式原理.网络原理.计算机组成与结构等诸多科目.GNU计算 ...
- MongoDB数据仓储
本篇是作为另一篇随笔的一部分‘搭建一个Web API项目’ MogonDB官网:https://www.mongodb.org/ 安装过程参考园友的分享http://www.cnblogs.com/l ...