最近学习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. Pickle的简单用法

    Python中pickle的用法 pickle存在的意义 在python的文件操作里面,我们常常需要将python容器里面的一些东西把它写成一个二进制文件存放在硬盘里面来永久保存. 在不借助pickl ...

  2. 面向对象的程序设计之JS创建对象的9种模式及其优缺点

    目录 1.new Object () 2.字面式创建对象 3.工厂模式 4.构造函数模式 4.1.将构造函数当作函数 4.2.构造函数的问题 5.原型模式 5.1.理解原型对象 5.2.原型与in操作 ...

  3. Codeforces 536D - Tavas in Kansas(dp)

    Codeforces 题目传送门 & 洛谷题目传送门 其实这题本该 2019 年 12 月就 AC 的(详情请见 ycx 发此题题解的时间),然鹅鸽到了现在-- 首先以 \(s,t\) 分别为 ...

  4. Linux下脚本文件第一行的作用

    Linux下脚本文件第一行的作用 在Linux/Unix系统中,你可以在脚本hello.py顶部添加以下命令让Python脚本可以像SHELL脚本一样可直接执行: #! /usr/bin/env py ...

  5. 【5】蛋白质组学鉴定定量软件之PD

    目录 1.简介 2.安装与配置 3.分析流程 4.结果 1.简介 PD全称Proteome Discoverer,是ThermoFisher在2008年推出的商业Windows软件,没错,收费,还不菲 ...

  6. mysql 计算日期为当年第几季度

    select T21620.日期 as F21634, QUARTER('98-04-01')  as quarter                       #返回日期是一年的第几个季度   - ...

  7. 4.Reverse Words in a String-Leetcode

    class Solution { public: void reverseWords(string &s) { vector<string> data; string word; ...

  8. CSS区分Chrome和Firefox

    CSS区分Chrome和FireFox 描述:由于Chrome和Firefox浏览器内核不同,对CSS解析有差别,因此常会有在两个浏览器中显示效果不同的问题出现,解决办法如下: /*Chrome*/ ...

  9. STM32一些特殊引脚做IO使用的注意事项

    1 PC13.PC14.PC15的使用 这三个引脚与RTC复用,<STM32参考手册>中这样描述: PC13 PC14 PC15需要将VBAT与VDD连接,实测采用以下程序驱动4个74HC ...

  10. MySQL(3):SELECT语法

    一,数据库语句 数据库数据是通过DML语句管理数据库数据,包括: INSERT (添加数据语句) UPDATE (更新数据语句) DELETE (删除数据语句) 1:INSERT (添加数据语句) I ...