python爬虫類はすべての上場企業の公告情報を取得する(五)

3263 ワード

.,.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.Webページの投稿内容をキャプチャする
2.キャプチャした公告内容を公告日に対応させmodel辞書に保存する
3.get_をpage_contentが登ったページurlがハッシュ化されdownloadに加入する.txtファイル内
4.1日に複数の公告がある場合、公告の内容を合わせて、1つの日付に対応する.
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+"
")
ここで注意すべき点は2つあります.まず、同じ日に複数の公告を処理することです.筆者が採用した方法は、日付がmodelのキーにすでに存在するかどうかを判断することです.すでに存在する場合は、当日の別の公告を登ったことを証明します.new_を定義します.noticeは前の公告と今登っているnoticeに等しく、new_noticeはその日付に値を割り当てます.これにより,その日付の公告内容を呼び出すと,その日に発表されたすべての公告内容が得られる.
2つ目は、抽出が完了した後に保存する場合、urlをutf 8に符号化することに注意します.そうしないと、ファイルにハッシュ化できません.
このコードはデータのフォルダ構造を作成し、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の大きさがあると予想している.