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

【背景】

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

详解抓取网站,模拟登陆,抓取动态网页的原理和实现(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.所以,下面就是一点点,根据上述的分许出来的内容,去写代码,然后一点点调试了。

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

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

 

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
GET/POST GET
发送的头信息(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:
【教程】以抓取新浪财经的创业板的信息为例,解释如何分析并模拟动态网页抓取
http://www.crifan.com/take_scrape_sina_finance_creator_info_as_example_to_teach_how_to_analysis_the_data

Version:    2013-04-30
Author:     Crifan
Contact:    admin (at) crifan.com
"""

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#等)



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

  1. 恩,很好,有了这个,可以定时抓数据下来了
    不过有个问题,请问博主,如何抓取以前的数据?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量