最近学习go,爬取网站数据用到正则表达式,做个总结;

Go中正则表达式采用RE2语法(具体是啥咱也不清楚);

字符

. ——匹配任意字符 e.g: abc. 结果: abcd,abcx,abc9;

[] ——匹配括号中任意一个字符 e.g: [abc]d 结果:ad,cd,1d;

- ——[-]中表示范围 e.g: [A-Za-z0-9];

^ ——[^]中表示除括号中的任意字符 e.g:[^xy]a 结果:aa,da,不能为xa,ya;

数量限定

? ——前面单元匹配0或1次;

+ ——前面单元匹配1或多次;

* ——前面单元匹配0或多次;

{,} ——显示个数上下线;e.g : ip地址——[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3};

其他

\ ——转义字符;

| ——条件或;

() ——组成单元 如果字符串本身有括号"[(] aaa. [)]" ;

方法

//参数正则字符串,返回值*Regexp
str := regexp.MustCompile(string)
//参数要查找的数据,查找次数-1为全局,返回值二维数组,查找出的字符串+正则字符串
var result [][]string = str.FindAllStringSubmatch(data, -1)

爬虫

爬取博客园所有文章阅读量,评论,推荐;

package main

import (
"fmt"
"io"
"net/http"
"regexp"
"strconv"
) var readCount int = 0
var commentCount int = 0
var diggCount int = 0 //http读取网页数据写入result返回
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)
//fmt.Println(url)
if n == 0 {
break
}
if err2 != nil && err2 != io.EOF {
err = err2
return
}
result += string(buf[:n])
}
return result, err
} //横向纵向爬取文章标题数据,并累计数值
func SpiderPageDB(index int, page chan int) {
url := "https://www.cnblogs.com/littleperilla/default.html?page=" + strconv.Itoa(index) result, err := HttpGet(url) if err != nil {
fmt.Println("HttpGet err:", err)
return
} str := regexp.MustCompile("post-view-count\">阅读[(](?s:(.*?))[)]</span>")
alls := str.FindAllStringSubmatch(result, -1)
for _, j := range alls {
temp, err := strconv.Atoi(j[1])
if err != nil {
fmt.Println("string2int err:", err)
}
readCount += temp
} str = regexp.MustCompile("post-comment-count\">评论[(](?s:(.*?))[)]</span>")
alls = str.FindAllStringSubmatch(result, -1)
for _, j := range alls {
temp, err := strconv.Atoi(j[1])
if err != nil {
fmt.Println("string2int err:", err)
}
commentCount += temp
} str = regexp.MustCompile("post-digg-count\">推荐[(](?s:(.*?))[)]</span>")
alls = str.FindAllStringSubmatch(result, -1)
for _, j := range alls {
temp, err := strconv.Atoi(j[1])
if err != nil {
fmt.Println("string2int err:", err)
}
diggCount += temp
} page <- index
} //主要工作方法
func working(start, end int) {
fmt.Printf("正在从%d到%d爬取中...\n", start, end) //channel通知主线程是否所有go都结束
page := make(chan int) //多线程go程同时爬取
for i := start; i <= end; i++ {
go SpiderPageDB(i, page)
} for i := start; i <= end; i++ {
fmt.Printf("拉取到%d页\n", <-page)
}
} //入口函数
func main() {
//输入爬取的起始页
var start, end int
fmt.Print("startPos:")
fmt.Scan(&start)
fmt.Print("endPos:")
fmt.Scan(&end) working(start, end) fmt.Println("阅读:", readCount)
fmt.Println("评论:", commentCount)
fmt.Println("推荐:", diggCount)
}

Golang爬虫+正则表达式的更多相关文章

  1. Golang - 爬虫案例实践

    目录 Golang - 爬虫案例实践 1. 爬虫步骤 2. 正则表达式 3. 并发爬取美图 Golang - 爬虫案例实践 1. 爬虫步骤 明确目标(确定在哪个网址搜索) 爬(爬下数据) 取(去掉没用 ...

  2. Golang爬虫示例包系列教程(一):pedaily.com投资界爬虫

    Golang爬虫示例包 文件结构 自己用Golang原生包封装了一个爬虫库,源码见go get -u -v github.com/hunterhug/go_tool/spider ---- data ...

  3. 爬虫——正则表达式re模块

    为什么要学习正则表达式 实际上爬虫一共就四个主要步骤: 明确目标:需清楚目标网站 爬:将所有的目标网站的内容全部爬下来 取:在爬下来的网站内容中去掉对我们没有用处的数据,只留取我们需要的数据 处理数据 ...

  4. Python爬虫 正则表达式

    1.正则表达式概述 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来 ...

  5. Python入门-编写抓取网站图片的爬虫-正则表达式

    //生命太短 我用Python! //Python真是让一直用c++的村里孩子长知识了! 这个仅仅是一个测试,成功抓取了某网站1000多张图片. 下一步要做一个大新闻 大工程 #config = ut ...

  6. Python 爬虫-正则表达式(补)

    2017-08-08 18:37:29 一.Python中正则表达式使用原生字符串的几点说明 原生字符串和普通字符串的不同 相较于普通字符串,原生字符串中的\就是反斜杠,并不表达转义.不过,字符串转成 ...

  7. Python 爬虫-正则表达式

    2017-07-27 13:52:08  一.正则表达式的概念 (1)正则表达式是用来简洁表达一组字符串的表达式,最主要应用在字符串匹配中. 正则表达式是用来简洁表达一组字符串的表达式 正则表达式是一 ...

  8. Python爬虫-正则表达式基础

    import re #常规匹配 content = 'Hello 1234567 World_This is a Regex Demo' #result = re.match('^Hello\s\d\ ...

  9. 之前写的关于chromedp的文章被别人转到CSDN,很受鼓励,再来一篇golang爬虫实例

    示例说明:用chromedp操作chrome,导航到baidu,然后输入“美女”,然后再翻2页,在此过程中保存cookie和所有img标签内容,并保存第一页的baidu logo为png 注释已经比较 ...

随机推荐

  1. (前端)面试300问之(3)this的指向判断

    一.this的相关理解与解读 1.各角度看this. 1)ECMAScript规范: this 关键字执行为当前执行环境的 ThisBinding. 2)MDN: In most cases, the ...

  2. 小白秒懂的Windows下搭建基于pytorch的深度学习环境

    配置环境总体思路 1.依据python版本选择对应Anaconda版本: 2.依据显卡驱动版本选择对应的CUDA版本: 3.依据CUDA版本选择对应的cudnn和pytorch版本. 一.Anacon ...

  3. Java设计模式之(十四)——策略模式

    1.什么是策略模式? Define a family of algorithms, encapsulate each one, and make them interchangeable. Strat ...

  4. mac系统升级导致VirtualBox报Kernel driver not installed (rc=-1908)

    一.背景 最近将我的Mac升级成了Monterey版本,结果发现之前的安装的VirtualBox虚拟机无法启动,报了如下错误. Kernel driver not installed (rc=-190 ...

  5. Hadoop入门 完全分布式运行模式-集群配置

    目录 集群配置 集群部署规划 配置文件说明 配置集群 群起集群 1 配置workers 2 启动集群 总结 3 集群基本测试 上传文件到集群 查看数据真实存储路径 下载 执行wordcount程序 配 ...

  6. A Child's History of England.52

    'Arthur,' said the King, with his wicked eyes more on the stone floor than on his nephew, 'will you ...

  7. day03 部署NFS服务

    day03 部署NFS服务 NFS的原理 1.什么是NFS 共享网络文件存储服务器 2.NFS的原理 1.用户访问NFS客户端,将请求转化为函数 2.NFS通过TCP/IP连接服务端 3.NFS服务端 ...

  8. 利用python代码获取文件特定的内容,并保存为文档

    说明:有段时间需要读取上百个文件的单点能(sp),就写了下面的代码(计算化学狗努力转行中^-^) import os.path import re # 1 遍历指定目录,显示目录下的所有文件名 def ...

  9. json模块中函数的用法

    json模块中主要使用四个函数:json.load(),json.dump(),json.loads(),json.dumps() json.loads()是将一个json编码的字符串转换成pytho ...

  10. vue3 使用 data、computed、methods

    简单数据ref复杂数据reactive 使用方法: // useCount.js import {ref,reactive,computed} from 'vue' export default fu ...