【日常点滴013】python雪球网沪深港美股情爬取

仅供参考

过程分析

数据请求来源分析

浏览器操作 演示过程

通过使用浏览器浏览发现,雪球网的股票数据都是通过js异步加载的,而且返回的是 json 数据,这样的话我们只需要拿到 json 数据后解析即可

所以我们需要去浏览器控制台中找到对应的异步链接 然后再进行爬取

点击行情链接进来后的页面有数据

在这里插入图片描述

禁止js以后发现页面无数据

在这里插入图片描述

链接分析

# 沪深股市一览链接
# https://xueqiu.com/service/v5/stock/screener/quote/list?page=1&size=30&order=desc&orderby=percent&order_by=percent&market=CN&type=sh_sz&_=1630489379896

# 港股一览链接
# https://xueqiu.com/service/v5/stock/screener/quote/list?page=1&size=30&order=desc&orderby=percent&order_by=percent&market=HK&type=hk&is_delay=true&_=1630489692552

# 美股一览链接
# https://xueqiu.com/service/v5/stock/screener/quote/list?page=1&size=30&order=desc&orderby=percent&order_by=percent&market=HK&type=hk&is_delay=true&_=1630489692552

对比链接发现 不同的大的板块只是后面的个别参数不同而已 所以代码将来应该会有很大的复用性

至于时间戳,他代表的是从1970-01-01-00:00:00 到某一刻的时间 一般以 秒 计 或 毫秒 计

(经测试,有无时间戳参数,或者时间戳的值正确与否,对返回结果无影响,可以在网页上按股票代码降序排序进行对比验证。如果想每次访问都带上当前的时间戳,可以使用python的time库简单两行代码来自己生成,下面有代码.)

在这里插入图片描述

当前时间戳生成方式 :
如果想自己生成时间戳的话, 可以用以下方式
import time
print(time.time())
time_now = int(time.time()*1000)
print(time_now)

代码测试

测试爬虫能否获取到数据

因为是测试 所以我们这里page = 1 size = 10 获取沪深第一页的10个数据
可以按股票代码排序

# 准备请求的固定格式代码
import requests
from bs4 import BeautifulSoup

# 请求头,用户表名自己的身份
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
}
# 定义首次要访问的链接(这里访问的是一个js异步请求的链接,从浏览器复制的)
url = "https://xueqiu.com/service/v5/stock/screener/quote/list"
# 设置参数 page:页数 size:每页几条数据(可以自己定) order:排序方式 orderby:根据什么排序 可以有两个 market:交易所地点 type:板块  _:毫秒时间戳
params = {
    "page":1,"size":10,"order":"desc","orderby":"percent","order_by":"symbol","market":"CN","type":"sh_sz","_":1630408116747
}
# 定义一个空的列表存储股票信息 这里只是在爬取沪深的股票,所以命名为了stock_hs 以后沪深 港 美 都爬的时候还可以改的更合适些
stock_hs = []
# 请求第一页数据
response = requests.get(url,params = params,headers=headers)
# 将返回的json数据通过 json()方法进行解析,变为python中的字典类型数据 后续操作使用字典的方法即可
response_json = response.json()
# 通过字典嵌套取值的方法 取到含有股票信息的值
print(response_json['data']['list'])
# 看到打印的信息无误,那么将数据存起来 ,供后续使用
stock_info = response_json['data']['list']
[{'symbol': 'SZ301053', 'net_profit_cagr': 22.60777021617628, 'north_net_inflow': None, 'ps': 5.8048, 'type': 11, 'percent': 210.7, 'has_follow': False, 'tick_size': 0.01, 'pb_ttm': 6.1911, 'float_shares': 17442347, 'current': 36.88, 'amplitude': 61.58, 'pcf': 24.6371, 'current_year_percent': 210.7, 'float_market_capital': 643273757, 'north_net_inflow_time': None, 'market_capital': 3015032200, 'dividend_yield': None, 'lot_size': 100, 'roe_ttm': 30.667989696345515, 'total_percent': -7.64, 'percent5m': 0.08, 'income_cagr': 25.496194690115015, 'amount': 503004673.12, 'chg': 25.01, 'issue_date_ts': 1630425600000, 'eps': 0.99, 'main_net_inflows': 0, 'volume': 13156403, 'volume_ratio': None, 'pb': 6.188, 'followers': 733, 'turnover_rate': 75.43, 'first_percent': 210.7, 'name': 'N远信', 'pe_ttm': 37.351, 'total_shares': 81752500, 'limitup_days': 0}, {'symbol': 'SZ301052', 'net_profit_cagr': 14.35748112878137, 'north_net_inflow': None, 'ps': 6.2264, 'type': 11, 'percent': 1.19, 'has_follow': False, 'tick_size': 0.01, 'pb_ttm': 4.9509, 'float_shares': 17082013, 'current': 35.71, 'amplitude': 9.07, 'pcf': 35.8295, 'current_year_percent': 340.32, 'float_market_capital': 609998684, 'north_net_inflow_time': None, 'market_capital': 2572546150, 'dividend_yield': None, 'lot_size': 100, 'roe_ttm': 12.566739258534145, 'total_percent': -20.64, 'percent5m': 0.31, 'income_cagr': 17.58593719816366, 'amount': 274508390.08, 'chg': 0.42, 'issue_date_ts': 1630252800000, 'eps': 0.7, 'main_net_inflows': 572026, 'volume': 7778822, 'volume_ratio': 0.69, 'pb': 4.953, 'followers': 1352, 'turnover_rate': 45.54, 'first_percent': 387.67, 'name': 'C果麦', 'pe_ttm': 51.176, 'total_shares': 72039937, 'limitup_days': 0}, {'symbol': 'SZ301051', 'net_profit_cagr': 18.23472385088447, 'north_net_inflow': None, 'ps': 5.075, 'type': 11, 'percent': 0.83, 'has_follow': False, 'tick_size': 0.01, 'pb_ttm': 3.131, 'float_shares': 20000000, 'current': 109, 'amplitude': 4.51, 'pcf': 53.5941, 'current_year_percent': 10.32, 'float_market_capital': 2180000000, 'north_net_inflow_time': None, 'market_capital': 8720000000, 'dividend_yield': None, 'lot_size': 100, 'roe_ttm': 29.740518567138963, 'total_percent': -22.14, 'percent5m': 0.15, 'income_cagr': 25.983374921196003, 'amount': 285813870.17, 'chg': 0.9, 'issue_date_ts': 1629993600000, 'eps': 2.87, 'main_net_inflows': -17113853, 'volume': 2591794, 'volume_ratio': 0.43, 'pb': 3.131, 'followers': 1917, 'turnover_rate': 12.96, 'first_percent': 38.69, 'name': 'C信濠', 'pe_ttm': 37.917, 'total_shares': 80000000, 'limitup_days': 0}, {'symbol': 'SZ301050', 'net_profit_cagr': None, 'north_net_inflow': None, 'ps': 49.2413, 'type': 11, 'percent': 0.87, 'has_follow': False, 'tick_size': 0.01, 'pb_ttm': 13.6382, 'float_shares': 18413548, 'current': 279, 'amplitude': 9.71, 'pcf': None, 'current_year_percent': 360.09, 'float_market_capital': 5137379892, 'north_net_inflow_time': None, 'market_capital': 27007200000, 'dividend_yield': None, 'lot_size': 100, 'roe_ttm': None, 'total_percent': 3.33, 'percent5m': 0.47, 'income_cagr': 151.24497442466938, 'amount': 833938498.33, 'chg': 2.4, 'issue_date_ts': 1629734400000, 'eps': 1.63, 'main_net_inflows': -24706900, 'volume': 3005575, 'volume_ratio': 0.58, 'pb': 13.636, 'followers': 3426, 'turnover_rate': 16.32, 'first_percent': 365.19, 'name': '雷电微力', 'pe_ttm': 171.523, 'total_shares': 96800000, 'limitup_days': 0}, {'symbol': 'SZ301049', 'net_profit_cagr': 7.437078452145562, 'north_net_inflow': None, 'ps': 10.5533, 'type': 11, 'percent': -5.83, 'has_follow': False, 'tick_size': 0.01, 'pb_ttm': 3.7854, 'float_shares': 22344182, 'current': 34.88, 'amplitude': 4.67, 'pcf': 21.7336, 'current_year_percent': 80.35, 'float_market_capital': 779365068, 'north_net_inflow_time': None, 'market_capital': 3287556290, 'dividend_yield': None, 'lot_size': 100, 'roe_ttm': 33.656008771677676, 'total_percent': -25.79, 'percent5m': 0, 'income_cagr': 10.26080674549059, 'amount': 203010265.14, 'chg': -2.16, 'issue_date_ts': 1629734400000, 'eps': 1.47, 'main_net_inflows': -16822261, 'volume': 5779789, 'volume_ratio': 0.86, 'pb': 3.787, 'followers': 1212, 'turnover_rate': 25.87, 'first_percent': 118.72, 'name': '超越科技', 'pe_ttm': 23.717, 'total_shares': 94253334, 'limitup_days': 0}, {'symbol': 'SZ301048', 'net_profit_cagr': 32.84470540132411, 'north_net_inflow': None, 'ps': 3.3693, 'type': 11, 'percent': 19.99, 'has_follow': False, 'tick_size': 0.01, 'pb_ttm': 4.6988, 'float_shares': 87727627, 'current': 17.35, 'amplitude': 22.61, 'pcf': 97.0094, 'current_year_percent': 320.1, 'float_market_capital': 1522074328, 'north_net_inflow_time': None, 'market_capital': 9253334490, 'dividend_yield': 0, 'lot_size': 100, 'roe_ttm': 15.617385857838187, 'total_percent': 19.66, 'percent5m': 0, 'income_cagr': 10.209883884759495, 'amount': 908461395.45, 'chg': 2.89, 'issue_date_ts': 1629216000000, 'eps': 0.4, 'main_net_inflows': 45336973, 'volume': 56343507, 'volume_ratio': 2.09, 'pb': 4.702, 'followers': 2272, 'turnover_rate': 64.23, 'first_percent': 335.84, 'name': '金鹰重工', 'pe_ttm': 43.44, 'total_shares': 533333400, 'limitup_days': 1}, {'symbol': 'SZ301047', 'net_profit_cagr': 244.8922744710154, 'north_net_inflow': None, 'ps': 18.4159, 'type': 11, 'percent': -4.06, 'has_follow': False, 'tick_size': 0.01, 'pb_ttm': 4.942, 'float_shares': 17000000, 'current': 470.1, 'amplitude': 4.79, 'pcf': 23.8829, 'current_year_percent': 60.49, 'float_market_capital': 7991700000, 'north_net_inflow_time': None, 'market_capital': 31966800000, 'dividend_yield': 0, 'lot_size': 100, 'roe_ttm': 110.70388752251307, 'total_percent': -21.64, 'percent5m': 0.02, 'income_cagr': 144.94420155745345, 'amount': 709777190.73, 'chg': -19.9, 'issue_date_ts': 1629043200000, 'eps': 18.17, 'main_net_inflows': -10060140, 'volume': 1499364, 'volume_ratio': 0.78, 'pb': 4.942, 'followers': 21565, 'turnover_rate': 8.82, 'first_percent': 68.41, 'name': '义翘神州', 'pe_ttm': 25.872, 'total_shares': 68000000, 'limitup_days': 0}, {'symbol': 'SZ301046', 'net_profit_cagr': 69.95342943963139, 'north_net_inflow': None, 'ps': 18.5614, 'type': 11, 'percent': -6.07, 'has_follow': False, 'tick_size': 0.01, 'pb_ttm': 13.2586, 'float_shares': 35437980, 'current': 66.5, 'amplitude': 9.7, 'pcf': 2111.6781, 'current_year_percent': 697.36, 'float_market_capital': 2356625670, 'north_net_inflow_time': None, 'market_capital': 9940420000, 'dividend_yield': 0, 'lot_size': 100, 'roe_ttm': 25.018544632124716, 'total_percent': 38.54, 'percent5m': 0.09, 'income_cagr': 23.71445944286954, 'amount': 499856378.69, 'chg': -4.3, 'issue_date_ts': 1629129600000, 'eps': 0.76, 'main_net_inflows': -3969642, 'volume': 7316443, 'volume_ratio': 0.91, 'pb': 13.247, 'followers': 3625, 'turnover_rate': 20.65, 'first_percent': 524.1, 'name': '能辉科技', 'pe_ttm': 87.973, 'total_shares': 149480000, 'limitup_days': 0}, {'symbol': 'SZ301045', 'net_profit_cagr': 40.238914158851344, 'north_net_inflow': None, 'ps': 4.0335, 'type': 11, 'percent': 1.57, 'has_follow': False, 'tick_size': 0.01, 'pb_ttm': 4.2471, 'float_shares': 24460606, 'current': 32.37, 'amplitude': 4.27, 'pcf': 109.7504, 'current_year_percent': 104.74, 'float_market_capital': 791789816, 'north_net_inflow_time': None, 'market_capital': 3339106115, 'dividend_yield': 0, 'lot_size': 100, 'roe_ttm': None, 'total_percent': -33.87, 'percent5m': 0.06, 'income_cagr': 16.968036279188546, 'amount': 69307305.57, 'chg': 0.5, 'issue_date_ts': 1628784000000, 'eps': 1.12, 'main_net_inflows': -116548, 'volume': 2177297, 'volume_ratio': 0.67, 'pb': 4.248, 'followers': 1045, 'turnover_rate': 8.9, 'first_percent': 149.34, 'name': '天禄科技', 'pe_ttm': 28.795, 'total_shares': 103154344, 'limitup_days': 0}, {'symbol': 'SZ301043', 'net_profit_cagr': 17.883270006279496, 'north_net_inflow': None, 'ps': 4.7004, 'type': 11, 'percent': 0.64, 'has_follow': False, 'tick_size': 0.01, 'pb_ttm': 3.165, 'float_shares': 17000000, 'current': 33.26, 'amplitude': 1.82, 'pcf': 17.5063, 'current_year_percent': 24.34, 'float_market_capital': 565420000, 'north_net_inflow_time': None, 'market_capital': 2261680000, 'dividend_yield': 0, 'lot_size': 100, 'roe_ttm': 28.304190234186734, 'total_percent': -30.66, 'percent5m': 0.03, 'income_cagr': 14.750484367014515, 'amount': 49737416.01, 'chg': 0.21, 'issue_date_ts': 1628611200000, 'eps': 1.11, 'main_net_inflows': -3858491, 'volume': 1504234, 'volume_ratio': 0.78, 'pb': 3.165, 'followers': 1039, 'turnover_rate': 8.85, 'first_percent': 51.7, 'name': '绿岛风', 'pe_ttm': 30.076, 'total_shares': 68000000, 'limitup_days': 0}]

ok发现可以正常获取到数据,接下来,尝试提取json数据 需要结合浏览器中的字段值 对比json数据 找出我们需要的对应数值 然后再在代码中提取对应数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oEpOcHfg-1630493435466)(attachment:image.png)]

提取需要的股票数据

# 提取json 数据 
for stock in stock_info:
    stock_detail = {
        '股票名称':stock['name'],
        '股票代码':stock['symbol'],
        '当前价':stock['current'],
        '涨跌额':stock['chg'],
        '涨跌幅%':stock['percent'],
        '年初至今':stock['current_year_percent'],
        '成交量':stock['volume'],
        '成交额(元)':stock['amount'],
        '换手率':stock['turnover_rate'],
        '市盈率':stock['pe_ttm'],
        '股息率%':stock['dividend_yield'],
        '市值(元)':stock['market_capital']
    }
    stock_hs.append(stock_detail)
print(stock_hs)

[{'股票名称': 'N远信', '股票代码': 'SZ301053', '当前价': 36.88, '涨跌额': 25.01, '涨跌幅%': 210.7, '年初至今': 210.7, '成交量': 13156403, '成交额(元)': 503004673.12, '换手率': 75.43, '市盈率': 37.351, '股息率%': None, '市值(元)': 3015032200}, {'股票名称': 'C果麦', '股票代码': 'SZ301052', '当前价': 35.71, '涨跌额': 0.42, '涨跌幅%': 1.19, '年初至今': 340.32, '成交量': 7778822, '成交额(元)': 274508390.08, '换手率': 45.54, '市盈率': 51.176, '股息率%': None, '市值(元)': 2572546150}, {'股票名称': 'C信濠', '股票代码': 'SZ301051', '当前价': 109, '涨跌额': 0.9, '涨跌幅%': 0.83, '年初至今': 10.32, '成交量': 2591794, '成交额(元)': 285813870.17, '换手率': 12.96, '市盈率': 37.917, '股息率%': None, '市值(元)': 8720000000}, {'股票名称': '雷电微力', '股票代码': 'SZ301050', '当前价': 279, '涨跌额': 2.4, '涨跌幅%': 0.87, '年初至今': 360.09, '成交量': 3005575, '成交额(元)': 833938498.33, '换手率': 16.32, '市盈率': 171.523, '股息率%': None, '市值(元)': 27007200000}, {'股票名称': '超越科技', '股票代码': 'SZ301049', '当前价': 34.88, '涨跌额': -2.16, '涨跌幅%': -5.83, '年初至今': 80.35, '成交量': 5779789, '成交额(元)': 203010265.14, '换手率': 25.87, '市盈率': 23.717, '股息率%': None, '市值(元)': 3287556290}, {'股票名称': '金鹰重工', '股票代码': 'SZ301048', '当前价': 17.35, '涨跌额': 2.89, '涨跌幅%': 19.99, '年初至今': 320.1, '成交量': 56343507, '成交额(元)': 908461395.45, '换手率': 64.23, '市盈率': 43.44, '股息率%': 0, '市值(元)': 9253334490}, {'股票名称': '义翘神州', '股票代码': 'SZ301047', '当前价': 470.1, '涨跌额': -19.9, '涨跌幅%': -4.06, '年初至今': 60.49, '成交量': 1499364, '成交额(元)': 709777190.73, '换手率': 8.82, '市盈率': 25.872, '股息率%': 0, '市值(元)': 31966800000}, {'股票名称': '能辉科技', '股票代码': 'SZ301046', '当前价': 66.5, '涨跌额': -4.3, '涨跌幅%': -6.07, '年初至今': 697.36, '成交量': 7316443, '成交额(元)': 499856378.69, '换手率': 20.65, '市盈率': 87.973, '股息率%': 0, '市值(元)': 9940420000}, {'股票名称': '天禄科技', '股票代码': 'SZ301045', '当前价': 32.37, '涨跌额': 0.5, '涨跌幅%': 1.57, '年初至今': 104.74, '成交量': 2177297, '成交额(元)': 69307305.57, '换手率': 8.9, '市盈率': 28.795, '股息率%': 0, '市值(元)': 3339106115}, {'股票名称': '绿岛风', '股票代码': 'SZ301043', '当前价': 33.26, '涨跌额': 0.21, '涨跌幅%': 0.64, '年初至今': 24.34, '成交量': 1504234, '成交额(元)': 49737416.01, '换手率': 8.85, '市盈率': 30.076, '股息率%': 0, '市值(元)': 2261680000}]

写入数据

上面已经成功的通过列表中存储字典的形式,存储了所有爬到的数据 接下来只要将这个包含数据的列表存到文件里即可 这里我们使用pandas来存储

为了避免程序多次运行产生多个一样数据的文件,我们给文件名中加入时间年月日时 让同一个小时只有一个最新写入的文件

import time
from pandas import DataFrame
# 写入数据
# 为了让每天写入数据时的文件不重名,也为了避免程序多次运行产生多个一样数据的文件,我们给文件名中加入时间年月日时
# time.localtime()可以获取到当前具体的时间 可以打印结果看下
t = time.localtime()
# print(t)
# 创建 DataFrame 实例 数据是我们的那个列表
df = DataFrame(data=stock_hs)
# 保存 dataframe
file_name = f'stock{t.tm_year}{t.tm_mon}{t.tm_mday}{t.tm_hour}时.csv'
df.to_csv(file_name,encoding='gbk')
print('ok')
ok

多页爬取

循环条件分析

我们能对一页的数据进行爬取和存储了,现在需要对所有的页数进行爬取,那有多少页呢?

假设我们不知到雪球网数据库中的页数有多少,我们需要循环爬取下去,那循环何时终止呢?

以上两个问题的提出,我们使用for循环 和while 循环都不能实现 因为没有 循环次数 和 终止循环的条件

但是

我们发现在响应的json数据里,有一个count里存储了数据的总个数,根据总个数,和我们每页爬取的数量,计算出可以爬取的页数

还有就是当请求的数据页数超过现有数据时,会返回空的list 根据这个特点我们页可以找到终止程序的条件

思考了一下代码 的改动量 我们用while循环,根据返回数据list是否为空作为判断条件,进行代码的改写

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xt3ClVwk-1630493435468)(attachment:image.png)]

代码优化

改写代码,成功将沪深当日所有股票数据获取到,并借用pandas保存到csv文件中

改写部分如图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M4TyxIfD-1630493435469)(attachment:image-2.png)]

完整改写的代码 把导入库什么的都放在了前面

# 准备请求的固定格式代码
import requests
from bs4 import BeautifulSoup
import time
from pandas import DataFrame

# 请求头,用户表名自己的身份
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
}
# 定义首次要访问的链接(这里访问的是一个js异步请求的链接)
url = "https://xueqiu.com/service/v5/stock/screener/quote/list"
# 设置参数 page:页数 size:每页几条数据(可以自己定) order:排序方式 orderby:根据什么排序 可以有两个 market:交易所地点 type:板块 _:时间戳
params = {
    "page":1,"size":1000,"order":"desc","orderby":"percent","order_by":"symbol","market":"CN","type":"sh_sz","_":1630408116747
}
# 定义一个空的列表存储股票信息
stock_hs = []

page = 0
while True:
    page += 1
    params['page'] = page
    response = requests.get(url, params=params, headers=headers)
    response_json = response.json()
    # print(response_json['data']['list'])
    stock_info = response_json['data']['list']
    if len(stock_info) == 0:
        print('循环完毕,共', len(stock_hs), '条数据')
        break
    for stock in stock_info:
        stock_detail = {
            '股票名称':stock['name'],
            '股票代码':stock['symbol'],
            '当前价':stock['current'],
            '涨跌额':stock['chg'],
            '涨跌幅%':stock['percent'],
            '年初至今':stock['current_year_percent'],
            '成交量':stock['volume'],
            '成交额(元)':stock['amount'],
            '换手率':stock['turnover_rate'],
            '市盈率':stock['pe_ttm'],
            '股息率%':stock['dividend_yield'],
            '市值(元)':stock['market_capital']
        }
        stock_hs.append(stock_detail)
    print(len(stock_hs))
# print(stock_hs)
print('最终',len(stock_hs))

# 写入数据
# 为了让每天写入数据时的文件不重名,也为了避免程序多次运行产生多个一样数据的文件,我们给文件名中加入时间年月日时
t = time.localtime()
df = DataFrame(data=stock_hs)
# 保存 dataframe
file_name = f'stock{t.tm_year}{t.tm_mon}{t.tm_mday}{t.tm_hour}时.csv'
df.to_csv(file_name,encoding='gbk')
print('ok')

多交易所爬取

逻辑分析

再次增加代码,把港股 美股行情也爬下来 代码结构是一样的,链接我们一开始也分析过。 我们只需要在爬完沪深股市后换一下参数爬港股美股即可

market:交易所地点 type:板块 这两个参数 我们用字典存储 构成键值对格式

更改点截图:因为这次爬取了多个交易所的股票,我们把存储股票的列表名字也改一下(当然 也可以不改)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mnBEvP5m-1630493435470)(attachment:image-2.png)]

沪深港美股市信息爬取

# 准备请求的固定格式代码
import requests
from bs4 import BeautifulSoup
import time
from pandas import DataFrame

# 请求头,用户表名自己的身份
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
}
# 定义首次要访问的链接(这里访问的是一个js异步请求的链接)
url = "https://xueqiu.com/service/v5/stock/screener/quote/list"
# 设置参数 page:页数 size:每页几条数据(可以自己定) order:排序方式 orderby:根据什么排序 可以有两个 market:交易所地点 type:板块 _:时间戳
params = {
    "page":1,"size":1000,"order":"desc","orderby":"percent","order_by":"symbol","market":"CN","type":"sh_sz","_":1630408116747
}
# 定义一个空的列表存储股票信息
stock_list = []
market_dict = {'CN': 'sh_sz', 'HK': 'hk', 'US': 'us'}
for market in market_dict:
    page = 0
    while True:
        page += 1
        params['page'] = page
        params['market'] = market
        params['type'] = market_dict[market]
        response = requests.get(url, params=params, headers=headers)
        response_json = response.json()
        stock_info = response_json['data']['list']
        if len(stock_info) == 0:
            print('循环完毕,共', len(stock_list), '条数据')
            break
        for stock in stock_info:
            stock_detail = {
                '交易市场':market,
                '股票名称':stock['name'],
                '股票代码':stock['symbol'],
                '当前价':stock['current'],
                '涨跌额':stock['chg'],
                '涨跌幅%':stock['percent'],
                '年初至今':stock['current_year_percent'],
                '成交量':stock['volume'],
                '成交额(元)':stock['amount'],
                '换手率':stock['turnover_rate'],
                '市盈率':stock['pe_ttm'],
                '股息率%':stock['dividend_yield'],
                '市值(元)':stock['market_capital']
            }
            stock_list.append(stock_detail)
        print(len(stock_list))
    # print(stock_hs)
    print('最终',len(stock_list))

# 写入数据
# 为了让每天写入数据时的文件不重名,也为了避免程序多次运行产生多个一样数据的文件,我们给文件名中加入时间年月日时
t = time.localtime()
df = DataFrame(data=stock_list)
# 保存 dataframe
file_name = f'stock{t.tm_year}{t.tm_mon}{t.tm_mday}{t.tm_hour}时.csv'
df.to_csv(file_name, encoding='gbk')
print('ok')

1000
2000
3000
4000
4546
循环完毕,共 4546 条数据
最终 4546
5546
6546
7438
循环完毕,共 7438 条数据
最终 7438
8438
9438
10438
11438
12438
13438
14438
15438
15684
循环完毕,共 15684 条数据
最终 15684
ok

结果演示

代码运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JUQovhTl-1630493435471)(attachment:image.png)]

文件保存结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VJL6UJ5a-1630493435473)(attachment:image.png)]

本次一共爬取15684条数据(计数索引从0开始的)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EiifxLzm-1630493435473)(attachment:image.png)]


  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Python和PyTorch是两个不同的东西。Python是一种高级编程语言,而PyTorch是一个基于Python的机器学习框架。PyTorch提供了丰富的工具和函数,用于构建和训练神经网络模型。 在引用\[1\]中的代码示例中,展示了一个简单的训练过程。首先,创建了一个模型对象,并生成了一个随机的向量和标签。然后,定义了一个损失函数和一个优化器。最后,使用优化器对模型进行训练。 在引用\[2\]中的代码示例中,展示了一个模型的前向传播过程。首先,定义了一个输入向量和一个嵌入层。然后,使用嵌入层将输入向量转换为嵌入向量。接下来,使用torch.einsum函数计算输出。最后,返回输出。 在引用\[3\]中的代码示例中,展示了一些与排序和填充相关的操作。首先,定义了一个张量a和一个长度向量lengths。然后,使用torch.sort函数对lengths进行排序,并获取排序后的长度和索引。接下来,根据索引对张量a进行排序。然后,定义了一个嵌入层和一个LSTM层,并将张量a输入到嵌入层中。接下来,使用pack_padded_sequence函数对输入进行填充。然后,使用LSTM层对填充后的输入进行处理。最后,使用pad_packed_sequence函数对输出进行填充,并根据索引对输出进行排序。 总之,Python是一种编程语言,而PyTorch是一个用于机器学习的框架。在PyTorch中,可以使用Python编写代码来构建和训练神经网络模型,并进行各种操作,如排序和填充。 #### 引用[.reference_title] - *1* *2* *3* [python+pytorch学习点滴记录](https://blog.csdn.net/benben044/article/details/123881062)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值