zoukankan      html  css  js  c++  java
  • 爬取上证交易所的每周股票交易概况

    写了几篇文章都是自己看的,没什么水平,只放了几个注释,供借鉴。

    这几天每天在各大交易所爬数据,头大,写几个放在里面怕丢掉了。

    一、思路 

    1 、打开你要爬取的网页

    2、拿到你要的网页url

     3、找到你所要数据所处的网页位置

    F12 点击,然后在网页上点你所需要的数据,开发者窗口跳转到你所要的数据上,可以用copy——xpath直接拿数据位置,后面加上 //text(),或者用的是bs4 那么可以用copy——selector ,但是现在大多数网页都是动态的,用刚才的那两种方式都会爬出来  “加载中。。。” 这样的东西,那么我们现在需要找到他动态json的文件的位置

    点击

    然后在网页中刷新一下,这边会重新加载各种request请求,

    大部分都是这种格式的文件,看这文件的result下的数据是不是你表格中的数据,如果是那就成功一半了。(狗头),这时候

    preview旁边这个Headers提供给你一大堆的数据,什么   Cookie   url   headers  referer  等 都有了 ,复制到你代码里面去。

    import requests
    from bs4 import BeautifulSoup
    import json
    import re
    import csv
    import datetime
    
    today = datetime.date.today()
    today_weekday = today.isoweekday()
    last_sunday = today - datetime.timedelta(days=today_weekday)
    last_monday = last_sunday - datetime.timedelta(days=6)
    last_monday = last_monday.strftime('%Y-%m-%d')
    last_sunday = last_sunday.strftime('%Y-%m-%d')         #构造url内必须的时间段
    
    
    Cookie = "yfx_c_g_u_id_10000042=_ck20042119410119711157603279361; VISITED_MENU=%5B%228451%22%2C%2211169%22%5D; JSESSIONID=0FA87A107EC2DEF8FF84BE91E7CE3AAA; yfx_f_l_v_t_10000042=f_t_1587469261946__r_t_1587469261946__v_t_1587472096302__r_c_0"
    url = "http://query.sse.com.cn/marketdata/tradedata/queryWeekTradeNew.do?jsonCallBack=jsonpCallback19066&prodType=gp&startDate="+ last_monday+"&endDate=" + last_sunday
    headers = {
        'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36',
        'Cookie': Cookie,
        'Connection': 'keep-alive',
        'Accept': '*/*',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Host': 'query.sse.com.cn',
        'Referer': 'http://www.sse.com.cn/market/stockdata/overview/weekly/'
    }
    
    req = requests.get(url,headers=headers)
    req = req.text
    
    end_date = re.search(r'"hghVald":([sS]*?)$',req).group(1)[1:11]
    strat_date = re.search(r'"lowTrnd":([sS]*?)$',req).group(1)[1:11]
    
    result_del = ',"startDate":"'+strat_date+'","texts":null,"type":"","validateCode":""})'  #后面result需要替换为空的部分
    result = re.search(r'"result":[([sS]*?)$',req).group(1).replace('[','').replace(']','').replace(result_del,'').replace(',{',',,{').split(',,')
    
    # for i in range(len(result)):
    #     data = eval(result[i])
    #     print(data)
    productType =[]  #产品种类   1 主板A  2 主板B  12 股票   48 科创板   43 股票回购
    exchangeRate =[]  #换手率(%)
    avgProfitRate =[]  #平均市盈率(倍)
    hghTrn =[]  #最高成交笔数(万笔)
    hghVal =[]  #最高成交金额(亿元)
    hghVol =[]  #最高成交量(亿股)
    lowTrn =[]  #最低成交笔数(万笔)
    lowVal =[]  #最低成交金额(亿元)
    lowVol =[]  #最低成交量(亿股)
    mktValue =[]  #市价总值(亿元)
    negotiableValue =[]  #流通市值(亿元)
    tradingTx =[]  #成交笔数(万笔)
    txAmount =[]  #成交金额(亿元)
    txDates =[]  #累计交易天数(天)
    txNum =[]  #挂牌数
    txVolume =[]  #成交量(亿股)
    
    for i in range(0,5):
        data = eval(result[i])
        productType.append(data["productType"])
        exchangeRate.append(data["exchangeRate"])
        avgProfitRate.append(data["avgProfitRate"])
        hghTrn.append(data["hghTrn"])
        hghVal.append(data["hghVal"])
        hghVol.append(data["hghVol"])
        lowTrn.append(data["lowTrn"])
        lowVal.append(data["lowVal"])
        lowVol.append(data["lowVol"])
        mktValue.append(data["mktValue"])
        negotiableValue.append(data["negotiableValue"])
        tradingTx.append(data["tradingTx"])
        txAmount.append(data["txAmount"])
        txDates.append(data["txDates"])
        txNum.append(data["txNum"])
        txVolume.append(data["txVolume"])
    
    productType = ['主板A' if i == '1' else i for i in productType]         #另一种方法是 先做一个字典用 k v 存储数据  然后同样列表生成式
    productType = ['主板B' if i == '2' else i for i in productType]           #productType1 = [aaa[i] if i in aaa else i for i in productType]
    productType = ['股票' if i == '12' else i for i in productType]
    productType = ['科创板' if i == '48' else i for i in productType]
    productType = ['股票回购' if i == '43' else i for i in productType]
    txNum = ['0' if i == '' else i for i in txNum]
    
    f = open('data.csv', 'w', newline="")    #csv数据存储
    writer = csv.writer(f)
    writer.writerow(('开始日期','结束日期', '产品种类', '挂牌数', '市价总值(亿元)', '流通市值(亿元)', '成交金额(亿元)', '最高成交金额(亿元)', '最低成交金额(亿元)','成交量(亿股)','最高成交量(亿股)','最低成交量(亿股)','成交笔数(万笔)','最高成交笔数(万笔)','最低成交笔数(万笔)','平均市盈率(倍)','换手率(%)','累计交易天数(天)'))   
    for i in range(0,5):
        writer.writerow((strat_date.replace('-',''),end_date.replace('-',''),productType[i],txNum[i],mktValue[i],negotiableValue[i],txAmount[i],hghVal[i],lowVal[i],txVolume[i],hghVol[i],lowVol[i],tradingTx[i],hghTrn[i],lowTrn[i],avgProfitRate[i],exchangeRate[i],txDates[i]))

     4、此时啥都有了,就能拿出数据了,更主要的是数据的提取了,我这里主要是把他转成列表,然后对号入座,比较传统,很好理解。

     

  • 相关阅读:
    vue 中使用阿里iconfont彩色图标
    团队作业九
    团队作业八
    团队作业七
    第二篇
    第三篇
    第一篇
    beta冲刺计划安排
    团队作业六
    团队作业五
  • 原文地址:https://www.cnblogs.com/zsf-note/p/12748550.html
Copyright © 2011-2022 走看看