所谓内幕信息,是指证券交易活动中,涉及公司的经营、财务或者对该公司证券的市场价格有重大影响的尚未公开的信息。
内幕信息所具备的三大特质。
1、是该信息所在集体,内部运作人员所知悉的信息。
2、是该信息所在集体,尚未对外公开的信息。
3、是对于信息所在集体或行业具备商业价值的信息。
本文思路:通过网络爬虫获取贴吧信息,进行智能提取疑似的内幕信息
工具:PYTHON
目标:东方财富贴吧
源码如下:
import requests
import re
import time
from bs4 import BeautifulSoup
import io
import sys
# 抓取网页的通用框架,获取页面的内容
def getHtml(url):
try:
r = requests.get(url, timeout=30)
# 状态码不是200就发出httpError的异常
r.raise_for_status()
# 获取正确的编码格式
# r.encoding=r.apparent_encoding
r.encoding = "utf-8"
# 打印内容
return r.text
except:
return "wrong!"
def get_author(url):
# 将网页内容格式化利用bs4库
authorsoup = BeautifulSoup(getHtml(url), 'lxml')
# 获取所有的li标签属性为 j_thread_list clearfix,用列表接收
divTag = authorsoup.find('div', attrs={"id": "mainlist"}).text.strip()
s = int(re.sub("\D", "", divTag))
if s<magic_comment:
return True
else :
return False
# 分析贴吧帖子的html文件,整理信息,保存问列表文件中
def get_content(url):
# 初始化一个列表来保存所有的帖子信息
contents = []
# 获取网页的内容
html = getHtml(url)
# 将网页内容格式化利用bs4库
soup = BeautifulSoup(html, 'lxml')
# 获取所有的li标签属性为 j_thread_list clearfix,用列表接收
divTags = soup.find_all('div', attrs={"class": "articleh normal_post"})
# 循环这个内容li集合
for div in divTags:
# 将爬取到了每一条信息。保存到字典里
content = {}
tempo = ""
# 将异样抛出,避免无数据时,停止运
try:
# 标题
content['title'] = div.find('span', attrs={"class": "l3 a3"}).text.strip() # .strip() 翻译为中文
########### 正则表达式搜索关键字符
m = re.search(target,content['title'])
d = re.search(gulu, content['title'])
if m == None or d != None:
continue
########### 按帖子编号形成索引
# 获取标题连接
tempo = div.find('span', attrs={"class": "l3 a3"}).find('a').get('href')
content['index'] = tempo[13:22]
# 如果索引不是9位数字,跳出本次循环
if content['index'].isdigit() == False:
continue
content['link'] = link + tempo
########### 获取其他信息
# 作者
content['author'] = div.find('span', attrs={"class": "l4 a4"}).text.strip()
# 评论
content['responseNum'] = div.find('span', attrs={"class": "l2 a2"}).text.strip()
# 创建时间
content['creatTime'] = div.find('span', attrs={"class": "l5 a5"}).text.strip()
########### 如果不是本月的帖子,直接过滤
n = re.search(month, content['creatTime'])
if n:
print(n.group(0))
else:
continue
########### 发帖人发帖数量是否符合要求
# 获取发帖人信息
content['authorlink'] = div.find('span', attrs={"class": "l4 a4"}).find('a').get('href')
if get_author(content['authorlink']) == False:
continue
# 将字典加入到列表中
contents.append(content)
except:
print('出问题')
# 返回数据
return contents
def writeTxt(content,i):
# 这里不能写成 f=open("data.txt",'a+')否则会乱码,设置沉utf-8的格式,与getHtml(url):中的encoding一致
f = open("data"+str(i)+ txt, 'a+', encoding='utf-8')
for c in content:
f.write('索引: {} \t 标题: {} \t 链接:{} \t 回复数量: {} \t 发帖人:{} \t 发帖时间:{} \t 发帖人信息:{}\n'.format(
c['index'], c['title'], c['link'], c['responseNum'], c['author'], c['creatTime'], c['authorlink']))
def main(url):
url_list = []
# 将所需要爬去的url放到列表中
for i in range(stock_min, stock_max):
for j in range(page_min, page_max):
content = get_content(url + str(i) + "_"+ str(j) + last )
if content:
writeTxt(content,i)
else:
continue
url = "http://guba.eastmoney.com/list,"
cont = "http://guba.eastmoney.com/"
link = "http://guba.eastmoney.com"
last = ".html"
txt =".txt"
stock_min = 600001
stock_max = 602000
magic_comment = 5
page_min = 1
page_max = 10
month = time.strftime("%m", time.localtime()) +'-'
target='发财|上车|赚钱|机会|收购|重组|停牌|速买|满仓'
gulu = '我|你|预感|感觉|吗|?|留下|再见|走'
main(url)
方案思路:
(1)网络爬虫东方财富贴吧,获取最近的股票帖子,对标题进行敏感词定位,诸如“重组”,“上车”,“发财”等关键词的均进行帖子临时保存为A数据
(2)对A数据的发帖人信息进行二次网络爬虫,爬取发帖人发帖数量(发帖量越少则表明该帖子更靠近内幕),过滤的数据为B
(3)对B数据的标题进行二次过滤,排除诸如“预感”,“感觉”,“?”,“再见”等关键词的帖子,将最终数据保存为文本
(4)对文本进行发帖时间与第二天股票走势进行匹配(目前人工判断)