东方财富网新版A股数据爬取

最近东方财富网更新了网页布局,之前学习量化的时候东方财富网的爬虫失效,于是就重新研究了下。

1.网页分析

在东方财富网改版之前,股票代码数据直接存在网页源码里,获取非常方便。最近改版之后,数据以表格的形式存储在JS文件里。
此前的爬虫版本:

'''输入为html源码,输出为股票代码和名字。'''
'''此前股票代码和名字可从http://quote.eastmoney.com/stocklist.html获取'''
def getStockCode(html):
    s = r'
  • ' pat = re.compile(s) code = pat.findall(html) stockname = re.findall(re.compile(r'html">(.*)<\/a>'),html) return code,stockname
  • 现在输入http://quote.eastmoney.com/stocklist.html会直接跳转到http://quote.eastmoney.com/center/gridlist.html#hs_a_board,如图:
    东方财富网新版A股数据爬取_第1张图片
    而表格数据经查看发现是存储在JS文件里,用右键检查查看详情:
    东方财富网新版A股数据爬取_第2张图片
    点headers看JS的URL,如下:

    http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx?cb=jQuery112405185680506907513_1554430646828&type=CT&token=4f1862fc3b5e77c150a2b985b12db0fd&sty=FCOIATC&js=({data%3A[(x)]%2CrecordsFiltered%3A(tot)})&cmd=C.A&st=(ChangePercent)&sr=-1&p=1&ps=20&=1554430647075

    稍作测试便知,&p=1&ps=20为标明股票数,这里可以直接把后面的20改为3169(A股股票总数);&=1554430647075是UNIX时间戳,可以去掉;
    最后访问如下URL即可:http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx?&type=CT&token=4f1862fc3b5e77c150a2b985b12db0fd&sty=FCOIATC&cmd=C._A&st=(ChangePercent)&sr=-1&p=1&ps=3169

    2.代码

    import requests
    import json
    import pandas as pd
    import numpy as np
    url = r'http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx?&type=CT&token=4f1862fc3b5e77c150a2b985b12db0fd&sty=FCOIATC&cmd=C._A&st=(ChangePercent)&sr=-1&p=1&ps=3169'
    
    html = requests.get(url)
    html = html.text
    
    stock = re.findall(re.compile('\((.*)\)'),html)
    stock = stock[0]
    stock = stock.split('","')
    
    stock[0] = stock[0][2:]
    stock[-1] = stock[-1][:-2]
    stock_data = []
    for i,item in enumerate(stock):
        t = item.split(',')
        stock_data.append(t)
        
    print(stock_data)
    

    以上为获取表格数据的代码,由于获取的数据的格式混乱,需要进行一定处理,最终存储到csv文件中,代码如下:

    columns = ['交易所','股票代码','股票名字','当前股价','涨跌额','涨跌幅','成交量(手)','成交额','振幅','最高','最低','今开','昨收','5分钟涨跌','量比','换手率','市盈率','市净率','总市值','流通市值','60日涨跌幅','年初至今涨跌幅','涨速','上市时间','数据时间','成交量']
    data = pd.DataFrame(stock_data,columns = columns)
    #data.head().T
    
    columns = ['交易所','当前股价', '涨跌额', '涨跌幅', '成交量(手)', '成交额', '振幅',
           '最高', '最低', '今开', '昨收', '5分钟涨跌', '量比', '换手率',  '市净率', '总市值', '流通市值',
           '成交量']
    data[columns] = data[columns].astype(np.float64)
    
    data['市盈率'] = data['市盈率'].apply(lambda x:None if x == '-' else x)
    data['市盈率'] = data['市盈率'].astype(np.float64) 
    
    data['上市时间'] = pd.to_datetime(data['上市时间'],format= '%Y-%m-%d')
    data['数据时间'] = pd.to_datetime(data['数据时间'],format= '%Y-%m-%d %H:%M:%S')
    
    data['60日涨跌幅'] = data['60日涨跌幅'].str.strip("%").astype(float)/100
    data['年初至今涨跌幅'] = data['年初至今涨跌幅'].str.strip("%").astype(float)/100
    
    data['涨速'] = data['涨速'].apply(lambda x:None if x == '-' else x)
    data['涨速'] = data['涨速'].astype(np.float64)
    
    data['交易所_'] = data['交易所'].apply(lambda x:'沪市' if x == 1 else '深市' )
    data.to_csv('stock-A.csv')
    

    最后,看下效果:
    东方财富网新版A股数据爬取_第3张图片

    你可能感兴趣的:(爬虫)