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对象。
下面我们开始编写爬取内容的函数。
首先,为了方便调用,爬取的公告信息必须以对应的股票分类,这里我们使用股票的代码作为分类依据。一个股票代码文件对应该股票所有的公告信息。
但如果我们只用股票代码做简单的一层分类,文件也过大,并不方便调用。于是进一步将公告信息按年份与月份分类,形成三层数据结构。每一个月份为一个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对象。
下面我们开始编写爬取内容的函数。
相关文章推荐
- python 爬虫爬取所有上市公司公告信息(二)
- python 爬虫爬取所有上市公司公告信息(四)
- python 爬虫爬取所有上市公司公告信息(一)
- python 爬虫爬取所有上市公司公告信息(五)
- Python3爬虫实战:爬取大众点评网某地区所有酒店相关信息
- Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
- Python爬虫从入门到放弃(十九)之 Scrapy爬取所有知乎用户信息(下)
- Python3爬虫:爬取大众点评网北京所有酒店评分信息
- python爬虫抓取豆瓣所有恐怖片信息(利用多线程和构建免费ip代理池)
- Python实现人人网爬虫,爬取用户所有状态信息。
- Python爬虫从入门到放弃(十九)之 Scrapy爬取所有知乎用户信息(下)
- Python爬虫从入门到放弃(十八)之 Scrapy爬取所有知乎用户信息(上)
- python爬虫-模拟登陆新浪微+博爬取感兴趣人的所有信息
- python简单应用!用爬虫来采集天猫所有优惠券信息,写入本地文件
- Python爬虫——4.5urllib2和xpath爬取前程无忧网招聘信息
- Python函数版学生信息管理系统、任意(100-200,200-300)区间内的所有素数
- Python爬虫(三):爬取猫眼电影网经典电影TOP100信息并存入本地Markdown文件(下)
- [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)
- Python爬虫项目--爬取自如网房源信息
- Python 网络爬虫 004 (编程) 如何编写一个网络爬虫,来下载(或叫:爬取)一个站点里的所有网页