专栏首页马洪彪C#爬虫系列(一)——国家标准全文公开系统

C#爬虫系列(一)——国家标准全文公开系统

网上有很多Python爬虫的帖子,不排除很多培训班借着AI的概念教Python,然后爬网页自然是其中的一个大章节,毕竟做算法分析没有大量的数据怎么成。

C#相比Python可能笨重了些,但实现简单爬虫也很便捷。网上有不少爬虫工具,通过配置即可实现对某站点内容的抓取,出于定制化的需求以及程序员重复造轮子的习性,我也做了几个标准公开网站的爬虫。

在学习的过程中,爬网页的难度越来越大,但随着问题的一一攻克,学习到的东西也越来越多,从最初简单的GET,到POST,再到模拟浏览器填写表单、提交表单,数据解析也从最初的字符串处理、正则表达式处理,到HTML解析。一个NB的爬虫需要掌握的知识不少,HTTP请求、响应,HTML DOM解析,正则表达式匹配内容,多线程、数据库存储,甚至有些高级验证码的处理都得AI。

当然,爬爬公开标准不是那么难,比如国家标准全文公开系统。

整个过程需要爬以下页面:

  1. 列表页
  2. 详细信息页
  3. 文件下载页

需要处理的技术问题有:

  1. HTTP请求
  2. 正则表达式
  3. HTML解析
  4. SqlLite数据库存储

一、列表页

首先查看到标准分GB和GB/T两类,地址分别为:

http://www.gb688.cn/bzgk/gb/std_list_type?p.p1=1&p.p90=circulation_date&p.p91=desc

http://www.gb688.cn/bzgk/gb/std_list_type?p.p1=2&p.p90=circulation_date&p.p91=desc。

从中可以看出,GET请求的查询字符串参数p1值为1和2分别查询到GB和GB/T。因此,要获取到标准列表,向以上地址发送GET请求即可。

HttpWebRequest httprequst = (HttpWebRequest)WebRequest.Create(Url);
HttpWebResponse webRes = (HttpWebResponse)httprequst.GetResponse();
 using (System.IO.Stream stream = webRes.GetResponseStream())
{
     using (System.IO.StreamReader reader = new StreamReader(stream,         System.Text.Encoding.GetEncoding("utf-8")))
     {
         content = reader.ReadToEnd();
     }
 }

标准共N多页,查看第二页标准列表,地址更改为:

http://www.gb688.cn/bzgk/gb/std_list_type?r=0.7783908698326173&page=2&pageSize=10&p.p1=1&p.p90=circulation_date&p.p91=desc。

由此可见page参数指定了分页列表的当前页数,据此,循环请求即可获取到所有的标准列表信息。

二、详细信息页

获取到标准列表后,下一步我需要获取到标准的详细信息页,从详细信息页中抓取更多的标准说明信息,例如标准的发布单位、归口单位等。

查看标准详细页URL,其值为:

http://www.gb688.cn/bzgk/gb/newGbInfo?hcno=9E5467EA1922E8342AF5F180319F34A0。

可以看出每个标准有个GUID值,在列表页面中点击按钮“查看详细”,转到详细页。实现这个跳转的方式,最简单的是HTML超链接,此外还可以是JS脚本,甚至是POST数据到服务器。不同的链接方式,自然需要不同的抓取方式,因此需要查看列表页源码来分析该站点的实现方式并找到对应的处理方法。

通过分析源码,可以看到在点击标准号时,通过JS的showInfo函数打开详细页面,由于JS方法传递的ID即为详细页面的参数ID,因此没必要去模拟onclick执行JS函数,直接解析到该GUID,GET请求详细页面即可。解析该GUID值,可以通过正则表达式方便的抓取到。

获取到详细信息页面后,要解析其中的内容,此时使用正则表达式解析就比较费劲了,可以采用HTML解析。C#解析HTML的第三方类库有不少,选择其中一款即可,HtmlAgilityPack或Winista.HtmlParser都是比较好用的。

三、文件下载页

解析到标准详细信息后,还需要进一步获取到标准PDF文件,分析详细页面可以看到标准文件下载页面路径为:

http://c.gb688.cn/bzgk/gb/showGb?type=download&hcno=9E5467EA1922E8342AF5F180319F34A0

进一步分析PDF文件的URL为:

http://c.gb688.cn/bzgk/gb/viewGb?hcno=9E5467EA1922E8342AF5F180319F34A0。

仍然是那个GUID值,因此可以直接GET请求该地址即可下载标准PDF文件。

至此标准的属性信息和标准PDF文件都可以下载到了,然后需要将这些信息存储起来。存储为SQL Server、Oracle自然比较笨重,即使Excel和Access也不大友好,推荐此类临时存储可以使用SqlLite。

 string connectionString = @"Data Source=" + dbBasePath + "StandardDB.db;Version=3;";
m_dbConnection = new SQLiteConnection(connectionString);
m_dbConnection.Open();
SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection);
command.ExecuteNonQuery();
m_dbConnection.Close();

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C#.Net与MATLAB集成

    在数学分析工具方面,MATLAB无疑是佼佼者,除了作为软件工具外,MATLAB的自定义编程语言以及混合编程的支持,使其可以与Python、R之类数学分析语言媲美...

    用户1637609
  • Java设计模式(八)Proxy代理模式

    一、场景描述 代理在生活中并不少见,租房子需要找中介,打官司需要找律师,很多事情我们需要找专业人士代理我们做,另一方面,中介和律师也代理了房东、法律程序与我们打...

    用户1637609
  • Server 2008 r2 多用户远程桌面配置

    参考资料链接: http://blog.163.com/fan_yishan/blog/static/476922132013018594951/ 按照以上链接...

    用户1637609
  • 【BDTC 2016】专访中兴飞流吕阿斌、郑龙:Yita,基于数据流的大数据计算引擎

    在此次大会的大数据分析与生态系统论坛上,中兴飞流信息科技有限公司CTO郑龙发表了“Yita:基于数据流的大数据计算引擎”的演讲,阐述了数据流对于大数据的影响,以...

    CSDN技术头条
  • 基于Pytorch的MLP实现基于Pytorch的MLP实现

    基于Pytorch的MLP实现 目标 使用pytorch构建MLP网络 训练集使用MNIST数据集 使用GPU加速运算 要求准确率能达到92%以上 保存模型 实...

    月见樽
  • 为什么网站首页有排名,内容页无排名?

    首页有排名,内容页无排名,这是一个经常会遇到的问题,特定是刚入行的SEO人员,但这看似简单的问题,确涉及多方面。

    蝙蝠侠IT
  • DMP 101之二:关于DMP的数据源

    DMP的数据源是大家关心的问题,经常有朋友问,宋老师,这个数据是否能拿到呀,那个数据源为什么不开放呀之类的。这个系列的第二节,讲这个话题。

    iCDO互联网数据官
  • 蓝鲸智云走出腾讯:我们是武装运维,不是取代运维

    前两篇文章,我们谈了腾讯蓝鲸的转型背景、设计思路、在腾讯内部应用推动三大运维阶段。而蓝鲸团队也秉持着开放共赢的态度,逐渐将蓝鲸智云体系开放出来到传统企业,构建生...

    嘉为科技
  • 打开大数据研究的潘多拉魔盒

    大数据文摘
  • BZOJ3573: [Hnoi2014]米特运输(树上乱搞)

    Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量。在以米特为主要能源的D星上,这种米特能源的运输和储 存一直是一个大问题。D星上有N个...

    attack

扫码关注云+社区

领取腾讯云代金券