私たちは、Webからいくつかのデータのニーズを取得する必要があるとき、私たちは迅速にデータを取得するためにいくつかのライブラリにHTMLウェブ解析を使用することができます。その上の例のlxmlの、美しいスープのために、可能なHTMLページを解析するサードパーティのライブラリの様々なものがあります。Webからの私たちに必要な統計データをクロールlxmlの例以下は、
私は、その後の処理の準備のために、北京公共交通機関サイトへの北京からのすべての情報行を取得したいです
元のデータを取得するために最初のWebページへのアクセス要求のための参照要求、htmlページ
インポート要求
長いlxmlののetreeクラスを参照してください。
輸入 lxml.etree
まず、出発点として入力アドレスバスラインのウェブインデックスページをクロールを開始、URLに対応するすべての行の値を取得します
タグに応じて分割htmlページの層lxml.etree、徐々にツリー構造が形成されたダウン成長、我々はタグは、対応するタブのXPathを抽出するための機能を使用しているページのソースコードを表示することによって、我々のデータを検索しますデータ
デフget_all_line(): URL = ' http://beijing.gongjiao.com/lines_all.html ' テキスト = requests.get(URL)の.text DOC = lxml.etree.HTML(テキスト) all_lines = doc.xpath(" / / DIV [クラス@ = 'リスト'] / UL /リチウム" ) 、F(=オープン" ./data/ 」 + ' allline.txt '、' A ' ) プリント(LEN(all_lines)) のためのラインでall_lines: LINE_NAME = line.xpath(" ./a/text()" )[0] .strip() line_url = line.xpath(" ./a/@href " )[0] f.write(LINE_NAME + ' $$ ' + line_url + ' \ nは" ) f.close()
だから我々は、そのページの行ごとに、関連するデータをクロールに続いて、これに基づいて、URLに対応するすべての行を取得します
ラインデータをクロールする前に、我々は管理しやすい異なるフィールドを、格納するデータディクショナリを作成する必要があります。必要であれば、私は13の分野の辞書を作成しました
df_dict = { ' LINE_NAME ':[]、' line_url ':[]、' LINE_START ':[]、' LINE_STOP ' :[]、 ' line_op_time ':[]、' line_interval ':[]、' line_price ':[ ]、' line_company ' :[]、 ' line_up_times ':[]、' line_station_up ':[]、' line_station_up_len ' :[]、 "line_station_down ':[]、' line_station_down_len ' :[] }
私達はちょうど生成されたURLのデータファイルからのすべてのURLを読んで、以下の機能が実現のためのラインデータを読み出し
DEF :(ライン)getbuslin LINE_NAME =ライン[:line.find(' $$ ' )] line_url =行[line.find(' $$ ')+2 :] #1 プリント(line_url) URL = line_urlの テキスト = 要求を。 .text(URL)を取得 #の印刷(LEN(テキスト)) のdoc = lxml.etree.HTML(テキスト) に関する情報 = doc.xpath(" // divの[クラス@ = 'gj01_line_headerのclearfix'] " ) のための情報でに関する情報: #1 、F =オープン( "./データ/" + LINE_NAME + 'TXT'、'A') start_stop = info.xpath(" ./dl/dt/a/text()" ) #1 f.write( 'スタート・ストップ' + start_stop + '\ n') op_times = info.xpath(" [./dl/dd 1] / B /テキスト()" ) #1 f.write( 'オープンタイム:' + op_times + '\ n') 間隔= info.xpath(" ./dl/dd [2] /テキスト()" ) #のF .WRITE( '区間' +間隔+ '\ n') 価格= info.xpath(" ./dl/dd [3] /テキスト()" ) #1 f.write( '価格' +価格+ '\ n'は) 会社=情報。XPath( " [4] /テキストを./dl/dd()") #1 f.write( '会社:' +会社+ '\ n'は) up_times = info.xpath(" [5] /テキストを(./dl/dd)" ) all_stations_up = doc.xpath(" // [UL @クラス= "gj01_line_img JSアップclearfix"] ' ) のためのステーションでall_stations_up: station_up_name = station.xpath(' ./li/a/text()' ) df_dict [ ' line_station_up ' ] .append(station_up_name) df_dict [ ' line_station_up_len "] .append(LEN(station_up_name)) #のf.write(STATION_NAME + '\ n'は) all_stations_down = doc.xpath(' // UL [@クラス= "gj01_line_img JSダウンclearfix"] ' ) であれば LEN(all_stations_down)= = 0: #1 プリント(LINE_NAME) df_dict [ ' line_station_down ' ] .append('' ) df_dict [ ' line_station_down_len ' ] .append(0) のためのステーションでall_stations_down: station_down_name = station.xpath('./li/a/text()' ) df_dict [ ' line_station_down ' ] .append(station_down_name) df_dict [ ' line_station_down_len ' ] .append(LEN(station_down_name)) #1 f.write(STATION_NAME +' \ n ') #1 、F。 )(クローズ df_dict [ ' LINE_NAME ' ] .append(LINE_NAME) df_dict [ ' line_url ' ] .append(line_url) df_dict [ ' LINE_START ' ] .append(start_stop [0]) df_dict [ ' LINE_STOPを'] .append(start_stop [1 ]) であれば LEN(op_times)== 0: op_times.append(defaultoptime) df_dict [ ' line_op_time ' ] .append(op_times [0]) df_dict [ ' line_interval ' ] .append(区間[0 ] [5 :]) df_dict [ ' line_company ' [0] [5] .append(会社): df_dict [ ' line_price ' ] .append(価格[0] [5 :]) df_dict [ ' line_up_times ' ] .append (up_times [0] [5:])
辞書の本質はまだリストなので、操作方法は、辞書のリストを参照することができます
私はすべてのサイト上下、ターミナルを起動し、局、端末、営業時間、グリッド間隔、料理を始め、Webからのバスラインのラインの名前を抽出しました
作成した辞書に格納されているすべてのデータの後、パンダは、ライブラリを使用する必要がcsvファイルとして保存
インポートのPdとしてパンダ DF = pd.DataFrame(df_dict) df.to_csv(名 + ' の.csv '、エンコーディング= ' UTF-8 '、インデックス=なし)
現時点では、データ・ページは、後続の処理のためにローカルに保存されて解析されました
データバスラインが比較的静的れないので、リアルタイムの更新ので、データ量が比較的小さいですが、プログラム全体はまだダウンを実行するのに数分を必要とします
ここでは、私がいないマルチプロセス処理を持って、フォローアップは、マルチプロセスを最適化するのに必要な時間を短縮することにより、コンピュータのパフォーマンスを最大限に活用することができます