我的目标是通过python从stocktwits下载推文。可悲的是,我是一个完整的蟒蛇新手,并且陷入了基础。
我在Jason Haury找到了这个脚本https://github.com/hamx0r/stocktwits/blob/master/api.py。可悲的是,我无法让它运行起来。到目前为止我所做的是下载“api.py”和“requestors.py”脚本,并在后面的“ST_ACCESS_TOKEN”中替换为我的访问令牌。但是,当我运行命令“get_watched_stocks(my_watchlist_id)”时,我收到以下错误:
“get_watched_stocks中的ipython-input-12-b889976b3838>(wl_id)
115 """ Get list of symbols being watched by specified StockTwits watchlist
116 """
- > 117 wl = R.get_json(ST_BASE_URL +'watchlists / show / {}。json'.format(wl_id),params = ST_BASE_PARAMS)
118 wl = wl['watchlist']['symbols']
119 return [s['symbol'] for s in wl]
TypeError:必须使用Requests实例作为第一个参数调用unbound方法get_json()(改为使用str实例)“
有人知道我可能做错了什么吗? 如果没有:有人可以一步一步解释我如何使用Haury先生或任何其他脚本从stocktwits下载推文?
提前致谢!
答案 0 :(得分:0)
如果查看在requestors.py中创建的Requests类,看起来创建者希望它们是类上的静态方法,但忘记实际上使它们成为静态方法。如果您进入该文件并在@staticmethod
上面放置两个函数定义,它将起作用。例如
def get_json(url, params=None):
现在变成
@staticmethod
def get_json(url, params=None):
经过测试和确认
答案 1 :(得分:0)
您也可以使用selenium,我的脚本适用于CC_transcript,但您可以将其应用于任何帐号:
###########################################################################
### This script is a web scraper for stocktwits. ###
## applied specifically on cc_transcripts . ###
### To use it you need first to install Python 3.5.2 on your computer. ###
### Install the module "Selenium" 3.1.1, and "chromedriver.exe" ###
###########################################################################
from selenium import webdriver
import sys
import time
from selenium.webdriver.common.keys import Keys
#only for Chrome, for firefox need another driver
print("Loading... Please wait")
Pathwebdriver="D:\\Programs\\Python\\Python35-32\\Scripts\\chromedriver.exe"
driver = webdriver.Chrome(Pathwebdriver)
#website to analyse
driver.get("https://stocktwits.com/cctranscripts?q=cctranscripts")
#Scrolling of the webpage
ScrollNumber=3
print(str(ScrollNumber)+ " scrolldown will be done.")
for i in range(1,ScrollNumber): #scroll down X times
print("Scrolling... #"+str(i))
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2) #Delay between 2 scrolls down to be sure the page loaded, 1s is too short some loading take longer
#retrieving source code
html_source = driver.page_source
data = str(html_source.encode('utf-8'))
#driver.close()#close of chrome to able the opwning of new windows and to save source code.
#Saving source code (in the same folder as this script)
SaveSource = False
if SaveSource:
text_file = open("SourceCode.html", "w")
text_file.write(data)
text_file.close()
#Analysis of the source code
PosScanning=1
GlobalList=[]
print("Processing data")
while data[PosScanning:].find("picked")>0:
PosPick=data[PosScanning:].find("picked") +PosScanning
List = [0, 0, 0, 0, 0, 0, 0] #Ticker,Nb of shares, Text of stocktwits,Link,Price of buying, Date, Text of CC_transcript
#Quote
dataBis=data[PosPick::-1] #reading the string backward
PosBegin=PosPick - dataBis.find(">") +1 #looking for the begining of the text
data=data[PosBegin:] #shortening the string each loop to increase the speed of processing
PosEnd=data.find("<")#looking for the end of the text
#print(data[PosBegin:PosEnd])
List[2]=data[:PosEnd].replace(","," ")
#Nb of shares
List[1]=List[2].split(' up', 1 )[1]
List[1]=List[1].split('share', 1 )[0]
List[1]=List[1].replace(" ","")
#link to the transcript
PosLinkBegin=data.find("href=")+6
PosLinkend=data.find("\"",PosLinkBegin,PosLinkBegin+3000)
#print(data[PosLinkBegin:PosLinkend])
List[3]=data[PosLinkBegin:PosLinkend]
#Symbol
PosSymbolBegin=data.find("data-symbol=")+13
PosSymbolEnd=data.find("\"",PosSymbolBegin,PosSymbolBegin+300)
#print(data[PosSymbolBegin:PosSymbolEnd])
List[0]=data[PosSymbolBegin:PosSymbolEnd]
#data-body, the "picked" is repeat 2 times, need to ignore it
PosBody1=data.find("picked",PosSymbolEnd,PosSymbolEnd+10000)+100
PosBody2=data.find("picked",PosBody1,PosBody1+10000)
PosScanning=PosBody2 +100
GlobalList.append(List)
#Opening Link to retrieve information
print("Opning links to retrieve detailed information form CC_transcript")
j=1
for item in GlobalList:
print("Retrieving data: " +str(j)+"/"+str(len(GlobalList)))
driver.find_element_by_tag_name('body').send_keys(Keys.COMMAND + 't')#open tab
driver.get(item[3])
html_source2 = driver.page_source
data2 = str(html_source2.encode('utf-8'))
#text of CC_transcript
TextePos=data2.find("$(\"#meaning\").popover();")
item[6] = data2[TextePos+40:TextePos+1000].replace(","," ")
#price of Shares
BuyPos=item[6].find("place at")+10
BuyPosend=item[6][BuyPos:].find("share")+BuyPos +6
item[4]=item[6][BuyPos:BuyPosend]
#date
DatePos=item[6].find(" on ")
DatePosEnd=item[6][DatePos:].find(".")+DatePos
item[5]=item[6][DatePos+4:DatePosEnd]
j=j+1
driver.close()
#output of final data
print("Writting data in .csv file")
f = open('stocktwits.csv','w')
f.write("Ticker")
f.write(' , ')
f.write("Nb of shares")
f.write(' , ')
f.write("Text of stocktwits")
f.write(' , ')
f.write("Link")
f.write(' , ')
f.write("Price of buying")
f.write(' , ')
f.write("Date")
f.write(' , ')
f.write("Text of CC_transcript")
f.write('\n')
for item in GlobalList:
for elem in item:
f.write(elem)
f.write(' , ')# excel change of column
f.write('\n') # excel change of line
f.close()
time.sleep(5)
print("Done")
答案 2 :(得分:0)
@annach看看pytwits,一个适用于StockTwits的Python Wrapper&#39; REST-API。
由于该项目非常年轻,它远非完美,但要在监视列表中获得符号列表,您只需这样做:
pip install pytwits
然后:
import pytwits
def main():
access_token = 'TOKEN'
stocktwits = pytwits.StockTwits(access_token=access_token)
watchlist = stocktwits.watchlists(path='show', id='WL_ID_HERE')
print('\n\n'.join([symbol['symbol'] for symbol in watchlist.symbols]))
if __name__ == '__main__':
main()