200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 使用Python获取上市公司资讯 并进行判断利好利空消息(判断部分待更新)

使用Python获取上市公司资讯 并进行判断利好利空消息(判断部分待更新)

时间:2022-09-15 12:57:10

相关推荐

使用Python获取上市公司资讯 并进行判断利好利空消息(判断部分待更新)

文章目录

前言一、获取股票新闻消息1.财联社遇到的那些坑(已解决)主网站的无法编码问题财联社公众号网址又遇同样问题2.云财经才是真爱云财经新闻爬取步骤判断1.今天码字太累了,过两天闲下来了继续完善总结本内容仅为学习研究使用

前言

6月间,社团的公众号在做这个股票新闻的版块,来整理利好利空消息。现在我想用Python的语言来写做这件事情,或者来帮助做也可以。

应该是需求面比较小,我在博客上搜索这一方面的内容,发现得到的效果不是很理想,有点不是很切胃口,有些比较完整的就有点目的性太强,我就想来写点东西来填补这一块的空缺把,也算假期爬虫这块一个大的收获。

公众号新闻稿一个人大概20分钟就可以完成,其实还是比较简单的,大概人共整理出来的word的微信稿就是这个样子:

里面包括题材(是可以涉及版块的内容)、要闻(主要是国家的一些政策,但是没有题材那么露骨)、利好利空消息、增减持公告。

这个版块5个人一个人一个交易日,整理当日3点收盘到10点多的消息面内容(因为是跟着复盘是一起发的,按理说应该整理到次日的早8点,但是实际上这个影响不大)


因为有学过Python爬取静态网页,也有一点jieba分词的经验,我想做出这个word稿还是蛮简单的,设想就是一个数据的获取,之后是个判断,最后输出内容。没有大的问题。

一、获取股票新闻消息

在做新闻的时候公众号比较参考的两个网站就是云财经和财联社,于是我就用这两个网站爬取一下新闻消息,其实爬其中一个就可以,因为比较重要的,两个网站都有。我个人是比较喜欢财联社的,所以我一开始就是一财联社来爬的。

1.财联社遇到的那些坑(已解决)

主网站的无法编码问题

其实在爬取之前也有心理准备,这种网站那必然是动态的,所以最开始我用的也是逆向分析爬取的方法,那必然很成功,每点击一次它就刷新一个xhr文件给我,我只要把每一个的网址收集起来。

那网址打开,就跟下面这个图片一样,该有的内容又都有,那不就更那个爬取静态网页不是 。事情变着十分容易。

可是没想到的是,它的那个编辑方式更我们常见不一样,这就把人给恶心到了,而且他的这个老是更新,动态的嘛,那就不是很轻松找到我们需要的xhr文件,它不跟那个常见的网址上改一个数字就变化的那种,主要变化的是是他的这个lastTime这个参数,我还找不到规律,这节恼火。

我的确是犯了难,发现这个网址编写不行,那这主网站肯定是不行了,只差一个lastTime这个数据,我还想着就是能不能缓和一下,能有种方法可以爬到lastTime这个东西,我肯定是想一步到位的,介于才疏学浅,连怎么问这个问题都不知道,这个还是没有弄出来,离这个小的版块的确差一步就成功,蛮遗憾的。

财联社公众号网址又遇同样问题

就在我思路匮竭之际,有一个转机,我发现财联社的公众号这个推送能否遇到转机。

打开这个链接,哎,做了跟主网站一样的操作,眼前一亮,这个网站比主网站还可以更加整洁一点,而且新闻到收盘的三点,这就是我想要的,xhr文件有点那种普通网站的意思,心里暗喜。

不过点击进去我又傻了,毕竟同一个财联社,操作还是没有令我失望,直接一模一样的套路,不过换了个名字last_time

好像我又回到了之前的那个问题,真当我一筹莫展的时候,我想到了Selenium这个工具,这个网址刚好适合,他还不跟主网站一样,他跟微博一样,是往拉就刷新,刚好就顺顺利利,不过又跳雷,我又磨了不知道多久,也没有解决掉。

这个我就贴出一个半解决方案,是用requests爬取的那个微信公众号提供的网址,用json做的提取,那个Selenium可行性更高,但是我没有实现,如果后期找到问题所在,我会在更新一遍。

#网址每天都变,没有规律可循,目前只能手动获取url=[]

import re,requests,time,pandas as pd,jsonh={'Cookie':'HWWAFSESID=1e666732ea4c8c52a7; HWWAFSESTIME=1596052776133; Hm_lvt_1edef0b0de24cf2a80f7f8a869619e73=1596052901; Hm_lpvt_1edef0b0de24cf2a80f7f8a869619e73=1596052986','User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}json_ls=[]for i in url:q=requests.get(i,headers=h)ls_table=json.loads(''.join(re.findall("{.*?:{.*?:(.*?)}}$",q.text)))#截取json部分json_ls=json_ls+ls_tablemodified_time=[]content=[]#外信息stock_list=[]#股票当日综合信息for p in range(len(json_ls)):modified_time=modified_time+[json_ls[p]['modified_time']]content=content+[json_ls[p]['content']]stock_list=stock_list+[json_ls[p]['stock_list']]zd={'外信息':content,'发布时间':modified_time,'股票当日综合信息':stock_list}bg=pd.DataFrame(zd)

这个方法就是需要把明天把网址放到url列表里面,算是半自动化把,每天到10点爬的话,大概7个网址,140条消息。

能算解决问题吧,但我不太满意,因为我想尽量减少人工做的判断,于是我又很不情愿的打开了云财经的网站。

2.云财经才是真爱

我以为我的第一步就把我击退,不过打开了财联社就让我眼前一亮,他的xhr文件非常整齐,而他的网站编码是有规律可循,这就及其好的。

云财经新闻爬取步骤

这种有规律可循的网站逆向分析爬取的步骤:

1. 检查找到所需内容的xhr文件的网址规律:首先按下Ctrl+Shift+i检查页面,Ctrl+R刷新页面,滑到最下面会发现页面出现了这些内容。

2. 有的是点击下一页,有的是加载更多,有的就自动刷新了,大概看一下,用这个云财经来说的话,我点了一次加载更多,他更新一个新的xhr文件给我,我打开看了一下是我要的内容。

3. 多点击几下,观察他们网站变化的规律,大概跟着那个网址编辑一下xhr文件的网址,这个云财经就是每次点击一下他们的page变化加一,我这边编辑下来的网址是/news/get_realtime_news/yapi/ajax.html&page=1变化的是最后一个数字。

4. 打开一个这个编辑的网址,估摸一下最开始的网址在哪里,大概心里有个数,对比一下,看能不能对应上,其实要爬这个编辑好的网站跟那个静态网站差不多了,这个内容也比较适合json来爬,当然其他方法的效果也可以,可以编写代码了。

我是把我需要的库,都加上去了

import re,requests,time,pandas as pd,json

headers需要单独设置一下,它是以字典形式呈现的,headers={},里面的键值对还是要进入开发者工具里面来找,我是每次都愿意添加Cookie,其实有些网站只需要模仿浏览器就可以了,即User-Agent,看自己习惯吧。

headers={'Cookie':'ycj_wafsid=wafsid_03bb4ad9ed1c211d7f77682688e9df5b; ycj_uuid=830f25a916ee843f1a71890230949c5b; ycj_from_url=aHR0cHM6Ly93d3cuYmFpZHUuY29tL2xpbms%2FdXJsPWFVZEk3T1VSNUM1VnVUcmhWdnZvSlkyT2tyRkV1d3FGcGpFYnN4alJMQlZLYk4wdG5FLXFvTEdKRjlTTTAxb3Imd2Q9JmVxaWQ9ZmQyNzgzZDcwMDAzNWZlZTAwMDAwMDA1NWYyMWNmMzE%3D; ycj_locate=aHR0cHM6Ly93d3cuYmFpZHUuY29tL2xpbms%2FdXJsPWFVZEk3T1VSNUM1VnVUcmhWdnZvSlkyT2tyRkV1d3FGcGpFYnN4alJMQlZLYk4wdG5FLXFvTEdKRjlTTTAxb3Imd2Q9JmVxaWQ9ZmQyNzgzZDcwMDAzNWZlZTAwMDAwMDA1NWYyMWNmMzE%3D; YUNSESSID=qm65k020oh5upm749hblntg0l5; Qs_lvt_168612=1596051377%2C1596218528; Hm_lvt_b68ec780c488edc31b70f5dadf4e94f8=1596051454,1596218532; Qs_pv_168612=3630842056868974600%2C4497225917431368000%2C90030305552911310%2C858826728169647000%2C1836863520579538200; Hm_lpvt_b68ec780c488edc31b70f5dadf4e94f8=1596218576','User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}

他的循环就可以直接开始写了,我大概看了一下大概7页就可以到收盘左右了,所以我结束就设置了8(前包后不包),也可以爬多一点看自己的需求,这个爬多的话就在之后整理的时候加判断就可以了,影响不大。

for i in range(1,8):q=requests.get('/news/get_realtime_news/yapi/ajax.html&page='+str(i),headers=headers)

其实到这里,是外面的大循环是算写完了的,我们去单个网站把爬取的规则写出来,最后套里面,就算爬到多页面了。

q=requests.get('/news/get_realtime_news/yapi/ajax.html&page=1',headers=headers)print(q.text)

观察他的text我们需要需要正则提取一下才可以做json解析,当然如果用正则的就可以直接开始了,不用考虑这个。

定位最前面有一个,最后面也有一个,中间就是我们需要提取的内容。

这就是正则提取的代码,后面的$是直接定位到最后的,中间的英文括号是正则输出的内容。

re.findall("{.*?:.*?,.*?:.*?,.*?:(.*?)}$",q.text)

但是用findall提的话是输出一个列表,但是列表的话,转json会报错:JSON对象必须是str、bytes或bytearray,而不是list。

所以我们需要转化为字符串形式再json解析,用json_ls赋值,这里如果括号没有标好的话,会报错:解析时意外的EOF,要特别注意一下。

json_ls=json.loads(''.join(re.findall("{.*?:.*?,.*?:.*?,.*?:(.*?)}$",q.text)))

解析后我们观察一下,大概这些内容是我们需要的,有时间,有标题,有详细消息,这些都是可以爬的有效果的,关联个股我没有爬,主要是遇到了问题没有解决,想了想没有那么重要。

json提取的时候,要对json解析后的文件每行解析遍历,用键值对对应的方法把需要的内容提出来。

date=[]#发布时间title=[]#外信息description=[]#内信息thmtags=[]#标签for p in range(len(json_ls)):title=title+[json_ls[p]['title']]description=description+[json_ls[p]['description']]date=date+[json_ls[p]['date']]thmtags=thmtags+[json_ls[p]['thmtags']]

编写字典输出数据框。

zd={'发布时间':date,'外信息':title,'内信息':description,'标签':thmtags}bg=pd.DataFrame(zd)bg

看这大概还是比较理想的,这个单网页就这样,非常简单。

5. 多网页就是把这些套到循环里头就ok了,这里就贴出完整代码就不一一讲解了,唯一不一样就是我把每一个json解析后的文件都叠加在一块最后一起遍历提取的。另外headers的命名也做了变化,加了时间休眠,其他小的方面都应该好理解。

import re,requests,time,pandas as pd,jsonh={'Cookie':'ycj_wafsid=wafsid_03bb4ad9ed1c211d7f77682688e9df5b; ycj_uuid=830f25a916ee843f1a71890230949c5b; ycj_from_url=aHR0cHM6Ly93d3cuYmFpZHUuY29tL2xpbms%2FdXJsPWFVZEk3T1VSNUM1VnVUcmhWdnZvSlkyT2tyRkV1d3FGcGpFYnN4alJMQlZLYk4wdG5FLXFvTEdKRjlTTTAxb3Imd2Q9JmVxaWQ9ZmQyNzgzZDcwMDAzNWZlZTAwMDAwMDA1NWYyMWNmMzE%3D; ycj_locate=aHR0cHM6Ly93d3cuYmFpZHUuY29tL2xpbms%2FdXJsPWFVZEk3T1VSNUM1VnVUcmhWdnZvSlkyT2tyRkV1d3FGcGpFYnN4alJMQlZLYk4wdG5FLXFvTEdKRjlTTTAxb3Imd2Q9JmVxaWQ9ZmQyNzgzZDcwMDAzNWZlZTAwMDAwMDA1NWYyMWNmMzE%3D; YUNSESSID=qm65k020oh5upm749hblntg0l5; Qs_lvt_168612=1596051377%2C1596218528; Hm_lvt_b68ec780c488edc31b70f5dadf4e94f8=1596051454,1596218532; Qs_pv_168612=3630842056868974600%2C4497225917431368000%2C90030305552911310%2C858826728169647000%2C1836863520579538200; Hm_lpvt_b68ec780c488edc31b70f5dadf4e94f8=1596218576','User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}json_ls=[]date=[]#发布时间title=[]#外信息description=[]#内信息thmtags=[]#标签for i in range(1,8):q=requests.get('/news/get_realtime_news/yapi/ajax.html&page='+str(i),headers=h)json_ls=json_ls+json.loads(''.join(re.findall("{.*?:.*?,.*?:.*?,.*?:(.*?)}$",q.text)))#截取json部分time.sleep(5)for p in range(len(json_ls)):title=title+[json_ls[p]['title']]description=description+[json_ls[p]['description']]date=date+[json_ls[p]['date']]thmtags=thmtags+[json_ls[p]['thmtags']]zd={'发布时间':date,'外信息':title,'内信息':description,'标签':thmtags}bg=pd.DataFrame(zd)

如果出现报错:期望值:第1行第1列(字符0)

就需要看一下是不是自己访问频繁导致的,我进去看了一下,把我恶心到了,要输入验证码,再访问就没有这个问题了。

判断

1.今天码字太累了,过两天闲下来了继续完善

总结

爬取网页的部分是8月29日写的第一稿

本内容仅为学习研究使用

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。