Golang 网络爬虫框架gocolly/colly 三

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

定义数据结构体,

  1. //证监会行业市盈率
  2.  
  3. type ZhjhHyShyl struct {
  4.  
  5. Hydm string `json:"行业代码"`
  6.  
  7. Hymc string `json:"行业名称"`
  8.  
  9. Zxsj *float64 `json:"最新数据"`
  10.  
  11. Gpjs int `json:"股票家数"`
  12.  
  13. Ksjs int `json:"亏损家数"`
  14.  
  15. Jygy *float64 `json:"近一个月"`
  16.  
  17. Jsgy *float64 `json:"近三个月"`
  18.  
  19. Jlgy *float64 `json:"近六个月"`
  20.  
  21. Jyn *float64 `json:"近一年"`
  22.  
  23. Zhy []*ZhjhHyShyl `json:"细分行业"`
  24.  
  25. }

  

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

  1. 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选择器,然后改成相对路径。

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

  1. package main
  2.  
  3. import (
  4.  
  5. "encoding/json"
  6.  
  7. "fmt"
  8.  
  9. "log"
  10.  
  11. "strconv"
  12.  
  13. "strings"
  14.  
  15. "github.com/PuerkitoBio/goquery"
  16.  
  17. "github.com/gocolly/colly"
  18.  
  19. )
  20.  
  21. //证监会行业市盈率
  22.  
  23. type ZhjhHyShyl struct {
  24.  
  25. Hydm string `json:"行业代码"`
  26.  
  27. Hymc string `json:"行业名称"`
  28.  
  29. Zxsj *float64 `json:"最新数据"`
  30.  
  31. Gpjs int `json:"股票家数"`
  32.  
  33. Ksjs int `json:"亏损家数"`
  34.  
  35. Jygy *float64 `json:"近一个月"`
  36.  
  37. Jsgy *float64 `json:"近三个月"`
  38.  
  39. Jlgy *float64 `json:"近六个月"`
  40.  
  41. Jyn *float64 `json:"近一年"`
  42.  
  43. Zhy []*ZhjhHyShyl `json:"细分行业"`
  44.  
  45. }
  46.  
  47. func main() {
  48.  
  49. var err error
  50.  
  51. c := colly.NewCollector()
  52.  
  53. 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"
  54.  
  55. zjhHyShyl := make([]*ZhjhHyShyl, 0)
  56.  
  57. c.OnRequest(func(r *colly.Request) {
  58.  
  59. fmt.Printf("%+v\r\n%+v\r\n", *r, *(r.Headers))
  60.  
  61. })
  62.  
  63. c.OnHTML("td>table.list-div-table>tbody>tr", func(e *colly.HTMLElement) {
  64.  
  65. hyShy := ZhjhHyShyl{
  66.  
  67. Hydm: e.ChildText("td:first-child"),
  68.  
  69. Hymc: e.ChildText("td:nth-child(2)"),
  70.  
  71. }
  72.  
  73. zxsj, err := strconv.ParseFloat(e.ChildText("td:nth-child(3)"), 64)
  74.  
  75. if err == nil {
  76.  
  77. hyShy.Zxsj = &zxsj
  78.  
  79. }
  80.  
  81. gpjs, err := strconv.ParseInt(e.ChildText("td:nth-child(4)"), 10, 32)
  82.  
  83. if err == nil {
  84.  
  85. hyShy.Gpjs = int(gpjs)
  86.  
  87. }
  88.  
  89. ksjs, err := strconv.ParseInt(e.ChildText("td:nth-child(5)"), 10, 32)
  90.  
  91. if err == nil {
  92.  
  93. hyShy.Ksjs = int(ksjs)
  94.  
  95. }
  96.  
  97. jygy, err := strconv.ParseFloat(e.ChildText("td:nth-child(6)"), 64)
  98.  
  99. if err == nil {
  100.  
  101. hyShy.Jygy = &jygy
  102.  
  103. }
  104.  
  105. jsgy, err := strconv.ParseFloat(e.ChildText("td:nth-child(7)"), 64)
  106.  
  107. if err == nil {
  108.  
  109. hyShy.Jsgy = &jsgy
  110.  
  111. }
  112.  
  113. jlgy, err := strconv.ParseFloat(e.ChildText("td:nth-child(8)"), 64)
  114.  
  115. if err == nil {
  116.  
  117. hyShy.Jlgy = &jlgy
  118.  
  119. }
  120.  
  121. jyn, err := strconv.ParseFloat(e.ChildText("td:nth-child(9)"), 64)
  122.  
  123. if err == nil {
  124.  
  125. hyShy.Jyn = &jyn
  126.  
  127. }
  128.  
  129. zjhHyShyl = append(zjhHyShyl, &hyShy)
  130.  
  131. hyShy.Zhy = make([]*ZhjhHyShyl, 0)
  132.  
  133. e.DOM.Parent().Parent().Next().Find("table.list-div-table>tbody>tr").Each(func(_ int, s *goquery.Selection) {
  134.  
  135. zhy := ZhjhHyShyl{
  136.  
  137. Hydm: strings.Trim(s.Find("td:nth-child(1)").Text(), "\r\n\t "),
  138.  
  139. Hymc: strings.Trim(s.Find("td:nth-child(2)").Text(), "\r\n\t "),
  140.  
  141. }
  142.  
  143. zxsj, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(3)").Text(), "\r\n\t "), 64)
  144.  
  145. if err == nil {
  146.  
  147. zhy.Zxsj = &zxsj
  148.  
  149. }
  150.  
  151. gpjs, err := strconv.ParseInt(strings.Trim(s.Find("td:nth-child(4)").Text(), "\r\n\t "), 10, 32)
  152.  
  153. if err == nil {
  154.  
  155. zhy.Gpjs = int(gpjs)
  156.  
  157. }
  158.  
  159. ksjs, err := strconv.ParseInt(strings.Trim(s.Find("td:nth-child(5)").Text(), "\r\n\t "), 10, 32)
  160.  
  161. if err == nil {
  162.  
  163. zhy.Ksjs = int(ksjs)
  164.  
  165. }
  166.  
  167. jygy, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(6)").Text(), "\r\n\t "), 64)
  168.  
  169. if err == nil {
  170.  
  171. zhy.Jygy = &jygy
  172.  
  173. }
  174.  
  175. jsgy, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(7)").Text(), "\r\n\t "), 64)
  176.  
  177. if err == nil {
  178.  
  179. zhy.Jsgy = &jsgy
  180.  
  181. }
  182.  
  183. jlgy, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(8)").Text(), "\r\n\t "), 64)
  184.  
  185. if err == nil {
  186.  
  187. zhy.Jlgy = &jlgy
  188.  
  189. }
  190.  
  191. jyn, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(9)").Text(), "\r\n\t "), 64)
  192.  
  193. if err == nil {
  194.  
  195. zhy.Jyn = &jyn
  196.  
  197. }
  198.  
  199. hyShy.Zhy = append(hyShy.Zhy, &zhy)
  200.  
  201. })
  202.  
  203. })
  204.  
  205. c.OnScraped(func(_ *colly.Response) {
  206.  
  207. bData, _ := json.MarshalIndent(zjhHyShyl, "", "\t")
  208.  
  209. fmt.Println(string(bData))
  210.  
  211. })
  212.  
  213. err = c.Visit("http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio?date=2017-12-27&type=zjh1")
  214.  
  215. if err != nil {
  216.  
  217. log.Fatal(err)
  218.  
  219. }
  220.  
  221. }

  

运行后的部分结果:

  1. {
  2.  
  3. "行业代码": "D",
  4.  
  5. "行业名称": "电力、热力、燃气及水的生产和供应业",
  6.  
  7. "最新数据": 20.12,
  8.  
  9. "股票家数": 107,
  10.  
  11. "亏损家数": 5,
  12.  
  13. "近一个月": 19.51,
  14.  
  15. "近三个月": 19.7,
  16.  
  17. "近六个月": 19.87,
  18.  
  19. "近一年": 18.9,
  20.  
  21. "细分行业": [
  22.  
  23. {
  24.  
  25. "行业代码": "44",
  26.  
  27. "行业名称": "电力、热力生产和供应业",
  28.  
  29. "最新数据": 18.75,
  30.  
  31. "股票家数": 70,
  32.  
  33. "亏损家数": 3,
  34.  
  35. "近一个月": 18.28,
  36.  
  37. "近三个月": 18.43,
  38.  
  39. "近六个月": 18.55,
  40.  
  41. "近一年": 17.44,
  42.  
  43. "细分行业": null
  44.  
  45. },
  46.  
  47. {
  48.  
  49. "行业代码": "45",
  50.  
  51. "行业名称": "燃气生产和供应业",
  52.  
  53. "最新数据": 28.4,
  54.  
  55. "股票家数": 22,
  56.  
  57. "亏损家数": 2,
  58.  
  59. "近一个月": 25.71,
  60.  
  61. "近三个月": 25.33,
  62.  
  63. "近六个月": 25.38,
  64.  
  65. "近一年": 27.24,
  66.  
  67. "细分行业": null
  68.  
  69. },
  70.  
  71. {
  72.  
  73. "行业代码": "46",
  74.  
  75. "行业名称": "水的生产和供应业",
  76.  
  77. "最新数据": 27.78,
  78.  
  79. "股票家数": 15,
  80.  
  81. "亏损家数": 0,
  82.  
  83. "近一个月": 27.88,
  84.  
  85. "近三个月": 29.33,
  86.  
  87. "近六个月": 30.56,
  88.  
  89. "近一年": 29.64,
  90.  
  91. "细分行业": null
  92.  
  93. }
  94.  
  95. ]
  96.  
  97. },

转载请注明出处: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. apache mysql无法启动解决办法

    最近在调试几个代码,需要不停的启动关闭服务器和mysql.在连续的几次开关后,无法启动了,每次启动后就直接关闭. 刚开始是怀疑是不是端口被占用了,查看端口后,并没有端口被占用的情况.查看mysql错误 ...

  2. 【jQuery插件】使用cropper实现简单的头像裁剪并上传

    插件介绍 这是一个我在写以前的项目的途中发现的一个国人写的jQuery图像裁剪插件,当时想实现用户资料的头像上传功能,并且能够预览图片,和对图片进行简单的裁剪.旋转,花了不少时间才看到了这个插件,感觉 ...

  3. PHP防XSS 防SQL注入的代码

    作为开发人员时刻要记住一句话,永远不要相信任何用户的输入!很多时候我们的网站会因为我们开发人员写的代码不够严谨,而使网站受到攻击,造成不必要的损失!下面介绍一下如何防止SQL注入! 这里提供了一个函数 ...

  4. php 可逆加密方法

    可以逆转的加密类,没有密钥很难破解 [PHP]代码 <? class encryptCalss { var $key=12; function encode($txt){ for($i=0;$i ...

  5. appium+Linux环境安装配置

      背景:想要在Jenkins上跑appium的自动化测试,所以想要在Jenkins服务器(Linux远程)上安装appium服务,故而研究了一下appium+Linux下安装.虽然有无数的前辈踩过坑 ...

  6. js屏蔽广告

    最近遇到有些广告的问题,首先是在手机端,可能是用户访问了一些小网站的,(你懂得),然后在访问我的网站时,会带小广告过来,通常是wifi被dns劫持的情况下导入到广告脚本, 1.处理这些要知道广告的根源 ...

  7. Windows2000源代码 200+MB

    全球最大的软件制造商微软2月12日警告公众称其一部分珍贵的Windows NT和Windows 2000操作系统源代码被泄漏到了一些在线文件共享网络中. 微软称被泄漏的代码只是整个程序的一小部分,但这 ...

  8. 约瑟夫问题 小孩报数问题poj3750

    小孩报数问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15228   Accepted: 6778 Descripti ...

  9. 时间紧任务重---extjs的学习就这么开始吧

    我们的extjs借助了一个模板引擎--artTemplate,它是一个开源的项目,不多说,给个链接吧:http://aui.github.io/artTemplate/ 直接上代码: <!DOC ...

  10. 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多

    通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无 ...