Golang 网络爬虫框架gocolly/colly 五 获取动态数据
Golang 网络爬虫框架gocolly/colly 五 获取动态数据
gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种,一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高;二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨;三,使用浏览器控件,比如webloop;四,直接操纵浏览器,比如chromedp。一和二需要goquery提取javascript,然后再提取数据,速度非常快;三和四不需要分析脚本,在浏览器执行JavaScript生成页面后再提取,是比较偷懒的方式,但缺点是执行速度很慢,如果在脚本非常复杂、懒得分析脚本的情况下,牺牲下速度也是不错的选择。
不同的场景,做不同的选择。中证指数有限公司下载中心提供了行业市盈率下载,数据文件的Url在页面的脚本中,脚本简单且特征明显,直接用正则表达式的方式是最好的选择。

下载地址对应一段脚本
<a href="javascript:;" class="ml-20 dl download1">下载<i class="i_icon i_icon_rar ml-5"></i></a>
<script>
$(function() {
//切换
$('.hysyl_con').rTabs({
bind: 'click',
auto: false,
});
tabs($('.snav .tab_item'),$('.sCon .tab-con-item'));
tabs($('.snav2 .tab_item'),$('.sCon2 .tab-con-item'));
tabs($('.snav3 .tab_item'),$('.sCon3 .tab-con-item'));
$("#search_code1").on("click",function(){
var csrc_code = $("#csrc_code1").val();
if (csrc_code == '') {
return false;
}
var url = "http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio-detail?date=2018-01-19&class=1&search=1&csrc_code="+csrc_code;
$("#link_1").attr('href', url);
document.getElementById("link_1").click();
})
$("#search_code2").on("click",function(){
var csrc_code = $("#csrc_code2").val();
if (csrc_code == '') {
return false;
}
var url = "http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio-detail?date=2018-01-19&class=1&search=1&csrc_code="+csrc_code;
$("#link_2").attr('href', url);
document.getElementById("link_2").click();
})
})
$(".download1").on("click",function(){
var date = $(".date1").val();
date = date.replace(/\-/g, '');
if (date) {
$("#link1").attr('href', 'http://115.29.204.48/syl/'+date+'.zip');
document.getElementById("link1").click();
}
});
$(".download2").on("click",function(){
var date = $(".date2").val();
date = date.replace(/\-/g, '');
if (date) {
$("#link2").attr('href', 'http://115.29.204.48/syl/csi'+date+'.zip');
document.getElementById("link2").click();
}
});
$(".download3").on("click",function(){
var date = $(".date3").val();
date = date.replace(/\-/g, '');
if (date) {
$("#link3").attr('href', 'http://115.29.204.48/syl/bk'+date+'.zip');
document.getElementById("link3").click();
}
});
</script>

点击下载时,为link1元素生成href属性,然后点击link1,这需要用gocolly+goquery提取date,然后获取服务器地址http://115.29.204.48/,根据获取文件的类型拼接字符串生成下载地址。
获取交易日期
sTime := ""
var bodyData []byte
c:= colly.NewCollector()
c.OnResponse(func (resp *colly.Response) {
bodyData = resp.Body
})
c.OnHTML("input[name=date]",func (el *colly.HTMLElement) {
sTime = el.Attr("value")
})
err = c.Visit("http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio")
if err != nil {
return
}
获取文件服务器地址,下载zip文件
htmlDoc,err := goquery.NewDocumentFromReader(bytes.NewReader(bodyData))
if err != nil {
return
}
scripts := htmlDoc.Find("script")
destScript := ""
for _,n := range scripts.Nodes {
if n.FirstChild != nil {
if strings.Contains(n.FirstChild.Data,"syl/csi") && strings.Contains(n.FirstChild.Data,".download2"){
destScript = n.FirstChild.Data
break
}
}
}
re,err := regexp.Compile("http://[0-9]+.[0-9]+.[0-9]+.[0-9]+/syl/csi")
if err != nil {
log.Fatal(err)
}
result := re.FindString(destScript)
pos := strings.LastIndex(result,"/")
parentUrl := result[0:pos+1]
link := parentUrl
sTime = strings.Replace(sTime,"-","",-1)
fileName := ""
if t == ZhengJjianHuiHangYePERatio {
fileName = fmt.Sprintf("%s.zip",sTime)
link += fileName
fileName = "zjh"+fileName
}else if t == ZhongZhengHangYePERatio {
fileName = fmt.Sprintf("csi%s.zip",sTime)
link += fileName
}else {
fileName = fmt.Sprintf("bk%s.zip",sTime)
link += fileName
}
fmt.Println(link)
cli:=http.Client{}
resp,err := cli.Get(link)
if err != nil {
return
}
defer resp.Body.Close()
fullFileName := fmt.Sprintf("%s/%s",filePath,fileName)
if resp.StatusCode == 200 {
allBody,err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
err = ioutil.WriteFile(fullFileName,allBody,0666)
if err != nil {
return err
}
}else{
err = fmt.Errorf("bad resp.%d",resp.StatusCode)
return
}
err = archiver.Zip.Open(fullFileName, filePath)
在脚本里匹配服务器ip地址用 http://[0-9]+.[0-9]+.[0-9]+.[0-9]+/syl/csi
,因为前后都有限定元素,所以写得比较简单;如果没有前后限定条件,设计正则表达式就得多费心了,复杂的正则表达式会吓跑很多人。不过没关系,稍微了解一些正则表达式的知识,就可以用在爬虫上了。
下载的文件是excel(.xls格式)的zip压缩包,解压缩操纵及xls读取后面再介绍。
转载请注明出处:https://www.cnblogs.com/majianguo/
Golang 网络爬虫框架gocolly/colly 五 获取动态数据的更多相关文章
- Golang 网络爬虫框架gocolly/colly 四
Golang 网络爬虫框架gocolly/colly 四 爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟.回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫, ...
- Golang 网络爬虫框架gocolly/colly 一
Golang 网络爬虫框架gocolly/colly 一 gocolly是用go实现的网络爬虫框架,目前在github上具有3400+星,名列go版爬虫程序榜首.gocolly快速优雅,在单核上每秒可 ...
- Golang 网络爬虫框架gocolly/colly 三
Golang 网络爬虫框架gocolly/colly 三 熟悉了<Golang 网络爬虫框架gocolly/colly一>和<Golang 网络爬虫框架gocolly/colly二& ...
- Golang 网络爬虫框架gocolly/colly 二 jQuery selector
Golang 网络爬虫框架gocolly/colly 二 jQuery selector colly框架依赖goquery库,goquery将jQuery的语法和特性引入到了go语言中.如果要灵活自如 ...
- 试验一下Golang 网络爬虫框架gocolly/colly
参考:http://www.cnblogs.com/majianguo/p/8186429.html 框架源码在 github.com/gocolly/colly 代码如下(github源码中的dem ...
- 基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)
原文地址http://blog.csdn.net/qy20115549/article/details/52203722 本文为原创博客,仅供技术学习使用.未经允许,禁止将其复制下来上传到百度文库等平 ...
- 网络爬虫框架Scrapy简介
作者: 黄进(QQ:7149101) 一. 网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本:它是一个自动提取网页的程序,它为搜索引擎从万维 ...
- [原创]一款基于Reactor线程模型的java网络爬虫框架
AJSprider 概述 AJSprider是笔者基于Reactor线程模式+Jsoup+HttpClient封装的一款轻量级java多线程网络爬虫框架,简单上手,小白也能玩爬虫, 使用本框架,只需要 ...
- Python爬虫框架Scrapy实例(三)数据存储到MongoDB
Python爬虫框架Scrapy实例(三)数据存储到MongoDB任务目标:爬取豆瓣电影top250,将数据存储到MongoDB中. items.py文件复制代码# -*- coding: utf-8 ...
随机推荐
- Netty学习笔记(一):接收nodejs模拟表单上传的文件
好久不写博客了,也好久不写代码了,这两天临时遇上一个事情,觉得不难,加上觉得手有些生,就动手做了一下,结果遇上了不少坑,有新坑,有老坑,痛苦无比,现在总算差不多了,赶紧记录下来,希望以后不再重复这种痛 ...
- 小型Web页打包优化(下)
之前我们推送了一篇小型Web项目打包优化文章,(链接),我们使用了一段时间, 在这过程中我们也一直在思考, 怎么能把结构做的更好.于是我们改造了一版, 把可以改进的地方和可能会出现的问题, 在这一版中 ...
- iOSXML & JSON 简介
XML & JSON 简介 •JSON –作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 –基于JavaScript的一个子集 –易读性略差,编码手写难度大,数据量小 ...
- 并行cmd
#!/bin/bash ]; then echo -e "usage : \n\t$0 hostList REMOTE_CMD" echo -e "example: \n ...
- Java多线程之赛跑游戏
在JavaSE中,多线程是一个重要的内容. 我们要了解多线程的概念,就要先了解进程的概念:要了解进程的概念,就离不开操作系统的概念. 在一台正常运行的电脑中,计算机硬件(如CPU.内存.硬盘.网卡.显 ...
- xml文件解析(使用解析器)
一.Xml解析,解析xml并封装到list中的javabean中 OM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在 ...
- [置顶]
xamarin android使用gps定位获取经纬度
看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位.基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用 ...
- JS如何实现导航栏的智能浮动
<script language="javascript"> function smartFloat(obj) { var obj = docu ...
- 视觉SLAM
SLAM:Simultaneous Localization And Mapping.中文:同时定位与地图重建. 它是指搭载特定传感器的主体,在没有实验先验信息的情况下,于运动过程中建立环境的模型,同 ...
- ADB 安卓开发配置环境
下载完后将名称中含有adb的文件,和fastboot.exe复制到 c:/windows/system32目录 或c:/windows/system64目录(看自己电脑系统配置 如电脑64操作系统就写 ...