這個爬蟲去yahoo股市爬一間新店的軟體公司的成交彙整資料
把成交彙整的表格裡的資料都拿出來
一開始我先去yahoo股市的頁面看要爬的目標在哪裡
按F12再點資料日期發現他的區塊id,我的第一步就先把他這區域的程式碼拿下來
#!/usr/bin/python3.7 # -*- coding: utf-8 -*- import sys import json import requests from bs4 import BeautifulSoup import lxml import pandas as pd import numpy as np import codecs #---------------------------爬取股票資料 start--------------------- #奇摩股票網址爬富爾特 6136 res = requests.get("https://tw.stock.yahoo.com/q/ts?s=6136") res.encoding='big5' soup=BeautifulSoup(res.text,'lxml') # 鎖定id=detailTable的範圍,這是成交彙整區塊 #再從table->tr拿取其中的文字和內容 soup2=soup.find_all('div',id="detailTable") result_text=[] x=1 x1="" for d in soup2: try: result=d.find('table') print(result) except: print("有異常") #---------------------------爬取股票資料 start----------------------
先把div id=”detailTable” 的資料拿下來後,再從中拿出table的程式碼
結果:
再把這些程式碼貼到vscode整理,以下是貼到vscode的畫面
從上面發現我要的資料都在tr裡面,所以在往下塞選把tr拿出來
for d in soup2: try: result=d.find('table') result_1=result.find_all('tr') for item in result_1: rs=item.text #拿tr裡面的文字 print(item.text) result_text.append(rs) except: print("有異常")
拿到每一筆tr的內容後先存到result_text陣列裡,以便後面資料處理用
下面是每一筆tr的內容:
資料處理的部分先處理標頭文字
# ---------------------------處理標頭文字 start-------------------- sendmessage='' title2='' for i in range(0,len(title[0])): if i==1 or i==0: title2+=title[0][i] continue title2+=' '+title[0][i]+' ' if i==len(title[0])-1: title2+=')' sendmessage=result_text[0]+"\n"+title2+"\n" # ---------------------------處理標頭文字 end-----------------------
迴圈跑完後新增到要傳送到tgbot的字串變數
結果:
處理每一條資料,因為這時候還是黏在一起的
# ---------------------------整理每一條資料 start------------------ i=1 #計數 k=1 result_string='' sting_list=[] for item in result_text: if i>=4: for item2 in item: #整理每一條數字 result_string=result_string+item2 if k%5==0: #當符合一組的時候就新增陣列,在重置字串變數 # print(result_string) sting_list.append(result_string) result_string='' if k==len(item): # print("長度"+str(len(item))+"最後:") # print(result_string) sting_list.append(result_string) result_string='' # sting_list.append(result_string) # result_string='' k+=1 k=1 i+=1 # print(sting_list) #陣列分割,每七個一組形成二微陣列 # ---------------------------整理每一條資料 end---------------------
因為每一組數字和時間剛好都是5位,所以在新增陣列的時候是串好5個字元再新增
新增完後字串連接用的變數初始化為空字串,下一組串接時就不會有其他組的字元
資料組好後在把陣列切成跟頁面上的表格一樣
#把一微陣列分割成二維,看要分成幾個元素一個陣列 def divide_chunks(t, n): # looping till length t for i in range(0, len(t), n): yield t[i:i + n]
以上這個作法是上網找到 參考資料
把要處理的陣列放在第一個,幾份為一列放在第二個
套過上面的function幫我把想要的二維陣列切出來
finish=list(divide_chunks(sting_list,7))
下面做最後的整理要廚到tgbot那邊得字串
# ------------------------處理每一個時段數據 start------------------ finish_string='' p=1 #每一排的計數 b=1 #每一圈的計數 for f1 in finish: for f2 in f1: if p==1: finish_string+=f2+"是 " p+=1 continue if p==len(f1): finish_string+=f2 break finish_string+=f2+"," p+=1 sendmessage+=finish_string+'\n' #新增要傳到tgbot的字串變數 if b==10: #10以後的不拿 break p=1 #重置計數 finish_string='' #重置字串串接變數 b+=1 # ------------------------處理每一個時段數據 end-------------------
先整理每一行資料,迴圈出來後加上換行符號後再串接字串
會只停在第10圈是因為線面長條圖不拿
def tgbot(text_string): #這邊放從tgfather拿到的token bot_api_key = 'tgbot的key'; url = 'https://api.telegram.org/bot'+bot_api_key+'/sendMessage?chat_id= tgbot的id &text='+text_string+'&parse_mode=html' s = requests.Session() r1 = s.get(url) result2=json.loads(r1.text) re1=[] if result2['ok']==True: re1=[1] return re1 elif result2['ok']==False: re1=[0,result2['error_code']] return re1
有另外寫個function去接tgbot的api
api網址的組成 https://api.telegram.org/bot+tgbot的key+’/sendMessage?chat_id= tgbot的id &text=’+text_string+’&parse_mode=html’
這邊是用requests.Session() 把字串傳進去,api回傳的結果用json.loads來解析,傳失敗的話會回傳錯誤訊息來查看
下面是使用tgbot的程式碼
tg_get=tgbot(sendmessage) if tg_get[0]==1: print('成功') elif tg_get[0]==0: print(tg_get[1])
結果: