美文网首页大数据玩转大数据大数据 爬虫Python AI Sql
金融数据分析案例第六篇《爬取通过ajax异步加载数据的网站》

金融数据分析案例第六篇《爬取通过ajax异步加载数据的网站》

作者: 数据蛙datafrog | 来源:发表于2019-10-27 18:27 被阅读0次

    此系列文章是《数据蛙三个月就业班》股票数据分析案例的总结,整个案例包括linux、shell、python、hive、pycharm、git、html、css、flask、pyechart、sqoop等的使用,为了让就业班同学能够更好的学习,所以对上面大家有疑问的内容进行了总结。本篇是股票数据分析案例第六篇总结---爬取通过ajax加载数据的网站

    阅读目录:

    • 了解ajax异步加载
    • 常规方法请求
    • 正确方法请求
    • 编写安全爬虫建议

    一:了解ajax异步加载

    1.AJAX通过在后台与服务器进行少量数据交换, 可以使网页实现异步更新。可以在不重新加载整个网页的情况下,对网页的某部分进行更新;
    2.举个形象的例子,同步就像A叫B去吃饭,A发出邀请,要B一起吃饭,此时必须等B做出回应,吃或者不吃,A才决定是一个人吃还是等B一起去;而异步的话就像是下班了,A跟B说A要去吃饭了,然后走了,不管B是否做任何回应。

    二:常规方法请求

    我们的需求主要是获取下面的这个表格中的内容


    目前很多网站都使用ajax技术动态加载数据,和常规的网站不一样,数据时动态加载的,如果我们使用常规的方法爬取网页,得到的只是一堆html代码,没有任何的数据,我们来看下这个网站是不是这样的情况呢?

    import pprint  # 使打印内容输出规范
    import requests
    
    url = 'https://www.jesselivermore.com/ipo.html' 
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
                             "Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"}
    
    response = requests.get(url,headers=headers)
    pprint.pprint(response.text)
    

    爬虫网站返回的文本内容如下图所示,确实是一堆网页代码,并没有相关的数据信息

    内容过多,只截取部分内容,建议同学们来执行上面的代码看下效果;常规方法是拿不到数据了,下面我们来看下正确的方法

    三:正确方法请求

    1.通过chrome的开发者工具来看数据加载过程。

    首先打开chrome浏览器,输入网址,然后鼠标右键弹出一个小框,紧接着点击检查,然后按照图片上的操作即可。


    其中图片中的3就是数据请求,这个是通过4的预览结果看到的

    2.每年的数据请求地址比较
    刚刚我们看到的那个页面默认是当前年,即是2019年的数据,那如果我们想看2018年的数据呢,只要我们比较下这两年的请求地址找到规律就好了

    image.png

    我们接着操作,选择2018年时,又出现了一个地址,如:第6步,这个就是2018年数据的请求地址。接下来我们来比较下20182019年的

    https://h5stockserver.huanshoulv.com/aimapp/hkstock/newStockSearch?page=1&page_count=1000&sort_type=-1&sort_field_name=issue_date&single_draw_money=%2C&hand_win_rate=%2C&over_subscribed_multiple=%2C&offering_price=&industry=&market_type=&over_subscribed_type=&issue_year=2019%2C2019&green_shoe=&ipo_sponsor=&ipo_underwriter=
    
    https://h5stockserver.huanshoulv.com/aimapp/hkstock/newStockSearch?page=1&page_count=1000&sort_type=-1&sort_field_name=issue_date&single_draw_money=%2C&hand_win_rate=%2C&over_subscribed_multiple=%2C&offering_price=&industry=&market_type=&over_subscribed_type=&issue_year=2018%2C2018&green_shoe=&ipo_sponsor=&ipo_underwriter=
    

    我们仔细观察后发现只有issue_year这个参数值从2019%2C2019变成了2018%2C2018,所以如果想获得2017年的,变下参数值就好。但是开心的是,发现把issue_year这个参数简化后得到的是所有年份的。最后我们简化请求地址是:

    https://h5stockserver.huanshoulv.com/aimapp/hkstock/newStockSearch?page=1&page_count=1000
    

    3.完整请求和解析代码

    # 代码在juypter 上运行调试起来更佳
    import requests
    import json
    
    url = 'https://h5stockserver.huanshoulv.com/aimapp/hkstock/newStockSearch?page=1&page_count=1000'
    response = requests.get(url) #请求并获取响应
    
    
    jsonstr = json.loads(response.text) #json解析响应文本 
    
    '''解析后的数据格式'''
    print('响应解析后的类型:',type(jsonstr)) #dict
    print('响应解析后的键值对个数:',len(jsonstr)) #字典键值对个数
    for key in jsonstr: #打印出所有的keys
        print(key ,end=' ')
        
        
    for key in jsonstr['data']:
        print(key,end=' ')
        
    df = pd.DataFrame(jsonstr['data']['list'], columns=jsonstr['data']['fields']) 
    
    df.columns
    
    df[['stock_code','stock_name','issue_price','update_at','industry','offering_price','px_open_rate',
       'hand_win_rate','market','min5_chgpct']].head()
    

    有一点大家要留意下,这里的英文字段要网站上的中文字段需要自己对应下

    四:编写安全爬虫建议

    • 1.爬虫访问频次要控制,别把对方服务器搞崩溃了

    比如:一分钟请求1万次,把别人的服务器都搞挂了,这样就损害到别人的利益了

    • 2.涉及到个人隐私的信息你不能爬

    像电话号,身份证号,家庭住址,工作单位,行踪轨迹这些隐私信息不要去爬

    相关文章

      网友评论

        本文标题:金融数据分析案例第六篇《爬取通过ajax异步加载数据的网站》

        本文链接:https://www.haomeiwen.com/subject/emfmvctx.html