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 ...
随机推荐
- 安卓逆向基础(001)-APK安装流程
1.在/data/app下以报名为文件夹名新建文件夹 APK包存放在这里 以及lib文件 存放so 2./data/dalvik-cache 存放dex dex是dalvik虚拟机可执行文件 3./d ...
- c++之数据的输入和输出
; cout<<"请输入a的值:"<<endl; cin>>a; cout<<a<<endl;
- Caffe源码-SyncedMemory类
SyncedMemory类简介 最近在阅读caffe源码,代码来自BVLC/caffe,基本是参照网络上比较推荐的 Blob-->Layer-->Net-->Solver 的顺序来分 ...
- Python基础-day01-3
PyCharm 的初始设置(知道) 目标 恢复 PyCharm 的初始设置 第一次启动 PyCharm 新建一个 Python 项目 设置 PyCharm 的字体显示 PyCharm 的升级以及其他 ...
- Nginx配置实例-反向代理实现浏览器请求Nginx跳转到服务器某页面
场景 Ubuntu Server 16.04 LTS上怎样安装下载安装Nginx并启动: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detai ...
- 微信小程序APP生命周期
小程序APP生命周期需要先从app.js这个文件开始,App() 必须在 app.js 中调用,必须调用且只能调用一次,app.js中定义了一些应用的生命周期函数 onLaunch----当小程序初始 ...
- 开源资产管理系统Snipe-IT
CentOS7安装IT资产管理系统Snipe-IT介绍资产管理工具Github:https://github.com/snipe/snipe-it官网:https://snipeitapp.com/D ...
- SQL数据库基础
SQL:Structured Quety Language SQL SERVER是一个以客户/服务器(c/s)模式访问.使用Transact-SQL语言的关系型数据库管理子系统(RDBMS) DBMS ...
- juc-2.1-模拟CAS算法
package com.wf.zhang.juc; /* * 模拟 CAS 算法 */ public class TestCompareAndSwap { public static void mai ...
- 集合系列 Queue(十一):ArrayDeque
从名字我们可以看出,其实一个双向队列实现,而且底层采用数组实现. public class ArrayDeque<E> extends AbstractCollection<E> ...