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) ...
随机推荐
- c语言贪吃蛇详解3.让蛇动起来
c语言贪吃蛇详解3.让蛇动起来 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 上次 ...
- WCF、WebAPI、WCFREST、WebService之间的区别和选择
转载翻译,原文:http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-a ...
- IntelliJ IDEA(二) :面板介绍
一.面板说明 IDEA面板的全貌如下图 二.菜单栏 下面会简单介绍下一些常用的部分菜单使用,如有疑问或补充欢迎留言. (1).File文件 1. New:新建一个工程 可以新建project,导入已存 ...
- OpenStack搭建遇到的问题2(组件配置错误了,别重装全部,就把模块卸载就行了)
apt-get remove -y mysql-server python-mysqldb 在装OpenStack的时候,出错的可能就是就是一个模块,比如keysstone或者是glance出错了,我 ...
- MongoDb安装--yum安装
本帖最后由 草包 于 2017-5-2 09:57 编辑 [Shell] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 ...
- spring mvc 复杂参数注入
过了这么久,又重新把博客拾起来了 来上海工作也已经有将近两周的时间了, 今天在整理项目的时候,遇到了一个关于参数注入的问题 背景: 我的开发前台用的是extjs4,在对后台spring mvc提交表单 ...
- 参加完Rocket MQ Meetup深圳站,回顾和想法
最近一段时间才开始关注云栖社区的公众号,在两周前看到要在深圳科兴科学园办一场Rocket MQ的Meetup.因为从来没有参加过这种线下活动,而且对Rocket MQ比较感兴趣,所以就立即报名参加. ...
- 刚从it培训班出来的学生如何走向工作岗位
大家好,这是我本人在博客园的第一篇博文. 相信很多人都是从 it 培训班学习然后加入到程序员这个大家族,或多或少,有些人会和博主有一样的感受,所以此篇博文我们不讨论技术,博主也是刚从培训班坑里跳出来正 ...
- Android自定义processor实现bindView功能
一.简介 在现阶段的Android开发中,注解越来越流行起来,比如ButterKnife,Retrofit,Dragger,EventBus等等都选择使用注解来配置.按照处理时期,注解又分为两种类型, ...
- 为开源社区尽一份力,翻译RocketMQ官方文档
正如在上一篇文章中写道:"据我所知,现在RocketMQ还没有中文文档.我打算自己试着在github上开一个项目,自行翻译."我这几天抽空翻译了文档的前3个小节,发现翻译真的不是一 ...