寫了幾篇文章都是自己看的,沒什麼水平,只放了幾個註釋,供借鑑。
這幾天每天在各大交易所爬數據,頭大,寫幾個放在裏面怕丟掉了。
一、思路
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、此時啥都有了,就能拿出數據了,更主要的是數據的提取了,我這裏主要是把他轉成列表,然後對號入座,比較傳統,很好理解。