仅供参考

爬取逻辑

  • 过程分析
    • 数据请求来源分析
      • 点击行情链接进来后的页面有数据
      • 禁止js以后发现页面无数据
    • 链接分析
  • 代码测试
    • 测试爬虫能否获取到数据
    • 提取需要的股票数据
    • 写入数据
  • 多页爬取
    • 循环条件分析
    • 代码优化
  • 多交易所爬取
    • 逻辑分析
    • 沪深港美股市信息爬取
  • 结果演示
    • 代码运行
    • 文件保存结果

过程分析

数据请求来源分析

浏览器操作 演示过程

通过使用浏览器浏览发现,雪球网的股票数据都是通过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数据 找出我们需要的对应数值 然后再在代码中提取对应数据

提取需要的股票数据

# 提取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是否为空作为判断条件,进行代码的改写

代码优化

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

改写部分如图所示

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

# 准备请求的固定格式代码
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 += 1params['page'] = pageresponse = 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), '条数据')breakfor 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:板块 这两个参数 我们用字典存储 构成键值对格式

更改点截图:因为这次爬取了多个交易所的股票,我们把存储股票的列表名字也改一下(当然 也可以不改)

沪深港美股市信息爬取

# 准备请求的固定格式代码
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 = 0while True:page += 1params['page'] = pageparams['market'] = marketparams['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), '条数据')breakfor 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

结果演示

代码运行

文件保存结果

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


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

  1. Python数据分析之证券之星沪深A股基本信息爬取与分析

    Python数据分析之证券之星沪深A股基本信息爬取与分析 上周爬取了证券之星上沪深A股的信息,我对股票完全是小白,对流通市值这些完全不了解,是上网先了解了一下,老实说虽然有了基本概念,但在数据分析时还 ...

  2. 雪球网沪深全站股票评论爬虫

    这个爬虫写得好累,就简单讲一下思路吧.雪球网股票的评论内容是不能直接访问的,必须要携带在第一次访问时雪球网写进本地的cookie(其实你随便打开一次官网就是属于第一次访问了,那时候 不需要cookie ...

  3. 沪深上证所有股票代码抓取(系列一)

    沪深上证所有股票代码抓取(系列一) 这个比较简单直接上代码 抓取结果 下一篇 所有股票历史数据抓取 这个比较简单直接上代码 from selenium import webdriverimport p ...

  4. python对城市规划_Python对城市距离自动化爬取【必学小型项目】

    本地创建数据库,将 excel 数据存储到 city 表中,再取 | 湖北省 | 的所有地级市和县.县级市.区数据作为样表数据记录在样表中.利用 python 的 xlrd 包,定义 process_ ...

  5. python跑一亿次循环_python爬虫爬取微博评论

    原标题:python爬虫爬取微博评论 python爬虫是程序员们一定会掌握的知识,练习python爬虫时,很多人会选择爬取微博练手.python爬虫微博根据微博存在于不同媒介上,所爬取的难度有差异,无 ...

  6. Python爬虫:最牛逼的 selenium爬取方式!

    Python爬虫:最牛逼的 selenium爬取方式! 作为一个男人 在最高光的时刻 这是小编准备的python爬虫学习资料,加群:700341555即可免费获取! Python爬虫:最牛逼的 sel ...

  7. Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片

    Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...

  8. Python网络爬虫数据采集实战:Scrapy框架爬取QQ音乐存入MongoDB

    ​    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本 ...

  9. python爬虫--Scrapy框架--Scrapy+selenium实现动态爬取

    python爬虫–Scrapy框架–Scrapy+selenium实现动态爬取 前言 本文基于数据分析竞赛爬虫阶段,对使用scrapy + selenium进行政策文本爬虫进行记录.用于个人爬虫学习记 ...

  10. Python爬虫之scrapy框架360全网图片爬取

    Python爬虫之scrapy框架360全网图片爬取 在这里先祝贺大家程序员节快乐,在此我也有一个好消息送给大家,本人已开通了微信公众号,我会把资源放在公众号上,还请大家小手动一动,关注过微信公众号, ...

最新文章

  1. 自动驾驶规划方法综述
  2. [Cocos2d-x]视差滚屏效果的实现
  3. ajax请求的五个步骤_监控整个页面,非AJAX,需要通知
  4. 逻辑回归是个什么逻辑
  5. ORA-12154:TNS:无法解析指定的连接标识符
  6. 内存版u-boot制作
  7. 快速学会开发微信小程序
  8. 函数式编程的Java编码实践:利用惰性写出高性能且抽象的代码
  9. koa2 mysql增删改查_koa2对mongodb的增删改查
  10. 【NOIP2016提高A组五校联考2】running
  11. View DrawingCache的理解
  12. 手写数字识别Caffe实现
  13. 2018_11_25_生活记录
  14. python人工智能算法的方式_Python与人工智能
  15. Visual.Assist.X.V10.7.1912的Crack破解补丁
  16. 一文搞懂F.binary_cross_entropy以及weight参数
  17. 有哪些值得推荐的计算机专业的竞赛?
  18. 状态码中400错误和405错误怎么解决
  19. 二叉树的自下而上、从右到左的层次遍历算法实现
  20. mtatlas mysql_MHA-Atlas-MySQL高可用(下)

热门文章

  1. 证券公司信息化4_最核心的IT系统是什么?柜台系统的两个主要功能?一个交易过程是怎样的?
  2. 2022-2028年全球一次性视频内窥镜行业收入年复合增长率CAGR为 42.6%
  3. 如何把pdf分割成多个?怎么把pdf文件分成多个?
  4. python 自动输入_鼠标自动点击、键盘自动输入?几行Python代码搞定
  5. 植物大战僵尸修改阳光
  6. 假如古人用上了区块链技术
  7. Android App开发动画特效中插值器和估值器的讲解以及利用估值器实现弹幕动画实战(附源码和演示视频 可直接使用)
  8. librosa 音频处理库
  9. Python视频制作 MoviePy框架音频处理模块
  10. SQLyog安装地址