网页新闻抓取(《教你用Python进阶量化交易》专栏(二):扩展篇)
优采云 发布时间: 2022-04-17 17:41网页新闻抓取(《教你用Python进阶量化交易》专栏(二):扩展篇)
欢迎大家订阅《用Python教你进阶量化交易》专栏!为了给大家提供一个更轻松的学习过程,笔者在栏目内容之外还陆续引入了一些笔记,以帮助同学们学习本栏目内容。目前上线的扩展链接如下:
为了把栏目中零散的知识点贯穿始终,笔者在栏末“自制量化交易工具”小节中分享了之前制作的量化交易小工具的简化版。希望大家可以通过调试代码掌握相关信息。知识。
目前已经移植到站外文章第九部分的Python3.7x版本。接下来我们会在这个版本的基础上逐步完善这个工具,让专栏的读者不仅可以通过小工具掌握专栏的相关知识点,还可以在自己的量化交易中使用工具股票。
量化交易策略的研究主要涵盖微观和宏观两个方面。微观方面更多是以市场价格、交易头寸等基本信息为研究对象。技术指标是通过算法计算出来的,然后根据技术指标的变化来构建。交易模型。宏观方面是开发基于更多市场信息的交易模型,如以CPI、PPI、货币发行等宏观经济指标为研究对象构建交易模型;或使用数据挖掘技术挖掘可能导致市场异常的新闻事件。波动性事件获得交易机会。
在这篇笔记中,我们先梳理一下可以获取股票信息的网站,然后介绍如何在我们的GUI工具上展示抓取到的股票信息。
证券从业人员网站包括上海证券交易所、深圳证券交易所、中国证监会、证券业协会;
行业资讯网站有慧聪、阿里、万德;
知名股票论坛:点金投资之家、分享世界、MACD股市、东方财富网股吧、和讯股吧、创世论坛。
接下来,我们使用爬虫来爬取东方财富网股票论坛的帖子内容。
当我们点击第2页和第3页时,我们检查URL是:,002372_2.html, ,002372_3.html,所以论坛URL的模式是,002372_%d.html中表单,规则比较简单,%d是论坛的页码,但是这个表单是评论时间排列的URL。如果按发帖时间排列,则为002372,f_%d.html。
读取网页内容的关键代码如下:
html_cont=request.urlopen(page_url).read()
需要注意的是,在Python2中有urllib、urllib2和urlparse,但是在Python3中,这些都集成到了urllib中。Python2中urllib和urllib2的内容集成到urllib.request模块中,urlparse集成到urllib.parse模块中。在Python3中,urllib还收录了response、error、robotparse等各*敏*感*词*模块。
获取到的HTML代码内容如下:
得到 HTML 代码后,开始解析 HTML 代码。该帖由两部分组成,一部分为《财经评论》或《东方财富网》发布的公告或官方消息,另一部分为散户发布的讨论帖,如下:
前一篇文章的URL是,cjpl,902659513.html,后一篇文章的URL是,002372,902629178.html,这两个URL都可以在HTML文件的内容中找到,如下所示:
因此,《财经评论》、《东方财富网》或散户发布的帖子的主要特点是/news。我们使用正则表达式进行删除和选择,实现代码如下,
模式 = pile('/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 来抓取单个帖子的标题内容。代码如下:
对于 news_comment_urls 中的 comment_url :
whole_url = parse.urljoin(page_url, comment_url)
post_urls.add(whole_url)
返回 post_urls
单个帖子的爬取内容包括帖子的发帖时间、作者和帖子标题三部分,如下:
我们可以通过正则表达式进行提取,其中在组合正则表达式时,需要考虑HTML代码中是否存在重复匹配的关键字。作者和帖子标题的常规代码如下。关键词mainbody和zwcontentmain在正文中只出现一次,匹配度高。
com_cont = 桩(r'
.*?zwconttbn.*?(.*?).*?.*?"zwconttbt">(.*?)
.*?social clearfix',re.DOTALL)
发布时间的正则代码如下,分两步逐步清晰提取时间。由于搜索是扫描字符串以找到RE匹配的位置,因此添加group()返回匹配的字符串。
pub_elems = re.search('
',html_cont2).group()
#