Golang 网络爬虫框架gocolly/colly 三
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 三的更多相关文章
- Golang 网络爬虫框架gocolly/colly 四
Golang 网络爬虫框架gocolly/colly 四 爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟.回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫, ...
- Golang 网络爬虫框架gocolly/colly 五 获取动态数据
Golang 网络爬虫框架gocolly/colly 五 获取动态数据 gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goque ...
- Golang 网络爬虫框架gocolly/colly 二 jQuery selector
Golang 网络爬虫框架gocolly/colly 二 jQuery selector colly框架依赖goquery库,goquery将jQuery的语法和特性引入到了go语言中.如果要灵活自如 ...
- Golang 网络爬虫框架gocolly/colly 一
Golang 网络爬虫框架gocolly/colly 一 gocolly是用go实现的网络爬虫框架,目前在github上具有3400+星,名列go版爬虫程序榜首.gocolly快速优雅,在单核上每秒可 ...
- 试验一下Golang 网络爬虫框架gocolly/colly
参考:http://www.cnblogs.com/majianguo/p/8186429.html 框架源码在 github.com/gocolly/colly 代码如下(github源码中的dem ...
- 网络爬虫框架Scrapy简介
作者: 黄进(QQ:7149101) 一. 网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本:它是一个自动提取网页的程序,它为搜索引擎从万维 ...
- [原创]一款基于Reactor线程模型的java网络爬虫框架
AJSprider 概述 AJSprider是笔者基于Reactor线程模式+Jsoup+HttpClient封装的一款轻量级java多线程网络爬虫框架,简单上手,小白也能玩爬虫, 使用本框架,只需要 ...
- 基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)
原文地址http://blog.csdn.net/qy20115549/article/details/52203722 本文为原创博客,仅供技术学习使用.未经允许,禁止将其复制下来上传到百度文库等平 ...
- Scrapy (网络爬虫框架)入门
一.Scrapy 简介: Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,Scrapy 使用了 Twisted['twɪstɪd](其主要对手是Tornado) ...
随机推荐
- PHP面向对象之const常量修饰符
在PHP中定义常量是通过define()函数来完成的,但在类中定义常量不能使用define(),而需要使用const修饰符.类中的常量使用const定义后,其访问方式和静态成员类似,都是通过类名或在成 ...
- (译)ABP之依赖注入
原文地址:https://aspnetboilerplate.com/Pages/Documents/Dependency-Injection 什么是依赖注入 传统方式的问题 解决方案 构造函数注入 ...
- Promise原理与实现探究的一种思路
写在前面 这个文章,展现的是一个实现Promise的思路,以及如何发现和处理问题的情境. 从现有的Promise分析 如果我们想要自己实现一个简单的Promise,那现有规范规定的Promise肯定是 ...
- 一个PHP高性能、多并发、restful的工具库(基于multi_curl)
This is high performance curl wrapper written in pure PHP. It's compatible with PHP 5.4+ and HHVM. N ...
- mybatis中使用if标签比较两个字符串是否相等
<!-- 此处使用if比较是否相等 --> 范例一: <select id="findClientIds" parameterType="map&quo ...
- windows10 使用gitblit搭建git服务器
今天在win10上使用gitblit搭建git服务器时被坑了下,因为安装的java9出现不兼容问题,果断卸载重装了jdk8.废话不多说直接进入正题吧: 第一章 前言 使用gitblit搭建git se ...
- 运行循环 - RunLoop
1.RunLoop简介 1.1 什么是RunLoop 简单来说就是:运行循环,可以理解成一个死循环,一直在运行. RunLoop实际上就是一个对象,这个对象用来处理程序运行过程中出现的各种事件(触摸. ...
- 【特征匹配】BRISK原文翻译
原文:Stefan Leutenegger, Margarita Chli et al.<BRISK: Binary Robust Invariant Scalable Keypoints> ...
- quick-cocos2d-x教程1:在window上创建第一个项目文件夹,并制作helloworld
说明:此教程是针对cocos2dx 2.0系列的,3.0的版本号,如今还没有公布出来. 1)首先从github.com把这个项目下载到本地.然后装到d盘的根文件夹,并设置文件夹路径为d:\quick- ...
- dma_alloc_coherent (建立一致性 DMA 映射函数)
1.函数申明 /** * dma_alloc_coherent - allocate consistent memory for DMA * @dev: valid struct device poi ...