マルチスレッドのpython爬虫類の使用

インポートのスレッド
インポート時
インポート要求
輸入JSON
以下からのキューのインポートキュー
 からlxmlのインポートetree


クラスCrawlThread(threading.Thread):
     「」「クロールスレッドのドキュメンテーション文字列」 『』

    デフ__init __(自己、名前、page_queue、data_queue):
        スーパー(CrawlThread、自己).__のinit __()
        self.name = 名前
        self.page_queue = page_queue
        self.data_queue = data_queue
        self.url = ' http://www.ifanjian.net/latest- {} ' 
        self.headers = {
             " ユーザエージェント"" はMozilla / 5.0(Windows NTの10.0; Win64の、のx64)のAppleWebKit / 537.36(KHTML、 Gecko)クローム/ 75.0.3770.100サファリ/ 537.36のように
        }

    デフ(自己)を実行します。
        印刷(' %S -------スレッドを開始する'self.name)
         ながら、真:
            #決定したときに取得スレッドの終了
            もしself.page_queue.empty():
                 ブレーク
            #キューからページを削除します
            ページ = self.page_queue。取得()
            (印刷=== ===スタート%sの取得したページデータのページ)
            #スプライシングのURL、送信要求
            URL = self.url.format(ページ)
            time.sleep(1 
            R =要求。取得(URL、ヘッダ= self.headers)
            #応答内容はdata_queueに保存されています
            self.data_queue.put({
                " インデックス" :STR(ページ)、
                 " テキスト" :r.text
            })
            印刷(=== ===両端%sの取得したページデータのページ)

        印刷(' %S -------スレッド終了'self.name)


クラスParserThread(threading.Thread):
     「」「解析スレッドのドキュメンテーション文字列」 『』

    デフ__init __(自己、名前、data_queue、FP、ロック):
        スーパー(ParserThread、自己).__のinit __()
        self.name = 名前
        self.data_queue = data_queue
        self.fp = FP
        自己。ロック = ロック

    デフ(自己)を実行します。
        印刷(%S -------スレッドを開始するself.name)
         しばらく真:
             試してみます
                #1 data_queueからデータを取得します
                データ = self.data_queue。取得(真、10 
                印刷(" === ===分析データスタートページ%sの"%データ[ " インデックス" ])
                #解析内容
                self.parse_content(データ[ ' テキスト' ])
                印刷(" === ===分析データスタートページ%sの"%データ[ " インデックス" ])
            例外を除きます:
                ブレーク

        印刷(' %S -------スレッド終了'self.name)

    #解析内容
    デフparse_content(自己、データ):
        ツリー = etree.HTML(データ)
        #まず李を見つける、その後、李からすべてのタイトルや写真を見つけます
        li_list = tree.xpath(" // UL [クラス@ = 'CONT-リスト'] /李" 
        アイテム = []
         のためのLi li_list。
            #タイトルを取得
            タイトル = li.xpath(" .// H2 [@クラス= '続き-リストタイトル'] / /テキスト()")[ 0 ]
            ピクチャ#を取得
            img_url = li.xpath(
                 " .//div[contains(@class,'cont-list-main')]//img/@data-src " 
            アイテム = {
                 ' タイトル' :タイトル、
                 ' 画像リンク' :img_url
            }
            items.append(アイテム)

        ファイルへの書き込み#
        自己。ロック.acquire()
        self.fp.write(json.dumps(項目、ensure_ascii =偽)+ ' \ n個' 
        自己。ロック)(.release


#取得スレッドを格納するために使用
g_crawl_list = []
#構文解析スレッドを格納するために使用
g_parser_list = []


デフcreate_crawl_thread(page_queue、data_queue):
    crawl_names = [ ' 取得スレッド1 '' 取得スレッド2 '' 取得スレッド3 ' ]
     のための名前crawl_names。
        tcrawl = CrawlThread(名前、page_queue、data_queue)
        g_crawl_list.append(tcrawl)


デフ(data_queue、FP、create_parser_thread ロック):
    parse_names = [ ' 解析スレッド1 '' 分析スレッド2 '' 分析スレッド3 ' ]
     のための名前parse_names。
        tparse = ParserThread(名前、data_queue、FP、ロック
        g_parser_list.append(tparse)


デフCREATE_QUEUE():
    page_queue = キュー()
     のためのページ範囲(110 )。
        page_queue.put(ページ)

    data_queue = キュー()

    リターンpage_queue、data_queue


デフメイン():
    #キューを作成します。
    page_queue、data_queue = CREATE_QUEUE()
    ファイル#を開きます。
    FP =オープン(' jian.json '' '、コード= ' UTF-8 ' 
    #ロックを作成します。
    ロック = threading.Lock()
    #取得スレッドを作成します。
    create_crawl_thread(page_queue、data_queue)
    #スレッドを解析作成
    create_parser_thread(data_queue、FP、ロック

    #すべて取得スレッドを開始
     tcrawl g_crawl_list:
        tcrawl.start()
    #解決すべて始めたスレッド
     TParserをg_parser_list:
        tparser.start()

    子スレッドの終わりのための#メインスレッドが待機
     tcrawl g_crawl_list:
        tcrawl.join()
     TParserをg_parser_list:
        tparser.join()
    #ファイルを閉じます
    fp.close()
    印刷(すべての上にメインスレッドと子スレッド..... 


もし __name__ == " __main__ " 
    メイン()

 

おすすめ

転載: www.cnblogs.com/KruceCoder/p/12076673.html