没事的时候跑两把,穷人专用。

package main

import (
"bytes"
"fmt"
"github.com/PuerkitoBio/goquery"
"log"
"math"
"net/http"
"runtime"
"strconv"
"strings"
"sync"
"time"
) func Scraper(page string, now int64) string {
// Request the HTML page.
ScrapeURL := "https://51.ruyo.net/page/" + page
client := &http.Client{}
reqest, _ := http.NewRequest("GET", ScrapeURL, nil)
reqest.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
reqest.Header.Set("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3")
//reqest.Header.Set("Accept-Encoding", "gzip,deflate,sdch")
reqest.Header.Set("Accept-Language", "zh-CN,zh;q=0.8")
reqest.Header.Set("Cache-Control", "max-age=0")
reqest.Header.Set("Connection", "keep-alive")
reqest.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36")
res, err := client.Do(reqest)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
if res.StatusCode != 200 {
log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
} // Load the HTML document
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
log.Fatal(err)
} // Find the review items
var buffer bytes.Buffer
buffer.WriteString("**********Scraped page " + page + "**********\n")
doc.Find(".panel-body .entry-header").Each(func(i int, s *goquery.Selection) {
// For each item found, get the band and title
title := s.Find("h3").ChildrenFiltered("a").Text()
url, _ := s.Find("h3").ChildrenFiltered("a").Attr("href")
etime, _ := s.Find("div").ChildrenFiltered("time").Attr("datetime")
etime = strings.Replace(etime, "+00:00", "", -1) + "Z"
dt, _ := time.Parse(time.RFC3339, etime)
intdt := dt.Unix()
difftime := math.Abs(float64(now - intdt))
//fmt.Println(now, intdt, difftime)
if difftime <= 2592000 {
buffer.WriteString("Review " + strconv.Itoa(i) + ": " + title + "\n" + url + "\n" + etime + "\n")
}
})
return buffer.String()
} func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
now := time.Now().Unix()
ch := make(chan string, 5)
wg := &sync.WaitGroup{}
var page string
for i := 1; i < 6; i++ {
wg.Add(1)
go func(i int) {
page = strconv.Itoa(i)
fmt.Printf("Scraping page %s...\n", page)
ch <- Scraper(page, now)
wg.Done()
}(i)
}
wg.Wait() //print result
for i := 0; i < 6; i++ {
fmt.Println(<-ch)
}
}

Golang福利爬虫的更多相关文章

  1. Golang分布式爬虫:抓取煎蛋文章|Redis/Mysql|56,961 篇文章

    --- layout: post title: "Golang分布式爬虫:抓取煎蛋文章" date: 2017-04-15 author: hunterhug categories ...

  2. Golang 网络爬虫框架gocolly/colly 四

    Golang 网络爬虫框架gocolly/colly 四 爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟.回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫, ...

  3. Golang 网络爬虫框架gocolly/colly 三

    Golang 网络爬虫框架gocolly/colly 三 熟悉了<Golang 网络爬虫框架gocolly/colly一>和<Golang 网络爬虫框架gocolly/colly二& ...

  4. Golang 网络爬虫框架gocolly/colly 二 jQuery selector

    Golang 网络爬虫框架gocolly/colly 二 jQuery selector colly框架依赖goquery库,goquery将jQuery的语法和特性引入到了go语言中.如果要灵活自如 ...

  5. Golang 网络爬虫框架gocolly/colly 一

    Golang 网络爬虫框架gocolly/colly 一 gocolly是用go实现的网络爬虫框架,目前在github上具有3400+星,名列go版爬虫程序榜首.gocolly快速优雅,在单核上每秒可 ...

  6. Golang 网络爬虫框架gocolly/colly 五 获取动态数据

    Golang 网络爬虫框架gocolly/colly 五 获取动态数据 gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goque ...

  7. Golang 简单爬虫实现,爬取小说

    为什么要使用Go写爬虫呢? 对于我而言,这仅仅是练习Golang的一种方式. 所以,我没有使用爬虫框架,虽然其很高效. 为什么我要写这篇文章? 将我在写爬虫时找到资料做一个总结,希望对于想使用Gola ...

  8. 基于golang分布式爬虫系统的架构体系v1.0

    基于golang分布式爬虫系统的架构体系v1.0 一.什么是分布式系统 分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统.简单来说就是一群独立计算机 ...

  9. 试验一下Golang 网络爬虫框架gocolly/colly

    参考:http://www.cnblogs.com/majianguo/p/8186429.html 框架源码在 github.com/gocolly/colly 代码如下(github源码中的dem ...

随机推荐

  1. Leetcode 129

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  2. 九校模拟——餐馆(restaurant)

    1 餐馆(restaurant) 1.1 题目背景 铜企鹅是企鹅餐馆的老板,他正在计划如何使得自己本年度收益增加. 1.2 题目描述 共有n 种食材,一份食材i 需要花ti 小时不间断地进行播种,施肥 ...

  3. 2015-09-29 js2

    Javasript 六. 条件语句 1. 比较运算符 == .!=.>.>=.<.<= 转大/小写:toUpperCase().toLowerCase() 2. 逻辑运算符(与 ...

  4. Tips about Troubleshooting RAC

    Installation Log Filessoftware installation log files inside the logs directory of Oracle central in ...

  5. swagger访问api, TypeError: Failed to fetch

    用swagger访问https://localhost:44360/api/ads/1, 得到的结果是 TypeError: Failed to fetch.一开始以为是后端代码问题,检查了好久,才发 ...

  6. vs 编译库文件

    vs编译的库文件 静态库  debug和release版本 需要分开编译,我编译和实践的结果. 但是我也发现有的debug release都用同一个(搞不清楚). 然后添加到工程应用. 静态库  附件 ...

  7. :after 写三角形 border

    .tooltip:after { content: ''; position: absolute; border: 6px solid #5190ac; border-color: #5190ac t ...

  8. matlab global persistent变量

    global变量是全局的,在使用global变量的函数里需要用global声明所使用的变量. persistent类似global,不过仅对当前函数有作用,这样避免了外面的影响.当这个函数被clear ...

  9. js 实现class作为选择器

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  10. redis客户端windows版中文乱码解决方案

    1.在cmd窗口,在redis-cli.exe 后加上--raw 2.修改cmd窗口编码 http://jingyan.baidu.com/article/e75aca85440f01142edac6 ...