爬取搞笑的段子,横向爬取+纵向爬取

横向爬取爬页数,纵向爬取,爬每页的内容

package main

import (
"fmt"
"io"
"net/http"
"os"
"regexp"
"strconv"
"strings"
) 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, 4096)
for {
n, err2 := resp.Body.Read(buf)
if n == 0 {
break
}
if err2 != nil && err2 != io.EOF {
err = err2
return
}
result += string(buf[:n])
}
return
} func SaveJoke2File(idx int, fileTitle, fileContent []string) {
path := "第" + strconv.Itoa(idx) + "页.txt"
f, err := os.Create(path)
if err != nil {
fmt.Println("err:", err)
return
}
defer f.Close()
n := len(fileTitle)
for i := 0; i < n; i++ {
f.WriteString(fileTitle[i] + "\n" + fileContent[i] + "\n")
f.WriteString("-----------------------------\n")
}
} //抓取一个网页
func Spiderpage(idx int, page chan int) {
url := "https://m.pengfue.com/xiaohua_" + strconv.Itoa(idx) + ".html" result, err := HttpGet(url)
if err != nil {
fmt.Println("httpget err", err)
return
} ret := regexp.MustCompile(`<h1 class="f18"><a href="(?s:(.*?))"`) alls := ret.FindAllStringSubmatch(result, -1) fileTitle := make([]string, 0)
fileContent := make([]string, 0) for _, jokeURL := range alls {
// fmt.Println("jokeURL", jokeURL[1])
title, content, err := SpiderJokePage(jokeURL[1]) if err != nil {
fmt.Println("err:", err)
continue
} // fmt.Println("title:", title)
// fmt.Println("content:", content)
fileTitle = append(fileTitle, title)
fileContent = append(fileContent, content)
}
SaveJoke2File(idx, fileTitle, fileContent) page <- idx
} func toWork(start, end int) {
fmt.Printf("正在爬取%d到%d页。。。\n", start, end) page := make(chan int) for i := start; i <= end; i++ {
// title, content, err := Spiderpage(i)
go Spiderpage(i, page)
// if err != nil {
// fmt.Println("err:", err)
// continue
// }
// fmt.Println("title:", title)
// fmt.Println("content:", content)
}
for i := start; i <= end; i++ {
fmt.Printf("第%d个页面爬取完成\n", <-page)
}
} func SpiderJokePage(url string) (title, content string, err error) {
result, err1 := HttpGet(url)
if err1 != nil {
// fmt.Println("httpget err", err)
err = err1
return
}
ret1 := regexp.MustCompile(`<title>(?s:(.*?))</title>`) alls := ret1.FindAllStringSubmatch(result, 1) //两处,取一个
for _, timTitle := range alls {
title = timTitle[1]
title = strings.Replace(title, " ", "", -1)
title = strings.Replace(title, "\n", "", -1)
break
} ret2 := regexp.MustCompile(`<div class="con-txt">(?s:(.*?))</div>`) alls2 := ret2.FindAllStringSubmatch(result, 1) //两处,取一个
for _, timTitle := range alls2 {
content = timTitle[1]
content = strings.Replace(content, " ", "", -1)
content = strings.Replace(content, "\n", "", -1)
content = strings.Replace(content, " ", "", -1)
content = strings.Replace(content, "&nbsp;", "", -1)
break
}
return
} func main() {
var start, end int
fmt.Print("请输入起始页。。。")
fmt.Scan(&start)
fmt.Print("请输入终止页。。。")
fmt.Scan(&end) toWork(start, end)
}

go-爬段子的更多相关文章

  1. scrapy框架安装配置

    scrapy框架 scrapy安装(win) 1.pip insatll wheel 2.下载合适的版本的twisted:http://www.lfd.uci.edu/~gohlke/pythonli ...

  2. python_爬虫一之爬取糗事百科上的段子

    目标 抓取糗事百科上的段子 实现每按一次回车显示一个段子 输入想要看的页数,按 'Q' 或者 'q' 退出 实现思路 目标网址:糗事百科 使用requests抓取页面  requests官方教程 使用 ...

  3. 利用python的爬虫技术爬去糗事百科的段子

    初次学习爬虫技术,在知乎上看了如何爬去糗事百科的段子,于是打算自己也做一个. 实现目标:1,爬取到糗事百科的段子 2,实现每次爬去一个段子,每按一次回车爬取到下一页 技术实现:基于python的实现, ...

  4. Python爬虫实战三之爬取嗅事百科段子

    一.前言 俗话说,上班时间是公司的,下班了时间才是自己的.搞点事情,写个爬虫程序,每天定期爬取点段子,看着自己爬的段子,也是一种乐趣. 二.Python爬取嗅事百科段子 1.确定爬取的目标网页 首先我 ...

  5. Python网络爬虫与如何爬取段子的项目实例

    一.网络爬虫 Python爬虫开发工程师,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页 ...

  6. python内涵段子爬取练习

    # -*- coding:utf-8 -*-from urllib import request as urllib2import re# 利用正则表达式爬取内涵段子url = r'http://ww ...

  7. 没有内涵段子可以刷了,利用Python爬取段友之家贴吧图片和小视频(含源码)

    由于最新的视频整顿风波,内涵段子APP被迫关闭,广大段友无家可归,但是最近发现了一个"段友"的app,版本更新也挺快,正在号召广大段友回家,如下图,有兴趣的可以下载看看(ps:我不 ...

  8. Python爬虫-爬取糗事百科段子

    闲来无事,学学python爬虫. 在正式学爬虫前,简单学习了下HTML和CSS,了解了网页的基本结构后,更加快速入门. 1.获取糗事百科url http://www.qiushibaike.com/h ...

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

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  10. 【Python爬虫实战】多线程爬虫---糗事百科段子爬取

    多线程爬虫:即程序中的某些程序段并行执行,合理地设置多线程,可以让爬虫效率更高糗事百科段子普通爬虫和多线程爬虫分析该网址链接得出:https://www.qiushibaike.com/8hr/pag ...

随机推荐

  1. java8-详解Lamda表达式

    一回顾与说明     通过之前发布的"Java8Lamda和Stream原理引入"一文章中你已经了解了为什么会有Lamda表达式的由来,Lamda表达式的基本语法等:Lamda表达 ...

  2. IPFS学习-IPNS

    星际名称系统(IPNS)是一个创建个更新可变的链接到IPFS内容的系统,由于对象在IPFS中是内容寻址的,他们的内容变化将导致地址随之变化.对于多变的事物是有用的.但是很难获取某些内容的最新版本. 在 ...

  3. 关于MySQL注入漏洞到获取webshell

    关于PHP网站报错性注入拿shell的方法,定位到报错在某个字段上的利用方式: 条件1: 爆出了网站的物理路径 条件2:MySQL具有into outfile权限 SQL语句为: 假如字段为2: un ...

  4. Java分布式ID生成解决方案

    分布式ID生成器 我们采用的是开源的twitter(  非官方中文惯称:推特.是国外的一个网站,是一个社交网络及微博客服务)  的snowflake算法(推特雪花算法). 封装为工具类,源码如下: p ...

  5. mysql的锁机制详解

    这段时间一直在学习mysql数据库.项目组一直用的是oracle,所以对mysql的了解也不深.本文主要是对mysql锁的总结. Mysql的锁主要分为3大类: 表级锁:存储引擎为Myisam.锁住整 ...

  6. Redis Python(二)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.NoSQL(Not only SQL)1.泛指非关系数据库2.不支持SQL语法3.存储结构与传统的关系型数据库 ...

  7. Android 程序分析环境搭建-静态分析环境搭建

    1.2 静态分析环境搭建 这里主要讲一些用的比较顺手的工具,一并列出来,Uaa,等环境配置, 2,notepad++ ,everything , Jdgui ,idea, ida ,Fiddler , ...

  8. 轻松定位CPU飙高问题

    以下四步轻松定位CPU飙高问题: ①top pid 查看cpu耗CPU进程 ②top -Hp pid 查看该进程所有线程的运行情况,找到占用 CPU 过高的线程 pid ③ printf %x pid ...

  9. Flink01

    1. 什么是Flink? 1.1 4代大数据计算引擎 第一代: MapReducer 批处理 Mapper, Reducer Hadoop的MapReducer将计算分为两个阶段, 分别为Map和Re ...

  10. 如何在Oracle 12C中添加多个分区 (Doc ID 1482456.1)

    How to Add Multiple Partitions in Oracle 12C (Doc ID 1482456.1) APPLIES TO: Oracle Database - Enterp ...