Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。
通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
就是很多网站都有下拉加载,这时会加载更多数据,但是不会跳转界面,这就是Ajax加载过程。这时直接用requests请求是无法获取有效数据的。
目录:
1、准备环境
2、Ajax长什么样
3、分析请求
4、获取数据
目标网站:
1、准备环境
首先要确保安装好请求库requests,若没有安装可以参考前面的文章——爬虫开发环境部署
2、Ajax长什么样
这个网站点击下一页是不会跳转网页的,所有的数据都会在原有的界面展示。这就是使用了Ajax的网站,像下拉加载这些都采用了Ajax。
3、分析请求
打开开发者工具,这里以Chrome浏览器为例
在Elements选项卡中可以查看网页的源代码,这里没有我们要寻找的目标,切换至Network选项卡
请求太多了先清空请求,点击下一页
可以看到多了两个请求,点击第一个请求查看详细信息
这里切换到Response选项卡查看返回的数据
数据被压缩成一行了,点击格式化方便查看
可以发现网页展示的数据就是从这个请求获得的,返回Headers选项卡查看url
把url挑出来
http://10.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112404011455193932689_1586401605072&pn=2&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:13,m:0+t:80,m:1+t:2,m:1+t:23&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1586401605111
这是第二页的url
跳出第三页的url看看
http://10.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112404011455193932689_1586401605072&pn=3&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:13,m:0+t:80,m:1+t:2,m:1+t:23&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1586401605265
可以看到只有参数pn变了
代码如下:
for i in range(197):
url = 'http://60.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112408744624686429123_1578798932591&pn=' \
'%d&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:13,m:' \
'0+t:80,m:1+t:2,m:1+t:23&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,' \
'f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1586266306109' % i
打开url看看内容
用正则表达式把我们想要是数据挑出来就好了
这里传入网页源代码,获取收盘价、成交量、股票代码、名称、最高股价、最低股价、开盘价
def get_stock_data(text):
"""获取股票代码、名称、PE"""
com = re.compile('"f2":(?P.+?),.*?"f6":(?P.+?),.*?"f12":"(?P.+?)",.*?"f14":"(?P.+?)"'
',.*?"f15":(?P.+?),.*?"f16":(?P.+?),.*?"f17":(?P.+?),', re.S)
ret = com.finditer(text)
for i in ret:
yield {
'number': i.group('number'),
'name': i.group('name'),
'start': i.group('start'),
'max': i.group('max'),
'min': i.group('min'),
'end': i.group('end'),
'volume': i.group('volume')
}
觉得写的不错顺便点个赞呗