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

。,。数据源和爬取的方式我们已经确定,接下来我们构建数据的储存格式和进行爬取类的程序编写。

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

但如果我们只用股票代码做简单的一层分类,文件也过大,并不方便调用。于是进一步将公告信息按年份与月份分类,形成三层数据结构。每一个月份为一个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对象。

下面我们开始编写爬取内容的函数。



没有更多推荐了,返回首页