最近股市有了一股牛市的味道,我也来蹭波热度,这节我们将爬取股票数据,股票数据在网上很容易找到,这里以某方财富网为例
目标:
爬取股票数据并存储进数据库中(这里以MongoDB为例)
目标网站(base64编码):
aHR0cDovL3F1b3RlLmVhc3Rtb25leS5jb20vY2VudGVyL2dyaWRsaXN0Lmh0bWwjaHNfYV9ib2FyZA==
目录:
1、环境
2、分析网站
3、实现功能
1、环境
Python3.7.3、requests、pymongo
2、分析网站
这里有202页、每页有20条数据
点击下一页发现url没有变化,说明数据是异步加载
打开开发者工具查看Network的请求情况
先清空请求,再点击第二、三时就会出现这些请求
点进第一个请求查看
可以很容易的知道这个就是我们要找的数据,现在我们查看一下这个数据的请求接口
第二页的url:
第三页:
可以发现url中的pn参数代表的就是页数的变化,最后面的13位数字估计就是时间戳(测试过一段时间,发现这个参数其实可以不用改)
进入这个url看看数据是怎么样的
股票有几个比较重要的数据,股票名称、股票代码、开盘价、最高价、最低价、收盘价、成交额,这不是json数据只能用正则筛选数据了
3、功能实现
步骤:
请求——提取数据——存储数据
请求函数:
def get_page(url):
"""获取网页源码"""
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
except requests.ConnectionError as e:
print('Error', e.args)
提取数据:
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')
}
这里的参数text为网页源码
存储函数:
def save_data(number=None, name=None, start_price=None, max_price=None, min_price=None, end_price=None, volume=None):
"""存进MongoDB"""
client = pymongo.MongoClient("localhost", 27017)
db = client.stock
collection = db.stock_data7
shijian = time.strftime('%Y-%m-%d', time.localtime()) # '2020-05-25'
data = {"time": shijian, "number": number, "name": name, "start_price": start_price, "max_price": max_price,
"min_price": min_price, "end_price": end_price, "volume": volume}
collection.insert_one(data)
主函数
不断修改url、请求、最后存入MongoDB中,参数start、end分别是起始页码和结尾页码入数据库中
def main(start=1, end=1):
for i in range(start, end+1):
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
content = get_page(url=url)
data = get_stock_data(text=content)
for j in data:
number = j.get('number')
name = j.get('name')
start = j.get('start')
max_price = j.get('max')
min_price = j.get('min')
end = j.get('end')
volume = j.get('volume')
if start == '"-"':
start, max_price, min_price, end, volume = '0', '0', '0', '0', '0'
save_data(number=number, name=name, start_price=eval(start), max_price=eval(max_price),
min_price=eval(min_price), end_price=eval(end), volume=round(eval(volume) / 10 ** 8, 2))
运行结果:
虽然最近牛市的言论甚嚣尘上,但是有一点要知道股票赚到钱的总是少数人,只有不断地提升自身实力才能够不被割韭菜,股票有风险,投资需谨慎。
如果对你有帮助的话给我点个赞吧
源码: