您的位置:首页 > 编程语言 > Python开发

python 爬虫爬取所有上市公司公告信息(三)

2017-10-05 13:22 302 查看
。,。数据源和爬取的方式我们已经确定,接下来我们构建数据的储存格式和进行爬取类的程序编写。

首先,为了方便调用,爬取的公告信息必须以对应的股票分类,这里我们使用股票的代码作为分类依据。一个股票代码文件对应该股票所有的公告信息。

但如果我们只用股票代码做简单的一层分类,文件也过大,并不方便调用。于是进一步将公告信息按年份与月份分类,形成三层数据结构。每一个月份为一个json文件,内涵该股票代码对应年月所有的公告信息。

由于后续分析需要,这里没有使用数据库存储,爬取后的数据以文件的形式分层保存在电脑中,需要时使用xpath调用。如600759/2015/2015-01,就对应了600759上市公司在2015年一月的

所有公告,在该json文件中以公告的发布日期为键,公告内容为值。

存储方式确定后,再来就是网页url排重的问题。

这里我选择了使用bloomfilter函数进行排重,将爬取过的网页url哈希化之后保存到dowmload.txt文件中,每次重新运行爬虫先读取文件中的md5码,然后加入到构建的bloomfilter中,每次有url的爬取请求先判断是不是已经在bloomfilter中了,如果没有则加入爬取的队列。

class CrawlBSF:
downloaded_urls = []
dum_md5_file = '文件路径'
bloom_download_urls = BloomFilter(1024*1024*16,0.01)
cur_queue = deque()

def __init__(self):
try:
self.dum_file = open(dum_md5_file,'r')
self.downloaded_urls = self.dun_file.readlines()
self.dum_file.close()
for urlmd5 in self.downloaded_urls:
bloom_download_urls.add(urlmd5[:-1])
except IOError:
print('file not found')

finally:
self.dum_file = open(dum_md5_file,'a')

上面的代码编写了CrawlBSF类的初始化函数,主要实现的功能是每次爬取开始前读取download文件中的md5码加入到bloomfilter中,注意最后要以附加写的方式再次打开download文件,以便加入后面爬取的url网址
def enqueueUrl(self,url):
if hashlib.md5(url).hexdigest() not in crawler.bloom_download_urls:
cur_queue.append(url)

def dequeuUrl(self):
try:
url = cur_queue.popleft()
return url
except:
return None

def close(self):
crawler.dum_file.close()

craweler类实例化之后,我们构建类中的进队,出队函数,在url进入爬取队列之前先判断是否已经在bloomfilter里面了,如果没有,则证明没有爬取过,将该url添加到爬取队列中,出队函数实现的功能是当调用抓取公告内容的函数时,传入爬取队列左端的url进行抓取。close()函数用来爬取完成后关闭download文件。
这样,我们公告爬取的类就基本构建完成了,实现爬取功能时先将其实例化为crawler对象。

下面我们开始编写爬取内容的函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐