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

。,。现在我们进过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的大小。

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