go-爬段子
爬取搞笑的段子,横向爬取+纵向爬取
横向爬取爬页数,纵向爬取,爬每页的内容
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, " ", "", -1)
break
}
return
}
func main() {
var start, end int
fmt.Print("请输入起始页。。。")
fmt.Scan(&start)
fmt.Print("请输入终止页。。。")
fmt.Scan(&end)
toWork(start, end)
}
go-爬段子的更多相关文章
- scrapy框架安装配置
scrapy框架 scrapy安装(win) 1.pip insatll wheel 2.下载合适的版本的twisted:http://www.lfd.uci.edu/~gohlke/pythonli ...
- python_爬虫一之爬取糗事百科上的段子
目标 抓取糗事百科上的段子 实现每按一次回车显示一个段子 输入想要看的页数,按 'Q' 或者 'q' 退出 实现思路 目标网址:糗事百科 使用requests抓取页面 requests官方教程 使用 ...
- 利用python的爬虫技术爬去糗事百科的段子
初次学习爬虫技术,在知乎上看了如何爬去糗事百科的段子,于是打算自己也做一个. 实现目标:1,爬取到糗事百科的段子 2,实现每次爬去一个段子,每按一次回车爬取到下一页 技术实现:基于python的实现, ...
- Python爬虫实战三之爬取嗅事百科段子
一.前言 俗话说,上班时间是公司的,下班了时间才是自己的.搞点事情,写个爬虫程序,每天定期爬取点段子,看着自己爬的段子,也是一种乐趣. 二.Python爬取嗅事百科段子 1.确定爬取的目标网页 首先我 ...
- Python网络爬虫与如何爬取段子的项目实例
一.网络爬虫 Python爬虫开发工程师,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页 ...
- python内涵段子爬取练习
# -*- coding:utf-8 -*-from urllib import request as urllib2import re# 利用正则表达式爬取内涵段子url = r'http://ww ...
- 没有内涵段子可以刷了,利用Python爬取段友之家贴吧图片和小视频(含源码)
由于最新的视频整顿风波,内涵段子APP被迫关闭,广大段友无家可归,但是最近发现了一个"段友"的app,版本更新也挺快,正在号召广大段友回家,如下图,有兴趣的可以下载看看(ps:我不 ...
- Python爬虫-爬取糗事百科段子
闲来无事,学学python爬虫. 在正式学爬虫前,简单学习了下HTML和CSS,了解了网页的基本结构后,更加快速入门. 1.获取糗事百科url http://www.qiushibaike.com/h ...
- 8.Python爬虫实战一之爬取糗事百科段子
大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
- 【Python爬虫实战】多线程爬虫---糗事百科段子爬取
多线程爬虫:即程序中的某些程序段并行执行,合理地设置多线程,可以让爬虫效率更高糗事百科段子普通爬虫和多线程爬虫分析该网址链接得出:https://www.qiushibaike.com/8hr/pag ...
随机推荐
- spring cloud详解
1.Spring boot与Spring cloud 之间的关系 Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务 Spring ...
- 如何"快准狠"找到内存相关的问题
为了迅速定位内存问题,通常会先运行几个覆盖面比较大的性能工具,比如 free.top.vmstat.pidstat 等. 具体的分析思路主要有这几步 先用 free 和 top,查看系统整体的内存使用 ...
- 【Springboot】用Springboot Admin监控你的微服务应用
1 简介 目前,微服务大行其道,各大小公司争相学习模仿,把单体应用拆得七零八落.服务多了,运行的实例多了,给运维人员的压力就更大了.如果有十几个应用,单单做Health Check就已经够费时间的了. ...
- Vue基础系列(五)——Vue中的指令(中)
写在前面的话: 文章是个人学习过程中的总结,为方便以后回头在学习. 文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家和我一起交流. VUE基础系列目录 < ...
- OpenResty + ModSecurity + OWASP CRS
本篇将介绍如何使用OpenResty和ModSecurity 来构建自己的WAF,安装过程整体与Nginx是类似的,但也有些区别,在文中会特别指出,本篇算是用openresty对前面两篇nginx和c ...
- IT兄弟连 HTML5教程 CSS3属性特效 文字描边
用CSS3实现的文字描边效果,一个CSS3文字特效实例,字体可以自己随意改,字体颜色也可以自己改.IE9以下浏览器无效果,所以提醒大家测试时候要使用Google Chrome.-webkit-text ...
- ruby中的数组相关方法介绍
l = ["a","b","c","d","e","f",'g'] puts l ...
- 【BZOJ 2138】stone
Problem Description 话说 \(Nan\) 在海边等人,预计还要等上 \(M\) 分钟.为了打发时间,他玩起了石子. \(Nan\) 搬来了 \(N\) 堆石子,编号为 \(1\) ...
- 一起学Spring之AOP
概述 在软件开发中,我们重点关注的是业务逻辑代码,但在实际开发中,需要写的代码却不仅仅是业务逻辑,还需要处理记录日志,异常处理,事务控制等一些与业务无关的事情.而且这些代码也是服务端必须的,类似这样的 ...
- Flask 路由,配置,蓝图
路由 # -*- coding: utf-8 -*- from flask import Flask, url_for app = Flask(__name__) ...