大数据玩转大数据大数据 爬虫Python AI Sql

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

2019-10-27  本文已影响0人  数据蛙datafrog

此系列文章是《数据蛙三个月就业班》股票数据分析案例的总结,整个案例包括linux、shell、python、hive、pycharm、git、html、css、flask、pyechart、sqoop等的使用,为了让就业班同学能够更好的学习,所以对上面大家有疑问的内容进行了总结。本篇是股票数据分析案例第六篇总结---爬取通过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万次,把别人的服务器都搞挂了,这样就损害到别人的利益了

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

上一篇下一篇

猜你喜欢

热点阅读