欢迎大家订阅《Python实战-构建基于股票的量化交易系统》小册子,小册子会陆续推出与小册内容相关的专栏文章,对涉及到的知识点进行更全面的扩展介绍。本篇专栏为小册子内容的加推篇!!!

前言

量化交易策略的研究主要涵盖了微观和宏观这两个方面,微观方面更多地是从市场价格和成交持仓这些基础信息为研究对象,通过算法计算出技术指标,再从技术指标的变化上构建交易模型。宏观方面则是基于更多的市场资讯开发交易模型,比如从CPI、PPI、货币发行量这些宏观经济指标为研究对象构建交易模型;或者是利用数据挖掘技术从新闻事件中挖掘出可能造成市场异常波动的事件,从而获得交易的时机。

我们知道知名股票论坛有点金投资家园、股天下、东方财富网股吧、和讯股吧、创幻论坛、MACD股市等等,笔者用的比较多的是东方财富网股吧。在小册子中我们以爬取东方财富网行业板块当日的行情数据为案例,介绍了网络爬虫的原理和方法,本节我们再介绍下如何爬取东方财富网股吧帖子的内容。

解析股吧帖子URL

首先通过浏览器访问伟星新材的股吧,查看该网页的URL为:http://guba.eastmoney.com/list,002372.html,网页内容如下图所示:

当我们点击第2页、第3页后,查看下当前的URL分别为:http://guba.eastmoney.com/list,002372_2.html,http://guba.eastmoney.com/list,002372_3.html,因此得到了个股股吧URL的规律为http://guba.eastmoney.com/list, 002372_%d.html形式表示,其中的规律比较直白,%d为论坛第几页,不过这个形式是按评论时间排列的网址,如果按发帖时间的排列网址是http://guba.eastmoney.com/list,002372,f_%d.html。

股吧的帖子由两部分组成,一部分为“财经评论”或“东方财富网”发布的公告或官方消息,另一部分为散户发布的讨论帖子,如下图所示:

前者的帖子URL为http://guba.eastmoney.com/news,cjpl,902659513.html,后者的帖子URL为http://guba.eastmoney.com/news,002372,902629178.html,两者的URL都可在当前该股股吧HTML文件内容中搜寻到,如下所示:

因此“财经评论”、“东方财富网”或者散户发布的帖子,主要的特征为/news,在实现上我们可以先爬取到股吧HTML内容,然后通过正则表达式来筛选得到帖子的URL。

关于读取网页HTML内容的关键代码我们已经在小册子《爬虫方式获取行业板块数据》一节中具体介绍过。需要注意的是Python2的urllib、urllib2和urlparse,已经在Python3中全部被整合到了urllib中,其中Python2的urllib和urllib2中的内容整合为urllib.request模块,urlparse整合为urllib.parse模块。 获取到HTML代码部分内容如下:

正则表达式筛选帖子URL,采用了re.compile和re.findall,实现代码如下,

pattern = re.compile('/news\S+html',re.S)

news_comment_urls = re.findall(pattern, html_cont.decode('utf-8')) # 非空白字符N次

"""

['/news,cjpl,902659513.html', '/news,cjpl,902684967.html',

'/news,cjpl,902602349.html', '/news,cjpl,902529812.html',

'/news,cjpl,857016161.html', '/news,002372,902629178.html',

'/news,002372,902557935.html', '/news,002372,902533930.html',

'/news,002372,902519348.html', '/news,002372,902468635.html',

'/news,002372,902466626.html', '/news,002372,902464127.html',

......

'/news,002372,901168702.html', '/news,002372,901153848.html']

"""

复制代码

其中正则表达式的\S+表示匹配多次非空白字符,然后使用findall函数找到匹配的所有字符串,并把它们作为一个列表返回。

然后是使用urljoin方法把整个url拼接好用于爬取单个帖子的标题内容,关键代码如下所示:

for comment_url in news_comment_urls :

whole_url = parse.urljoin(page_url, comment_url)

post_urls.add(whole_url)

return post_urls

复制代码

创建爬虫URL队列

接下来我们把所有需要爬取的股吧页以及每页中的帖子的URL以队列的方式进行管理。Python中存储序列的类型有list、tuple、dict和set,它们之间的区别和特点简单的说:tuple不能修改其中的元素;set是无序集合,会自动去除重复元素;list是有序的集合;dict是一组key和value的组合。此次我们选择list作为队列的存储类型。

创建target_url_manager类,该类包含以下几个方法:

add_page_urls:解析股吧单页的HTML代码,获得该页的帖子URL

add_pages_urls:构建队列,讲全部页的帖子URL建立为二维list格式

has_page_url:判断队列是否为空

get_new_url:每次推出一页的帖子URL

创建队列形式如下所示:

"""

[['http://guba.eastmoney.com/news,002372,899860502.html',

'http://guba.eastmoney.com/news,002372,899832598.html',

......

'http://guba.eastmoney.com/news,002372,899947046.html',

'http://guba.eastmoney.com/news,002372,899897958.html'],

['http://guba.eastmoney.com/news,cjpl,903685653.html',

'http://guba.eastmoney.com/news,cjpl,903679057.html',

......

'http://guba.eastmoney.com/news,002372,901739862.html',

'http://guba.eastmoney.com/news,002372,901727241.html']]

['http://guba.eastmoney.com/news,cjpl,903685653.html',

'http://guba.eastmoney.com/news,cjpl,903679057.html',

......

'http://guba.eastmoney.com/news,002372,901739862.html',

'http://guba.eastmoney.com/news,002372,901727241.html']

"""

复制代码

完整代码可见小册子《加推篇!爬虫抓取东方财富网股吧帖子》。

解析股吧帖子内容

单个帖子爬取的内容包括三部分,帖子发表时间、作者及帖子标题,如下所示:

我们可以通过正则表达式进行提取,其中在组合正则表达式时,需要考虑到HTML代码中是否有重复的匹配关键字。作者和帖子标题正则代码如下,mainbody、zwcontentmain这些关键字在文本中仅出现一次,匹配程度较高。由于网站HTML代码的改动,表达式需要经常调整。

关键代码如下所示:

com_cont = re.compile(r'

.*?zwconttbn.*?(.*?).*?.*?"zwconttbt">(.*?)

.*?social clearfix',re.DOTALL)

复制代码

发布时间正则代码如下,分两步逐渐明晰的去提取时间,由于search是扫描字符串找到这个 RE 匹配的位置,因此增加group()返回匹配字符串。

pub_elems = re.search('

.*?

',html_cont2).group()

#

发表于 2020-02-11 09:54:48 东方财富Android版

pub_time = re.search('\d\d\d\d-\d\d-\d\d',pub_elems).group()

#2020-02-06

复制代码

另外,论坛帖子与当前的股价走势有时间联系,太早的帖子对现在无参考作用,因此需要删选近期的帖子。我们可以对时间进行判断,只有一个月之内发布的帖子才进行爬取并存储。获取今天的日期使用datetime.now().date(),然后与爬取的帖子时间日期比较,timedelta可在日期上做天days时间计算,但需要将时间转换为时间形式。

实现部分关键代码如下所示:

time_start=datetime.now().date() # 获取日期信息

dt = datetime.strptime(pub_time,"%Y-%m-%d") # 字符串转时间格式

datetime.date(dt)+timedelta(days=30)

复制代码

完成了单个帖子的内容爬取之后,我们采用迭代方法把全部帖子爬取一遍。我们通过两层迭代方法,第一层为页数,第二层为一页的股吧帖子数,将每个帖子的URL存储在列表中,通过迭代的方式一个个爬取帖子的内容。

实现部分关键代码如下:

while self.target_page.has_page_url():

new_urls = self.target_page.get_new_url() # 获取每个帖子的URL地址队列

for url in new_urls:

……

复制代码

当我们爬取时发现某个帖子不存在,出现爬取信息异常时,可使用try...except...进行异常处理。

最终爬取到的帖子内容如下图所示:

完整代码可见小册子《加推篇!爬虫抓取东方财富网股吧帖子》。

帖子内容存储为txt

我们可以将爬取信息写到txt文件中,打开方式的代码实现如下所示,a+为在文本尾部追加写入,而不是覆盖写入,codecs.open这个方法可以指定编码打开文件,而使用Python内置的open打开文件只能写入str类型。

f=codecs.open(name,'a+','utf-8')

复制代码

此处我们创建一个output_txt类,该类中我们会分别实现打开文件、写文件和关闭文件这几个方法。代码如下所示:

class output_txt(object):

def open_txt(self):

name = "stock_cont.txt"

try:

f = codecs.open(name, 'a+', 'utf-8')

except Exception as e:

print("NO TXT")

return f

def out_txt(self, f_handle, conts):

try:

print("cont",conts)

f_handle.write(conts)

except Exception as e:

print("NO FILE")

def close_txt(self, f_handle):

f_handle.close()

复制代码

接下来就可以一边爬取帖子内容,一边把内容写入到txt文件中。实现关键代码如下所示:

file_txt = self.outputer.open_txt()

while self.target_page.has_page_url():

new_urls = self.target_page.get_new_url() # 获取每个帖子的URL地址队列

for url in new_urls:

if time_start <= (self.downloader.find_time(url)+timedelta(days=30)):

self.outputer.out_txt(file_txt, self.downloader.download(url))

true_time = true_time + 1

else:

error_time = error_time + 1

self.outputer.close_txt(file_txt)

复制代码

写入txt文件的效果如下所示:

总结

本小节我们通过爬虫方式得到股吧帖子中的各种内容,那么这些内容对于我们来说有什么意义吗?我们发现总有些人一直在唱空,制造恐慌的情绪,不过我们可以通过分类分析下这些空头评论和股价的涨跌有没有什么关联,是不是有写ID是专门来唱空的呢?感兴趣的朋友们可以试试!

python中plguba_Python量化交易进阶讲堂-爬虫抓取东方财富网股吧帖子相关推荐

  1. Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储(转)

    Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...

  2. python抓取数据库数据_Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储...

    Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...

  3. python爬虫实现股票数据存储_Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储!...

    Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...

  4. Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  5. python爬虫爬取股票软件数据_Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储(转载)...

    完整代码 实际上,整个事情完成了两个相对独立的过程:1.爬虫获取网页股票数据并保存到本地文件:2.将本地文件数据储存到MySQL数据库.并没有直接的考虑把从网页上抓取到的数据实时(或者通过一个临时文件 ...

  6. MySQL 怎么插入10天前的日期_Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储!...

    Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...

  7. 利用python爬取东方财富网股吧评论并进行情感分析(一)

    利用python爬取东方财富网股吧评论(一) python-东方财富网贴吧文本数据爬取 分享一下写论文时爬数据用到的代码,有什么问题或者改善的建议的话小伙伴们一起评论区讨论.涉及内容在前人的研究基础之 ...

  8. 知识星球《玩转股票量化交易》之 爬虫爬取股票数据

    量化交易是一个多技术综合的项目,学习完书籍<Python股票量化交易从入门到实践>我们再次升级学习的内容--知识星球<玩转股票量化交易> 在星球中我们会深入分享包括Python ...

  9. Python爬虫爬取东方财富网的股票信息

    简单的Python爬虫应用 目标:爬取东方财富网的股票信息 1.先找到要爬取的网页 2.第二步开始爬取信息 2.1 通过requests获取网页信息 2.2再通过BeautifulSoup解析: 2. ...

最新文章

  1. IOS开发基础之微博项目第1天-OC版
  2. 因沉迷游戏,他被清华北大辞退2次,不料改名后高考再次进清华!
  3. Mac 上无法使用netstat的-p参数
  4. 全国职称计算机考试教程,全国职称计算机考试专用教程:Excel 2003 中文电子表格(附光盘)...
  5. JAVA读、写EXCEL文件
  6. Google IO 2017为我们带来了什么
  7. Bailian2940 求和【进制+迭代】
  8. 【NOIP2014】【Luogu2118】比例简化(枚举)
  9. Java设计模式(四)——再谈观察者模式
  10. Atitit mybatis返回多个数据集总结 目录 1.1. 配置handleResult接受,但是只有第一个select语句的结果 1 2. 配置resultMap ok 1 2.1. 调
  11. 测试:如何选择合适的正交表
  12. 利用poi3.8中SXSSFWorkbook实现大数据量导出excel
  13. pgsql截取字符串函数_postgresql——字符串函数
  14. 化工行业ERP管理系统丨外贸软件
  15. Beer Barrels
  16. 【产品功能】弹性网卡支持私网多IP
  17. Git(2)-Git常用的操作和概念
  18. 国内常用公共DNS服务器、各省运营商DNS服务器汇总 1
  19. 寒假学习打卡第一篇文章-----numpy的学习
  20. 推荐5个超实用的神器网站

热门文章

  1. java nodelist.item_XPath NodeList顺序(Java)
  2. Python面试题解析之前端、框架和其他
  3. Linux进程间通信详解
  4. powerbi中的earlier函数
  5. Red Hat Enterprise Linux 7.2
  6. HTML5特别篇——代码规范(2)
  7. Python-Django毕业设计航空订票系统(程序+Lw)
  8. 【论文翻译】Fully Convolutional Networks for Semantic Segmentation_2
  9. 在Xcode中配置Python 并支持input
  10. 小白都能懂的 玩转docker系列之 Docker网络详解(超详细)