クロールウェブサイト:http://xiaohua.zol.com.cn/youmo/
ビューのWeb機関は、コンテンツ冗談をクロールに問題があります:
1は、ページ番号を入力する必要があり、さらに複数のリンクより多くのコンテンツ、マルチタスクを確認するために、Webコンテンツ・ページをクロールするため、以下の「詳細」リンクは、このスレッドプールを使用して、それが効果的に同時スレッドのシステムを制御することができます。システムは、システムの性能低下をもたらすもスレッドプールを導入し、Pythonインタプリタの崩壊につながる、同時多数のスレッドが含ま回避は、より効率的、より少ない時間を要します。
- )(スレッドプールthreadpool.ThreadPoolを作成します。
- threadpool.makeRequests(あるスレッドプールのタスクを作成する必要があります)、makeRequestsストアは、マルチスレッド機能を開き、コールバック関数を記述することはできません関連するパラメータとコールバック関数の機能、(デフォルトはno)することです。
- スレッドプールに入れた複数のタスクの作成、threadpool.putRequest()
- すべてのタスクがtheadpool.pool処理されるまで待ちます()
2、さらに混乱分散型テキスト内のdiv要素をリンク冗談ページの内容をチェックしてください。いくつかは、テキスト内のいくつかのリンクはdiv要素に属し<P>に分布、正規表現を解決することができます。
要素ノードを取得するための2つの方法に注意してください。
1)lxmlの列ノードを取得します
requests.get = RES(URL、ヘッダ=ヘッダ) HTML = res.text lxmlの取得したノードの文言 要素= etree.HTML(HTML) divEle = element.xpath( "// divの[@クラス= 'Articleこの記事は、テキストでした']" )[0]#はDIVノード得る DIV = etree.tostring(divEle、エンコーディング= 'UTF-8').decode( 'UTF-8')#は、 文字列のdivに変換されます。
2)正規表現、濾過キャリッジ、ラベルタブとPを書き込みます
#第一种方式:交換する コンテンツ= re.findall( '?<DIV CLASS = "記事テキスト">(*)</ div>'、HTML、re.S) 内容=コンテンツ[0] .replace( '\ rを'、 '')。置き換える( '\ tの'、 '')。(置き換える'<P>'、 '')。(置き換える'</ P>'、 '')。ストリップ()
3)2書かれた正規表現、濾過キャリッジリターン、タブ、タブP
#第二种方式:サブ 範囲のインデックスの(LEN(コンテンツ)): コンテンツ[インデックス] = re.sub(R '(\ R | \ T | <P> | <\ / P>)+'、」 」、コンテンツ[インデックス])。ストリップ() リスト= '' .join(コンテンツ) プリント(リスト)
3、完全なコード
index.py
リクエストのインポート インポートのThreadPool インポート時間 インポートOS、SYS インポート再 lxmlのインポートetreeから のインポートlxml.htmlのtoString クラスScrapDemo(): next_page_url = "" #次ページのURL PAGE_NUM現在のページ= 1# detail_url_list = 0#詳細ページのURLアドレスリスト deepth = 0#セットクロール深さ ヘッダー= { "ユーザエージェント"の「Mozilla / 5.0(Windows NTの10.0; Win64の、x64-)のAppleWebKit / 537.36(KHTML、ヤモリ等)クローム/ 68.0.3440.84サファリ/ 537.36 " } FILENUM = 0 __init __(自己、URL)DEF: self.scrapyIndex(URL) DEF threadIndex(セルフ、urllist):#オープンスレッドプール lenの場合(urllist)== 0: 印刷( "クロール希望アドレスを入力してください")) Falseを返します ScrapDemo.detail_url_list = LEN(urllist) プール= threadpool.ThreadPool(LEN(urllist)) 要求= threadpool.makeRequests(self.detailScray、urllist) 要求でREQ用:#表示二つのリストにプール内のすべてのスレッドが開かれ pool.putRequest(REQ) time.sleep(0.5) pool.wait() DEF detailScray(セルフ、URL):#は、データをフェッチ されないURL == "" IF: URL = 「http://xiaohua.zol.com.cn/{}'.format(url) RES = requests.get(URL、ヘッダ= ScrapDemo.headers) HTML res.text = #= etree.HTML要素(HTML) #= divEle element.xpath( "// divの[@クラス= 'Articleこの記事は、テキストだった']")[0]#DIV要素 self.downloadText(HTML) DEF downloadText(セルフ、ELE ):保存する#のtxtファイル CLISTを= re.findall(「<divのクラス = "記事テキスト">(。*?)</ div>」、ELE、re.S) 範囲内のインデックス(LEN(CLIST))のために: ' '' 正则表达式:过滤掉回车、制表符和Pの标签 ''' CLIST [インデックス] = re.sub(R '(\ rは| \ T | <P> | <\ / P>)+」、 ''、CLIST [インデックス]) コンテンツ= ""(CLIST)に参加。 #プリント(コンテンツ) でない場合ScrapDemo.next_page_url == "": self.scrapyIndex(ScrapDemo.next_page_url) のbasedir = os.path.dirname(__ FILE__) filePathに=はos.path。参加(BASEDIR) ファイル名= "xiaohua {0} - {1}の.txt" .format(ScrapDemo.deepth、STR(ScrapDemo.fileNum)) ファイル= os.path.join(filePathに、 'file_txt'、ファイル名) してみてください: F =オープン(ファイル、 "W") f.write(コンテンツ) ScrapDemo.fileNum ==(ScrapDemo.detail_url_list - 1)の場合: プリント( ScrapDemo.next_page_url) (ScrapDemo.deepth)印刷 Eのような例外を除いて: 印刷( "エラー:%s"は%strの(E)) ScrapDemo.fileNum = ScrapDemo.fileNum + 1枚 の印刷(ScrapDemo.fileNum) scrapyIndexデフ(自己、URL ) == "URLでない場合は、": ScrapDemo.fileNum = 0 ScrapDemo.deepth = ScrapDemo.deepth + 1枚の プリント( "开启第{0}页抓取" .format(ScrapDemo.page_num)) RES = requests.get(URL、ヘッダー= ScrapDemo.headers) HTML = res.text 要素= etree.HTML(HTML) a_urllist = element.xpath( "// [@クラス= 'すべての-読み'] / @ hrefのの")#当前页查看全文 にnext_page = element.xpath(" // [@クラス= 'ページ次の'] / @ hrefのの")#获取下一页的URL ScrapDemo.next_page_url = 'HTTP://xiaohua.zol.com.cn/ {}'。フォーマット(にnext_page [0]) (にnext_page)== 0とScrapDemo.next_page_url = URL :! IF lenはない ScrapDemo.page_num = ScrapDemo.page_num + 1。 self.threadIndex(a_urllistの[:]) 他: 印刷(「ダウンロードが完了すると、現在のページが} {ページです」.format(ScrapDemo.page_num)) sys.exit()
runscrapy.py
アプリのインポートScrapDemoから URL = "http://xiaohua.zol.com.cn/youmo/" ScrapDemo(URL)
次のように実行します。
1988のファイルの合計は、ダウンロードが完了しています。