最新消息:20210917 已从crifan.com换到crifan.org

【教程】以抓取新浪财经的创业板的信息为例,解释如何分析并模拟动态网页抓取

Crawl_EmulateLogin crifan 4399浏览 0评论

【背景】

之前写过很多网页抓取方面的教程了。全都整理到这里了:

详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)

现遇到别人问的问题:

python 抓取动态网页的问题

即,如何分析和抓取:

http://vip.stock.finance.sina.com.cn/mkt/#cyb_root

中的新浪财经中的创业板的数据。

此处,就是解释,如何去分析此动态网页的内部逻辑,并用代码模拟此过程,获得对应的数据。

 

特别说明:

如果下面中所涉及的知识点,工具,逻辑,概念,有不清楚的,请自行先去看:

详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)

里面,基本都有简单或详细的解释。

 

【分析过程】

1.通过之前介绍的IE9的F12,去打开网络抓取功能,输入对应的地址,

可以看到如下界面:

the main ui for ie9 f12

可以看出,我们需要抓取的信息,就是那些列表中的数据。

第一个就是:

sz300001,特锐德

下面就来分析,是如何从地址:

http://vip.stock.finance.sina.com.cn/mkt/#cyb_root

而得到这些所要的数据的。

2.先去,点击到,检测出的http访问的最开始的部分,即第一行,表示从最开始去搜

然后在搜索框中输入:

sz300001

然后点击搜索:

click home search it

找到第一个结果,是个注释掉的javascript代码中的内容,所以不是我们所要的,所以点击搜索框右边的按钮,继续搜索下一个:

found first one then next

然后,很幸运的,就找到了我们要的数据了:

found the expected real data with name

其中,同时也包括了对应的其他所要的各种信息,比如名字是特锐德等等。

注:

如果还是没有找到,则一点点去点击下一个,直到找到你要的数据为止。

至此,找到我们所要的数据,所对应的url地址是:

http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeData?page=1&num=40&sort=symbol&asc=1&node=cyb&_s_r_a=init

对应的各种请求和相应信息是:

request header for quotes service

request body for quotes service

response header for quotes service

response body for quotes service

cookies for quotes service

 

3.接下来,就是如何模拟以上的逻辑,以获得我们所需要的数据了。

总体逻辑是:

以最少的模拟的过程,去获得对应的数据。

所以就是反推的方法,先去试试:

http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeData?page=1&num=40&sort=symbol&asc=1&node=cyb&_s_r_a=init

(加上对应的必要的header等)

看看是否可以得到对应的数据

如果不行,那么就再去添加额外的cookie等内容。

而此处cookie等内容,很明显,又是依赖于前面的,访问某些地址,所得到的。

所以就反推到,先要访问之前的,某个url地址,以获得此cookie和其他相关数据,

然后才可以再访问:

http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeData?page=1&num=40&sort=symbol&asc=1&node=cyb&_s_r_a=init

以此获得所希望的数据的。

如果还是不行,那么再一点点返回,此处所需要的,cookie,其他的参数,都是从哪里获得

然后依次模拟对应的过程

访问对应的url地址,

去获得对应的cookie,参数等等

都凑齐了,然后再最终访问此url,

然后才能获得所需要的数据。

4.所以,下面就是一点点,根据上述的分许出来的内容,去写代码,然后一点点调试了。

如果不能获得所需内容,再一点点增加对应的代码,直到获得所需要的数据为止。

而上述中,已经可以得到的,基本的信息就是:

 

urlhttp://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeData?page=1&num=40&sort=symbol&asc=1&node=cyb&_s_r_a=init
GET/POSTGET
发送的头信息(request header)

Referer    http://vip.stock.finance.sina.com.cn/mkt/#cyb_root
Content-Type    application/x-www-form-urlencoded

其他的,都是常见header的值,此处无需再赘述,但要注意到写代码的时候,还是要加上的

希望返回的数据(request body)包含我们所要的sz300001的json字符串

注:

(1)分析出上述的内容,是需要一定的经验和背景知识的;

(2) 然后,根据经验,去除一些看起来就很可能不需要的数据,找到很可能需要的数据。

而说到经验,目前无法完整解释清楚。

只能靠你多练习,见多了,自然就看懂了。

目前的话,不了解的,还是好好先去看看:

详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)

里面有,几乎所有的,相关的背景知识的介绍。

(3)包括看到

[{symbol:"sz300001", … }]

知道是json字符串 ->需要你了解什么是json,以方便后续的处理->不了解的去看:

JSON详解

 

然后,就可以去写代码模拟此过程了。

5.说到写代码,其实任何语言都可以。

常见的,至少包括Python,C#,java,PHP等等。

此处,以,方便好用的Python为例。

而写Python代码,涉及到网络内容抓取方面,为了减少重复劳动,可以直接利用到我之前自己总结的库函数:

crifan的Python库:crifanLib.py

主要是其中的getUrlResponse和getUrlRespHtml

然后,就可以写出这样的代码,去验证上述方式,是否可以获得对应的所需要的内容:

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Function:
【教程】以抓取新浪财经的创业板的信息为例,解释如何分析并模拟动态网页抓取
【教程】以抓取新浪财经的创业板的信息为例,解释如何分析并模拟动态网页抓取
Version: 2013-04-30 Author: Crifan Contact: admin (at) crifan.org """ import re; import sys; sys.path.append("libs"); import crifanLib; import logging; def main(): """ take sina finance as example, to demo how to analysis and write code to emulate the internal process of hwo to get the dynamic data """ #http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeData?page=1&num=40&sort=symbol&asc=1&node=cyb&_s_r_a=init getNodeDataBaseUrl = "http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeData"; paraDict = { 'page' : "1", 'num' : "40", 'sort' : "symbol", 'asc' : "1", 'node' : "cyb", '_s_r_a': "init", }; getNodeDataUrl = crifanLib.genFullUrl(getNodeDataBaseUrl, paraDict); logging.info("getNodeDataUrl=%s", getNodeDataUrl); headerDict = { 'Referer' : "http://autoexplosion.com/cars/buy/advanced.php", 'Content-Type' : "application/x-www-form-urlencoded", }; getNodeDataRespHtml = crifanLib.getUrlRespHtml(getNodeDataUrl, headerDict=headerDict); logging.debug("getNodeDataRespHtml=%s", getNodeDataRespHtml); #here, luckly, has got the expected response json string #getNodeDataRespHtml=[{symbol:"sz300001",code:"300001",name:"特锐德",t ...... }] ############################################################################### if __name__=="__main__": scriptSelfName = crifanLib.extractFilename(sys.argv[0]); logging.basicConfig( level = logging.DEBUG, format = 'LINE %(lineno)-4d %(levelname)-8s %(message)s', datefmt = '%m-%d %H:%M', filename = scriptSelfName + ".log", filemode = 'w'); # define a Handler which writes INFO messages or higher to the sys.stderr console = logging.StreamHandler(); console.setLevel(logging.INFO); # set a format which is simpler for console use formatter = logging.Formatter('LINE %(lineno)-4d : %(levelname)-8s %(message)s'); # tell the handler to use this format console.setFormatter(formatter); logging.getLogger('').addHandler(console); try: main(); except: logging.exception("Unknown Error !"); raise;

结果,是很幸运的,直接就可以获得对应的,想要的那个json数据了,包含了所需要的sz300001相关的内容。

注:

(1)此处的代码,是用到了我自己的的crifanLib(以及其所依赖的BeautifulSoup和chardet,不过此两个库,此处用不到)

此处提供完整的代码下载:

sina_finance_dynamic_web_scraper_2013-04-30.7z

 

(2)如果,此时的代码,无法获得对应的返回的json,

则根据经验,则往往还要再去返回,往前找,对应的所需要的cookie,都是从哪里来的。

然后先去分析对应的,获得对应的cookie的逻辑,

写代码实现该逻辑,由此先获得对应的cookie后,

最后才是此步骤,去获得最终所需要的数据。

 

(3)接下来,就是如何分析json数据,去获得自己所需要的值了。

关于json,不了解的可以参考:

JSON详解

 

【总结】

总之,总的逻辑就是:

1.用工具分析网页的执行逻辑

  • 工具:一般常用IE9的F12,其他的还有Firefox的Firebug,Chrome的Ctrl+Shift+I
  • 网页:不论是,静态网页,动态网页,模拟登陆,等等,都是要先分析,搞懂逻辑,才能再去写代码
  • 执行逻辑:就是工具所分析出来的,去访问你要的url期间的,所涉及到的Network的过程,访问了哪些网页,传递了哪些cookie,header,返回了哪些数据等等。

2.用代码模拟出此逻辑

  • 代码:
    • 只要你搞懂了逻辑,用什么语言,都是次要的。
    • 相对来说,Python比较好用。其他的语言,我所知道的,至少有C#,Java(Android),PHP等等。
  • 模拟出此逻辑:
    • 就是你自己写对应语言的代码,去一点点模拟此各种http的请求,获得对应的相应信息
    • 一点点调试,一点点反推,最终用代码模拟出整个过程,得到你要的数据。

 

更详细的教程,可以参考:

详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)

转载请注明:在路上 » 【教程】以抓取新浪财经的创业板的信息为例,解释如何分析并模拟动态网页抓取

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 恩,很好,有了这个,可以定时抓数据下来了 不过有个问题,请问博主,如何抓取以前的数据?
    zhangyiw10年前 (2014-04-01)回复
103 queries in 0.198 seconds, using 23.55MB memory