【任务目标】
调通光大证券中文云系统
【任务进度】
依据Github光大证券中文云系统开源的说明文档,应该是分爬虫模块、检索模块、统计模块、关键词频模块和关键词网络模块,是一个整体非常庞大的系统。现在的进度是,深入研究了爬虫模块。爬虫模块主要作用在于将股票论坛、个股新闻、研究报告三个网站的网页 数据通过网页解析的方式将文本内容爬下来,用于之后模块的文本挖掘。爬虫模块将爬到的文本数据以【日期 + 股票代码】为单位存至相应的TXT 文本文件当中,同时将文本文件所在的位置以及其他相关信息写入数据库。
对于每个数据源,都有一个独立的程序进行网页爬虫,他们分别是:
GetGuba_pylucene.py 股票论坛网页爬虫
GetMbReport_pylucene.py 研究报告网页爬虫
GetSinaNews_pylucene.py 个股新闻网页爬虫
重点目前研究了个股新闻网页爬虫。由于该系统已有一定的年代,采用python2.7版本编写,已经不能再python 3以上的版本中运行,因为语法有一定程度的变动,且该模块调用了很多包。所以前期花了很长的时间在配置环境上。其次,由于个股新闻网页爬虫与数据库直接相连,而原本光大证券的数据库肯定不可能给出,也无法再度连接。不得不去揣摩每张表的样貌,有哪些指标,从而在自己的数据库里去建表模拟,否则根本也无法运行。最后,要看懂代码,并对相关部分进行修改,调试,方便运行。
目前的进展是,我附上的GetSinaNews_pylucene.py这个代码已经可以直接运行,连接读取数据库也成功。但是无法出现Technical说明文档中,存储text文件的效果。经查证,似乎是调用的方式不对,GetSinaNews_pylucene.py似乎是后台文件被调用,要直接运行前端的某个文件,然而前端该文件似乎还调用了整个项目其他py代码,很复杂,因此搁置,未能调通。
具体的代码阅读理解,在注释中说明。
#coding=GBK
import Queue #一个队列的包,与thread配合使用,多线程运行,保证速度
import threading #多线程
#from pymmseg import mmseg ##load seperateword tool
#mmseg.dict_load_defaults() ##load seperateword default dictionary
#mmseg.dict_load_words('stockname.dic') ##load special stockname and stock numberdictionary
import urllib2 #爬虫抓取网页内容常用的一个包,抓取下来后,利用包中自带的一系列函数,对内容进行类似文档一样的处理和调用
import time
import re
from bs4 import BeautifulSoup #beatifulsoup一个爬虫解析网页的包
from urlparse import urljoin
import pyodbc #连接远程sql server数据库的包
#import MySQLdb
import string
import sys
reload(sys)
sys.setdefaultencoding('gbk') #对中文字符进行的编码处理
originalURL="http://money.finance.sina.com.cn/corp/view/vCB_AllNewsStock.php?symbol=sh600418&Page=1" #原始网页
queue = Queue.Queue()
out_queue = Queue.Queue()
hosts=[]
conn1=pyodbc.connect("DRIVER={SQL Server};SERVER=;DATABASE=;UID=;PWD=") #连接数据库
cur=conn1.cursor() #游标
cur.execute("select s_info_code,market from ggg") #where class like 'A%' and closedate is Null order by code
#读取所有股票编号及所在市场
result=cur.fetchall()
stockCodes=[]
for i in range(len(result)):
if result[i][1]=='SZ'.encode('GBK'):
stockCodes.append('sz'+result[i][0])
if result[i][1]=='SH'.encode('GBK'):
stockCodes.append('sh'+result[i][0])
#将股票代码,市场重新存入stockCodes中,有一个转码,不再是GBK了
for stock_code in stockCodes:
oriURL=originalURL[:-15]+stock_code+originalURL[-7:]
print oriURL
#time.sleep(1)
hosts.append([oriURL,stock_code[2:]])
#替换原始网址中的symbol=的值,从而形成新浪财经各个编码股票的网址 存入host格式是:网址+股票编码
class ThreadUrl(threading.Thread):
def __init__(self, queue, out_queue):
threading.Thread.__init__(self)
sel