インポートのスレッド インポート時 インポート要求 輸入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 = キュー() のためのページで範囲(1、10 )。 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__ " : メイン()