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

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

2017-10-05 15:00 253 查看
。,。现在我们进过for循环,已经获取到了每一个股票代码在2015年至今所有的公告内容连接和公告日期,且是以(日期,公告内容url)元组的形式加入到了爬取队列中,

在最内层循环结束后,我们编写程序实现多线程和储存公告内容的功能。

公告最终在对应的json文件里是以键值对的形式存在的,日期则是以后调用对应公告内容的键。

model = {}
while True:
url = crawler.dequeue()
if url is None:
for t in threads:
t.join()
break
else:
while True:
for t in threads:
if not t.is_alive():
threads.remove(t)
if len(threads) >= maxthreads
time.sleep(CRAWL_DELAY)
continue
try:
t =threading.Thread(target = get_page_content,name=None,args =url,stock,model)
threads.append(t)
t.setDaemon(True)
t.start()
time.sleep(CRAWL_DELAY)
break
except:
print("进入不了线程")

内层循环结束后,我们执行上面的程序。
首先定义了model字典来储存信息,然后开始while循环,从爬取队列中取出url,首先查看是否已经将队列中的连接爬取完成,如果爬取完了则等待线程池中的线程运行完毕进入下一循环,如果队列中还有url,则进入else语句块,先移除队列里面已经完成的线程,然后判断线程是否超过了我们设定的最大限制,如果线程池中线程已经到了我们设定的阀值,则等待时间,进入下一循环。如果没有到达线程数量的阀值,则加入到线程池中,将url信息,stock信息,model,传入到我们编写的get_page_content函数中进行处理。

我们先明确get_page_content函数所要实现的功能。

1.抓取网页的公告内容

2.将抓取到的公告内容与公告日期对应,储存到model字典中

3.将get_page_content爬取过的网页url哈希化之后加入到download.txt文件中

4.针对一天多个公告的情况,将公告中的内容加起来,对应一个日期。

5.根据前面设计的数据结构创建文件

开始编写代码

def get_page_content(url,stock,model):
stock_page = etree.HTML(get_text(url[1]))
notice = stock_page.xpath('//div[@class="detail-body"]/div[1]')[0].text

path = '/home/gupiao/%s/%s'%(stock,url[0][:4])
isExist = os.path.exists(path)

if not isExist:
os.makedirs(path)
print(path+“创建成功”)

if url[0] in model.keys():
new_value = model[url[0]] + notice
model[url[0]] = new_value
else:
model[url[0]] = notice

mdurl = url[1].encode('utf8')
new_md5 = hashlib.md5(mdurl).hexdigest()
crawler.dumd5_file.write(new_md5+"\n")这里有两个需要注意的地方,首先是对同一天多个公告的处理,笔者采用的方法是先判断日期是否已经存在于model的键中,如果已经存在,证明已经爬取过当天的另外一条公告,我们定义new_notice 等于之前的公告加现在爬取的notice,将new_notice赋值给该日期。这样调用该日期的公告内容时就能拿到当天发布过的所有公告内容。
二是在爬取完成之后保存时,注意要将url先编码为utf8,否则无法哈希化写入到文件中。

这段代码创建好了数据的文件夹结构,model中也储存了该股票所有的日期和公告内容信息。

我们接下来实现文件按月份分类储存为json文件的功能收尾。

for talk_time in model.keys():
with open('/home/gupiao/%s/%s/%s.json'%(stock,talk_time[:4],talk_time[:7]),'a',encoding='utf8') as json_file:
infodict = {}
infodice[talk_time] = model[talk_time]
json.dump(infodict,json_file,ensure = Flase)
print(stock+"完成")

这里为了将不同月份的公告分开,笔者先定义了一个infodict字典,然后将每个公告日期遍历,将相同日期的model值赋给infodict,将infodict写入对应的json文件。
爬虫大致就完成了,笔者现在还在运行程序中,预计爬取完成后文件有十几个G的大小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: