爬取上證交易所的每週股票交易概況

寫了幾篇文章都是自己看的,沒什麼水平,只放了幾個註釋,供借鑑。

這幾天每天在各大交易所爬數據,頭大,寫幾個放在裏面怕丟掉了。

一、思路 

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":([\s\S]*?)$',req).group(1)[1:11]
strat_date = re.search(r'"lowTrnd":([\s\S]*?)$',req).group(1)[1:11]

result_del = ',"startDate":"'+strat_date+'","texts":null,"type":"","validateCode":""})'  #後面result需要替換爲空的部分
result = re.search(r'"result":\[([\s\S]*?)$',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、此時啥都有了,就能拿出數據了,更主要的是數據的提取了,我這裏主要是把他轉成列表,然後對號入座,比較傳統,很好理解。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章