request+goquery+mahonia实现自动抓取网页数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/details/52194839

 设计院OA上有维护得比较好的法规库,3000多条,我用了30分钟一页页拷贝到excel中。一共1500页啊。 为啥不用代码抓取呢?因为开始连用chrome登陆访问这个库都打不开,只支持ie。用fiddler获得库页面地址,拷贝到chrome中,也是直接跳到登陆页。今天再努力,chrome登陆,然后点击:进入系统——会打开一个独立的窗口,这个窗口似乎不支持地址输入,没关系,在这个窗口中——公共信息——点下拉——技术标准,会打开一个新窗口,库就出现了。 此时,再回到chrome任何标签页,输入地址,也可以打开了这个库了。不知为何这么复杂。 仅仅记录一下。 下面进入正题,用代码直接抓取库。这样用一个循环可以把1500页一次性抓下来了。 用到三个知识点:request库是构造http访问信息头的,这里将登陆的cookie带上,才能模拟登陆了;mahonia是将页面gb的编码转成utf-8,否则是乱码;goquery大名鼎鼎的获取html中所需要的信息,过滤,定位。

码: 

package main


import (

    "code.google.com/p/mahonia"

    "fmt"

    "github.com/PuerkitoBio/goquery"

    "github.com/mozillazg/request"

    "log"

    "net/http"

)


func main() {

    c := new(http.Client)

    req := request.NewRequest(c)

    req.Cookies = map[string]string{

        "JSESSIONID": "35A39472B18BC213B6288F3B6BAA3ABC", //76751D487E4931BA53EE7EF51760E88F

        "stylePath":  "",

    }

    resp, _ := req.Get("http://gpdioa.gpdiwe.com/ProjManager/flfgv08070300009.jsp?08070300003_page=1

    &flf81024flfgl01=&flf81024flfgl01=%BC%BC%CA%F5%B1%EA%D7%BC")


    defer resp.Body.Close() // Don't forget close the response body


    dec := mahonia.NewDecoder("GB2312") //定义转换乱码

    //  fmt.Println(dec.ConvertString(j))   //转成utf-8


    rd := dec.NewReader(resp.Body)

    doc, err := goquery.NewDocumentFromReader(rd)

    if err != nil {

        log.Fatal(err)

    }


    // Find the review items

    doc.Find("tr.trclass").Each(func(i int, s *goquery.Selection) {

        // For each item found, get the band and title

        band := s.Find("td").Text()

        //      title := s.Find("i").Text()

        fmt.Printf("%d: 序号、编号、名称、分类……%s\n", i, band) //, title

    })


}

输出结果:

0: 序号、编号、名称、分类……1 水利水电工程建设程序及法规汇编(第三版)政策法规技术标准2016-08-012016-08-01

1: 序号、编号、名称、分类……215S909《消防给水及消火栓系统技术规范》图示其它技术标准

2: 序号、编号、名称、分类……314S104二次供水消毒设备选用及安装其它技术标准

3: 序号、编号、名称、分类……415SS510绿地灌溉与体育场地给水排水设施其它技术标准

4: 序号、编号、名称、分类……5GA 180轻便消防水龙其它技术标准

5: 序号、编号、名称、分类……614X505-1火灾自动报警系统设计规范图示其它技术标准

6: 序号、编号、名称、分类……7GB 50594-2010水功能区划分标准国家标准技术标准

7: 序号、编号、名称、分类……8国务院令(2003)第393号建设工程安全生产管理条例政策法规技术标准

8: 序号、编号、名称、分类……9SL 721-2015水利水电工程施工安全管理导则行业标准技术标准2015-07-312015-10-31

9: 序号、编号、名称、分类……10JGJ 107-2016钢筋机械连接技术规程行业标准技术标准

10: 序号、编号、名称、分类……11SL 677-2014水工混凝土施工规范行业标准技术标准

11: 序号、编号、名称、分类……12 中华人民共和国航道法国家标准技术标准2016-07-022016-07-02

12: 序号、编号、名称、分类……13 中华人民共和国职业病防治法政策法规技术标准2016-07-022016-07-02

13: 序号、编号、名称、分类……14主席令74号中华人民共和国水法政策法规技术标准2016-07-022016-07-02

14: 序号、编号、名称、分类……15 中华人民共和国节约能源法政策法规技术标准2016-07-022016-07-02

15: 序号、编号、名称、分类……16SL/Z 738-2016水生态文明城市建设评价导则行业标准技术标准2016-04-112016-07-11

16: 序号、编号、名称、分类……17SL 734-2016水利工程质量检测技术规程行业标准技术标准2016-06-072016-09-07

17: 序号、编号、名称、分类……18SL 725-2016水利水电工程安全监测设计规范行业标准技术标准2016-05-232016-08-23

18: 序号、编号、名称、分类……19GB 51079-2016城市防洪规划规定国家标准技术标准 2017-02-01

19: 序号、编号、名称、分类……20CJ 343-2010污水排入城市下水道水质标准行业标准技术标准2010-07-292011-01-01CJ 3082-1999

原始页面:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大壮

对BarrageRenderer的理解分享(理论篇)

23840
来自专栏非典型技术宅

Quartz2D进行渲染1. 渲染模式2. even-odd rule:奇偶填充规则3. nonzero winding number rule:非零绕数规则4. 其他会用到的渲染模式5. 混合模式

16530
来自专栏UAI人工智能

RLLAB 入门

57530
来自专栏前端杂货铺

不要使用浏览器嗅探,尽量使用特性检测和特性模拟

平淡的描述   在js中,能使用特征监测就尽量不要使用浏览器嗅探。嗅探浏览器目的是判断可否使用这个对象或者API,但是抛开浏览器 的各个版本的userAgent...

32550
来自专栏hotqin888的专栏

microstation vba起步——建立实体

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

14730
来自专栏数据小魔方

动态图表系列1|数据有效性(index+match函数)

今天开始跟大家分享动态图表的技巧1——数据有效性(index+match函数)! 动态图表之——数据有效性(index+match) 首先利用数据验证制作下拉菜...

50070
来自专栏ytkah

css自动换行如何设置?url太长会撑开页面

  我们更新文章时如果有引用其他文章一般会带一个原文url,但这个链接如果太长的话会把内容的版块撑开,整个排版乱了。那我们能不能设置css自动换行呢?如下图所示...

32750
来自专栏小灰灰

Java 借助ImageMagic实现图片编辑服务

Java 借助ImageMagic实现图片编辑服务 java原生对于图片的编辑处理并没有特别友好,而且问题也有不少,那么作为一个java后端,如果要提供图片的编...

91760
来自专栏我爱编程

利用Python进行录音和音频分析

Python有个很强大的处理音频的库pyqudio, 使用pyaudio库可以进行录音,播放,生成wav文件等等。更多介绍可以查阅官方文档。

1.2K30
来自专栏数据小魔方

Excel单元格内容合并的技巧!!!

今天给大家分享单元格内容合并的技巧! ▽ 之前推送过一篇单元格数据分裂的技巧,很多同学都私信我说很实用,并且希望以后能够多写一些这种可以瞬间提升工作效率的小技巧...

32870

扫码关注云+社区

领取腾讯云代金券