Golang 网络爬虫框架gocolly/colly 三

熟悉了Golang 网络爬虫框架gocolly/colly一》Golang 网络爬虫框架gocolly/colly二》之后就可以在网络上爬取大部分数据了。本文接下来将爬取中证指数有限公司提供的行业市盈率。(http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio)

定义数据结构体,

//证监会行业市盈率

type ZhjhHyShyl struct {

    Hydm string `json:"行业代码"`

    Hymc string `json:"行业名称"`

    Zxsj *float64 `json:"最新数据"`

    Gpjs int `json:"股票家数"`

    Ksjs int `json:"亏损家数"`

    Jygy *float64 `json:"近一个月"`

    Jsgy *float64 `json:"近三个月"`

    Jlgy *float64 `json:"近六个月"`

    Jyn *float64 `json:"近一年"`

    Zhy []*ZhjhHyShyl `json:"细分行业"`

}

  

接下来为gocolly调用准备,将用户代理设置为Chrome浏览器,该值可以通过Fiddler工具查看

	c.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"

  

还可以利用Fiddler设置更多的Request Header,将爬虫工具伪装成浏览器。

接下来F12调用浏览器调试器查看目标数据的元素,拷贝jQuery选择器,然后改成相对路径。

完成所有的数据抓取代码:

package main

import (

    "encoding/json"

    "fmt"

    "log"

    "strconv"

    "strings"

    "github.com/PuerkitoBio/goquery"

    "github.com/gocolly/colly"

)

//证监会行业市盈率

type ZhjhHyShyl struct {

    Hydm string `json:"行业代码"`

    Hymc string `json:"行业名称"`

    Zxsj *float64 `json:"最新数据"`

    Gpjs int `json:"股票家数"`

    Ksjs int `json:"亏损家数"`

    Jygy *float64 `json:"近一个月"`

    Jsgy *float64 `json:"近三个月"`

    Jlgy *float64 `json:"近六个月"`

    Jyn *float64 `json:"近一年"`

    Zhy []*ZhjhHyShyl `json:"细分行业"`

}

func main() {

    var err error

    c := colly.NewCollector()

    c.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"

    zjhHyShyl := make([]*ZhjhHyShyl, 0)

    c.OnRequest(func(r *colly.Request) {

        fmt.Printf("%+v\r\n%+v\r\n", *r, *(r.Headers))

    })

    c.OnHTML("td>table.list-div-table>tbody>tr", func(e *colly.HTMLElement) {

        hyShy := ZhjhHyShyl{

            Hydm: e.ChildText("td:first-child"),

            Hymc: e.ChildText("td:nth-child(2)"),

        }

        zxsj, err := strconv.ParseFloat(e.ChildText("td:nth-child(3)"), 64)

        if err == nil {

            hyShy.Zxsj = &zxsj

        }

        gpjs, err := strconv.ParseInt(e.ChildText("td:nth-child(4)"), 10, 32)

        if err == nil {

            hyShy.Gpjs = int(gpjs)

        }

        ksjs, err := strconv.ParseInt(e.ChildText("td:nth-child(5)"), 10, 32)

        if err == nil {

            hyShy.Ksjs = int(ksjs)

        }

        jygy, err := strconv.ParseFloat(e.ChildText("td:nth-child(6)"), 64)

        if err == nil {

            hyShy.Jygy = &jygy

        }

        jsgy, err := strconv.ParseFloat(e.ChildText("td:nth-child(7)"), 64)

        if err == nil {

            hyShy.Jsgy = &jsgy

        }

        jlgy, err := strconv.ParseFloat(e.ChildText("td:nth-child(8)"), 64)

        if err == nil {

            hyShy.Jlgy = &jlgy

        }

        jyn, err := strconv.ParseFloat(e.ChildText("td:nth-child(9)"), 64)

        if err == nil {

            hyShy.Jyn = &jyn

        }

        zjhHyShyl = append(zjhHyShyl, &hyShy)

        hyShy.Zhy = make([]*ZhjhHyShyl, 0)

        e.DOM.Parent().Parent().Next().Find("table.list-div-table>tbody>tr").Each(func(_ int, s *goquery.Selection) {

            zhy := ZhjhHyShyl{

                Hydm: strings.Trim(s.Find("td:nth-child(1)").Text(), "\r\n\t "),

                Hymc: strings.Trim(s.Find("td:nth-child(2)").Text(), "\r\n\t "),

            }

            zxsj, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(3)").Text(), "\r\n\t "), 64)

            if err == nil {

                zhy.Zxsj = &zxsj

            }

            gpjs, err := strconv.ParseInt(strings.Trim(s.Find("td:nth-child(4)").Text(), "\r\n\t "), 10, 32)

            if err == nil {

                zhy.Gpjs = int(gpjs)

            }

            ksjs, err := strconv.ParseInt(strings.Trim(s.Find("td:nth-child(5)").Text(), "\r\n\t "), 10, 32)

            if err == nil {

                zhy.Ksjs = int(ksjs)

            }

            jygy, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(6)").Text(), "\r\n\t "), 64)

            if err == nil {

                zhy.Jygy = &jygy

            }

            jsgy, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(7)").Text(), "\r\n\t "), 64)

            if err == nil {

                zhy.Jsgy = &jsgy

            }

            jlgy, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(8)").Text(), "\r\n\t "), 64)

            if err == nil {

                zhy.Jlgy = &jlgy

            }

            jyn, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(9)").Text(), "\r\n\t "), 64)

            if err == nil {

                zhy.Jyn = &jyn

            }

            hyShy.Zhy = append(hyShy.Zhy, &zhy)

        })

    })

    c.OnScraped(func(_ *colly.Response) {

        bData, _ := json.MarshalIndent(zjhHyShyl, "", "\t")

        fmt.Println(string(bData))

    })

    err = c.Visit("http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio?date=2017-12-27&type=zjh1")

    if err != nil {

        log.Fatal(err)

    }

}

  

运行后的部分结果:

{

                "行业代码": "D",

                "行业名称": "电力、热力、燃气及水的生产和供应业",

                "最新数据": 20.12,

                "股票家数": 107,

                "亏损家数": 5,

                "近一个月": 19.51,

                "近三个月": 19.7,

                "近六个月": 19.87,

                "近一年": 18.9,

                "细分行业": [

                        {

                                "行业代码": "44",

                                "行业名称": "电力、热力生产和供应业",

                                "最新数据": 18.75,

                                "股票家数": 70,

                                "亏损家数": 3,

                                "近一个月": 18.28,

                                "近三个月": 18.43,

                                "近六个月": 18.55,

                                "近一年": 17.44,

                                "细分行业": null

                        },

                        {

                                "行业代码": "45",

                                "行业名称": "燃气生产和供应业",

                                "最新数据": 28.4,

                                "股票家数": 22,

                                "亏损家数": 2,

                                "近一个月": 25.71,

                                "近三个月": 25.33,

                                "近六个月": 25.38,

                                "近一年": 27.24,

                                "细分行业": null

                        },

                        {

                                "行业代码": "46",

                                "行业名称": "水的生产和供应业",

                                "最新数据": 27.78,

                                "股票家数": 15,

                                "亏损家数": 0,

                                "近一个月": 27.88,

                                "近三个月": 29.33,

                                "近六个月": 30.56,

                                "近一年": 29.64,

                                "细分行业": null

                        }

                ]

        },

转载请注明出处:http://www.cnblogs.com/majianguo/p/8150060.html

Golang 网络爬虫框架gocolly/colly 三的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 网络爬虫框架Scrapy简介

    作者: 黄进(QQ:7149101) 一. 网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本:它是一个自动提取网页的程序,它为搜索引擎从万维 ...

  7. [原创]一款基于Reactor线程模型的java网络爬虫框架

    AJSprider 概述 AJSprider是笔者基于Reactor线程模式+Jsoup+HttpClient封装的一款轻量级java多线程网络爬虫框架,简单上手,小白也能玩爬虫, 使用本框架,只需要 ...

  8. 基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)

    原文地址http://blog.csdn.net/qy20115549/article/details/52203722 本文为原创博客,仅供技术学习使用.未经允许,禁止将其复制下来上传到百度文库等平 ...

  9. Scrapy (网络爬虫框架)入门

    一.Scrapy 简介: Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,Scrapy 使用了 Twisted['twɪstɪd](其主要对手是Tornado) ...

随机推荐

  1. scrapy初试水 day03(递归调用)

    import scrapyfrom scrapy.http import Requestfrom scrapy.spider import Rulefrom scrapy.linkextractors ...

  2. vue.js权威指南 PDF

    链接:https://pan.baidu.com/s/1c2ItN6S 密码:ya8r

  3. SketchMaster 隐私政策

    隐私政策 本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐 ...

  4. linux系统下安装配置解压版的MySQL数据库

    一.解压文件到当前目录 命令:tar -zxvf mysql....tar.gz 二.移动解压完成的文件夹到目标目录并更名mysql 命令:mv mysql-版本号 /usr/local/mysql ...

  5. NGUI_PopupList

    八.PopuList下拉菜单 1.使用Populist的规律: (1).有一系列选项需要玩家做出选择,这些选项是有限多个的. (2).这些选项玩家必须选择一个,也只能选择一个. (3).这些选项如果全 ...

  6. 《算法》C/C++ 图形处理

    概述 一般图形输出无法就是用循环输出 ,提前构造好图形. 两种方式 ** 模拟法直接输出** ** 二维数组 构造输出** 问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEF ...

  7. arguments.callee的临时指向特性

    function r(){ alert('BBB'); } var a = { f: function(){ alert('AAA'); arguments.callee = r; } }; 弹出的都 ...

  8. 基于winpcap的以太网流量分析器(java)

    开发工具 IDE:eclipse -neon JDK:1.8 OS:Win10-64bit 主要功能 1.要求完成一个基于Winpcap的网络流量统计分析系统,具有易用.美观的界面. 2.完成局域网( ...

  9. Android的init过程:init.rc解析流程

    这几天打算看下安卓的代码,看优秀的源代码也是一种学习过程,看源代码的过程就感觉到,安卓确实是深受linux内核的影响,不少数据结构的使用方法全然一致.花了一中午时间,研究了下init.rc解析过程,做 ...

  10. RUP 方法简介

    1.什么是RUP: Rational Unified Process(以下简称RUP) 是一套软件工程方法,主要由 Ivar Jacobson的 The Objectory Approch 和 The ...