python怎么抓新浪百度股票数据 datareader

2024-05-16 12:57

1. python怎么抓新浪百度股票数据 datareader

应该都是可以获取的,一般获取数据有两个方法,get和post,在源码能够显示的使用的是get,而post一般是用异步加载的形式进行展现的。

python怎么抓新浪百度股票数据 datareader

2. 如何用Python写一个抓取新浪财经网指定企业年报的脚本

1.先得到需要的上市公司的股票代码和名字。
2.分析下载链接地址。以康达尔为例,年报地址,下载链接 的页面 ,链接末尾的8个数字前6个是股票代码,后两位01代表上交所上市公司(股票代码60开头)、02代表深交所上市公司。 让后就可以用一个循环来下载所有的数据!
3.把下载下来的xml文件转化成xls文件,代码如下:
1). xml可能的中文编码错误处理


def xml_Error_C(filename):
fp_xml=open(filename)
fp_x=''#中文乱码改正
for i in range(os.path.getsize(filename)):
i+=1
a=fp_xml.read(1)
if a=='&':
fp_xml.seek(-1,1)
if fp_xml.read(6)==' ':
i+=5
continue
else:
fp_xml.seek(-5,1)
fp_x+=a
fp_xml=open(filename,'w+')
fp_xml.write(fp_x)
fp_xml.flush()
fp_xml.close()


2). xml转xls

def Xmltoxls(xmlname,xlsname):
if os.path.getsize(xmlname)<1024:#小于1K,无该项数据
return False
wb=xlwt.Workbook(encoding='utf-8')
ws=wb.add_sheet('Table')
fp_xml=minidom.parse(xmlname)
root=fp_xml.documentElement
Row=root.getElementsByTagName('Row')
Data=root.getElementsByTagName('Data')
col_num=len(Data)/len(Row)
row_num= 0
for row in Row:
Data=row.getElementsByTagName('Data')
for i in range(col_num):
if len(Data[i].childNodes)==0:
ws.write(row_num,i,' ')
continue
ws.write(row_num,i,Data[i].childNodes[0].nodeValue.strip().encode('utf-8'))
row_num+=1
wb.save(xlsname)
return True




上整体代码:

from  xml.dom import  minidom
import xlwt
import os,shutil
import time,urllib2
def Xmltoxls(xmlname,xlsname):
if os.path.getsize(xmlname)<1024:
return False
wb=xlwt.Workbook(encoding='utf-8')
ws=wb.add_sheet('Table')
fp_xml=minidom.parse(xmlname)
root=fp_xml.documentElement
Row=root.getElementsByTagName('Row')
Data=root.getElementsByTagName('Data')
col_num=len(Data)/len(Row)
row_num= 0
for row in Row:
Data=row.getElementsByTagName('Data')
for i in range(col_num):
if len(Data[i].childNodes)==0:
ws.write(row_num,i,' ')
continue
ws.write(row_num,i,Data[i].childNodes[0].nodeValue.strip().encode('utf-8'))
row_num+=1
wb.save(xlsname)
return True
def xml_Error_C(filename):
fp_xml=open(filename)
fp_x=''#中文乱码改正
for i in range(os.path.getsize(filename)):
i+=1
a=fp_xml.read(1)
if a=='&':
fp_xml.seek(-1,1)
if fp_xml.read(6)==' ':
i+=5
continue
else:
fp_xml.seek(-5,1)
fp_x+=a
fp_xml=open(filename,'w+')
fp_xml.write(fp_x)
fp_xml.flush()
fp_xml.close()
def errorlog(error):
fp_error=open('errorlog.txt','a')
fp_error.write(error+'\n')
fp_error.close
fp_code=open('stockcode..txt')
fp_basic=open('basicdata_url.txt')
temp='z:\\temp.xml'
for line in fp_code:#设置代码起始位置
if line.split()[0]=='601958':
break
for line in fp_code:#遍历所有代码及名称
filepath='basicdata\\'+line.split()[0]+line.split()[1].replace('*','&')#建立文件夹
if not os.path.isdir(filepath):
os.makedirs(filepath)
for url in fp_basic:#抓取所有数据并保存
url_f=url.split()[0]+line.split()[0]+('01' if int(line.split()[0])>599999 else '02')+'&exp=1'
print 'I am handle '+line+' '+url.split()[1]+' '+'data for you'
filename=filepath+'\\'+line.split()[0]+' '+url.split()[1]+'.xls'
while True:#get xml data
try:
u=urllib2.urlopen(url_f)
time.sleep(0.3)
data=u.read()
f=open(temp,'w+')#保存文件
f.write(data)
f.flush()
f.close()
break
except :
print 'Network error,try latter!'
time.sleep(10)
while True:#xml data to xls data
if url.split()[1] in ['News','Notice','Subject']:
shutil.move(temp,filename) #   os.rename("oldname","newname")
break
try:
xml_Error_C(temp)
Xmltoxls(temp,filename)
except IOError:
errorlog('No '+filename)
except:
shutil.move(temp,filename)
errorlog('Not Done '+filename)
break
time.sleep(0.2)
time.sleep(7)
fp_basic.seek(0)
print 'All data have been getted.'
fp_code.close()
fp_basic.close()

3. 如何通过python调用新浪微博的API来爬取数据

1:安装python(这个不多说啦)
2:下载新浪微博SDK的python包,解压为weibopy目录

3:申请AppKey,

流程:

1:通过oAuth认证
按我的理解简化如下:
用户在新浪微博给的页面输入账号密码,然后微博给应用一个PIN码,这样应用通过PIN码才有权限访问该用户的信息,而应用在整个过程中是接触不到密码的,所以用户觉得很安全,后果很满意
2:获得认证之后,就可以使用微博SDK提供的API获得信息啦
3:如果想设计web或者客户端应用的话,那就继续加个GUI好啦(未完成)

代码:

#!/usr/bin/python

import webbrowser

from weibopy.auth import OAuthHandler
from weibopy.api import API

AppKey = '2525355147'
AppSecret = '2e2c7bcdfc362eace266d1f2bf83fe6b'

my_auth = OAuthHandler(AppKey , AppSecret)
webbrowser.open(my_auth.get_authorization_url())
verifier = raw_input('PIN: ').strip()
my_auth.get_access_token(verifier)

my_api = API(my_auth)
for comment in my_api.mentions():
object = comment
id = object.__getattribute__("id")
text = object.__getattribute__("text")
print str(id) + " : " + text

如何通过python调用新浪微博的API来爬取数据

4. python 安装新浪sdk 怎么安装

运行环境:
Python 2.6 - 2.7
依赖:
无任何依赖。
安装:
pip install sinaweibopy

5. 如何使用Python实现新浪模拟登陆

第一步:预登陆。
现在微博、空间等大型网站在输入用户名后基本都会做编码或者加密处理,这里在用户名输入框输入我的账号,通过抓包工具可以看到服务器会返回一段字符串:

图2
这一步就是预登陆过程,同学们可以自己试试。登陆的时候我们需要用到其中的servertime、nonce、pubkey等字段。当然这个不是我自己猜想的,后面的步骤会做说明。
还有一点,就是预登陆的url:
http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=1461819359582
这里 su 的值是自己用户名经过 base64 编码的值。但可能你们会问我是如何知道的呢,待会儿我会讲到。经过实测,如果我们这里不给 su 传参数,其实也是可以的。为了最真实的模拟用户登录,我们最好还是带上它的值。
请看图一的第一条 js 请求http://i.sso.sina.com.cn/js/ssologin.js,同学们可以点进去看,这个就是前面提到的加密用户名和密码等一系列的加密文件了,如果有同学非要问我是怎么找到这个加密文件的,我也只有说:反复抓包,从在浏览器输入 weibo.com 过后就找 js 文件请求路径,然后再用代码格式化工具打开,挨着一个一个看,在代码中搜关键字,比如这里我们可以搜"nonce"、"servertime"等,就能找到加密文件了。
打开加密文件我们可以看到加密用户名的代码,在加密 js 文件中搜索'username',可以看到有一行代码为:
username = sinaSSOEncoder.base64.encode(urlencode(username));  _现在我们可以直接查找 encode 方法(代码太多就不贴上来了),即可查找到对应方法了,为了验证我们的猜想,我们可以在 webstorm 中 copy 这个 encode 函数带上自己的用户名运行,返回的结果就是 su 的值,这个值在之后进行 post 提交的时候也会用到。如果对加密有一定经验的同学可能一眼就会看出这个是 base64 编码,python 中有个 base64 模块可以干这个事情。我们再回到图一,http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)这个地址就是进行 post 提交数据的地址,下面是我自己提交的数据:

图3
这里我们需要自己构造 su(加密后的用户名),sp(加密后的密码),servertime,nonce,rsakv 等数据,其它数据都不用变。有同学问我为哈其它数据不用变?你自己可以多登陆几次,看变化的值,那么那些值就是需要构造的值,其它值就直接拿过来用就行了。这里的 su,servertime,nonce,rsakv 都已经拿到了,所以当前需要的就只是 sp 的值了。我们还是按照原来的方法在 js 文件中查找"sp",可以找到requests.sp=password这段代码,所以我们就只需要看 password 怎么构造的了。通过查找可以看到关键加密代码:
password = RSAKey.encrypt([me.servertime,me.nonce].join("\t") +"\n"+ password)

这一段代码便是加密密码的代码,有经验的同学一看就知道是用的 RSA 加密,python 中也有相应的 rsa 加密库可用。但是我们假设大家都没看出来或者不知道 python 中有 rsa 这个第三方库。这时候就要给大家介绍一些我的经验了,我现在已经知道的有三种模拟登陆方案:a) 最简单暴力,效率也是最高的,直接把 js 源码转化为相应的 python 代码,模拟加密流程进行加密 b) 使用 selenium phantomjs/firefox 的方案直接模拟人的操作填写表单提交数据进行模拟登陆,这种方式最为简单,效率稍微低一些。如果有同学对这种简单暴力的方式感兴趣,可以到我的 github 上查看一下源码 c) 比较折中的方案,通过 pyv8/pyexecjs 等渲染 js 代码进行执行,本文主要就是讲的这种方式。第一种方式如果是遇到微博调整了登陆加密算法,就必须改加密代码,第二种方式和第三种方式不存在这个问题。
由于我用的是 Python3,并不支持 PyV8,所以我选了和它类似的 PyexecJS,这个也可以直接执行 js 代码。我也不是很熟悉 Javascript 代码,所以我直接定义了一个函数处理加密密码,并没对其加密源代码修改太多:
function    get_pass(mypass,nonce,servertime,rsakey){
varRSAKey = newsinaSSOEncoder.RSAKey();
RSAKey.setPublic(rsakey,"10001");
password= RSAKey.encrypt([servertime,nonce].join("t") "n" mypass)
return    password
}
这个函数中的东西其实就是 copy 的加密文件的加密过程代码。为了试验,我直接使用之前自己登陆抓到的 nonce、servertime、rsakey 等数据,在 webstorm 中调用这个函数,但是报错了,提示"navigator is undefined",webstorm 使用的 nodejs 的运行时环境,而 navigator 为浏览器的某个属性,所以运行会出问题。于是我就是用 phantomjs 来作为运行时环境.考虑到有同学不知道 phantomjs 怎么使用,这里我简要说一下吧。使用 windows 的同学先要去 phantomjs 官网下载它的可执行文件,然后设置环境变量。在命令行输入"phantomjs some.js"即可执行 some.js 文件,其实就和在命令行执行 python 或者 java 文件一样,如果不清楚的可以百度执行命令行执行 python 的方法,仿照着来就可以了,再不清楚就问我。使用 ubuntu 的同学可以直接用 sudo apt-get install phantomjs,就可以安装使用了。我直接把加密的 js 文件使用 phantomjs 运行,果然好着呢。原因是因为 phantomjs 其实就是一款无 ui 的浏览器,自然支持 navigator、window 等属性。而 pyexecjs 支持使用 phantomjs 作为运行时环境,具体用法 pyexecjs 的 git 主页有,我也在代码中有所体现。
with open('G:/javascript/sinajs.js','r') as f:
source = f.read()
phantom = execjs.get('PhantomJS')
getpass = phantom.compile(source)
mypass = getpass.call('getpass',mypass,nonce,servertime,pubkey)
这段代码就可以得到加密过后的密码了。
之后,便可以进行 post 提交,提交地址可以从抓包工具看到:
http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)
根据经验,到这里过程基本就完了。但是微博有点坑啊,这里还需要有一步,就是图一所示的类似http://passport.weibo.com/wbsso/login?ssosavestate=1493447127&url=http://weibo.com/ajaxlogin.php?framelogin=1&callback;=parent.sinaSSOController.feedBackUrlCallBack&ticket=ST-NTc3NTg1MjMwNw==-1461911127-gz-1DE185DF04280D7E96BDCD14D9D8E235&retcode=0,这一步会将请求重定向,返回当前账号的登陆信息,如下图:
那么问题来了,怎么获取上面的请求地址呢。分析上面地址,有 ticket 字段,这个应该是让你登陆的凭据,所以这个地址应该是服务端返回的,如果不是,起码 ticket 是服务端返回的,于是我们又使用抓包工具查看在请求这段 url 之前返回的信息,发现有和上述 url 吻合的信息:
这段代码是使用 post 后回复的内容,所以可以直接从中提取出我们需要的 url。然后再使用 get 方式请求上述的 url,它会经历一次重定向,直接返回登陆信息。这个时候,就代表成功登陆了。
PS:授人以鱼不如授人以渔,这是我一直秉承的信念。可能有的老手觉得我写得很啰嗦,但其实很多新手可能都不知道这些细节,所以我把我在分析新浪微博模拟登陆的过程全写了出来。另外,除了这种方式,本文提到的另外两种方式也有实现。最暴力的方式需要使用 rsa 这个第三方库,具体我在代码上有详细注释,还有一种是使用 selenium phantomjs 这种方式,我也在代码中关键地方有注释。

如何使用Python实现新浪模拟登陆

6. 如何用Python下载新浪博客某篇博文下的评论与回复呢?

你搜一下python爬虫,主要是正则表达式写对就可以了

7. Python中爬新浪微博时的模拟登录老不成功,出错如下↓ AttributeError:'set'

百度上经常有些不知所谓的人提问说我的代码报错,但就是不给出代码.我对于这种人的回答只有一个: 你的代码写错了,你要再问哪里错了,为什么错了,我只能说,你TMD又没给代码我看!!!我怎知道
你的代码写错了,你要再问哪里错了,为什么错了,我只能说,你TMD又没给代码我看!!!我怎知道
你的代码写错了,你要再问哪里错了,为什么错了,我只能说,你TMD又没给代码我看!!!我怎知道
你的代码写错了,你要再问哪里错了,为什么错了,我只能说,你TMD又没给代码我看!!!我怎知道
你的代码写错了,你要再问哪里错了,为什么错了,我只能说,你TMD又没给代码我看!!!我怎知道
你的代码写错了,你要再问哪里错了,为什么错了,我只能说,你TMD又没给代码我看!!!我怎知道
你的代码写错了,你要再问哪里错了,为什么错了,我只能说,你TMD又没给代码...

Python中爬新浪微博时的模拟登录老不成功,出错如下↓ AttributeError:'set'

8. Python如何爬取新浪网前三页文字?

如果你在英文词典里边查Python,他会给出你Python是大蟒蛇的释义,这样读:英[ˈpaɪθən]、美[ˈpaɪθɑ:n],Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。Python是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。
最新文章
热门文章
推荐阅读