2012-02-09 5 views
2

私はウェブサイトから情報を抽出し、MySQLdbBeautifulSoupというPythonを使用してデータベースに格納しています。Pythonで複数のSQLクエリをスレッド化するための良いプラクティス/デザイン

このウェブサイトは約15の異なる都市で構成されており、各都市には10から150ページの範囲があります。合計で約500ページあります。

都市ごとに、私はBeautifulSoupを使用してサイトを開き、必要な情報をすべて抽出してからinsert intoまたはupdate SQLクエリを実行します。

現在、私がスレッドを使用していない、そしてそれはPythonプログラムため、すべての500ページを通過するまでに数分かかります...

  1. は、ページを開きます。
  2. 情報を抽出します。
  3. SQLクエリを実行します。
  4. を開き、次のページ...

理想的には私は、たとえば、約50ページごとを開く10個の同時実行スレッドを持つことにより、負荷バランススレッドにしたいと思います。しかし、私はそれがコード化するにはあまりにも複雑かもしれないと思う。

代わりに、私は都市ごとに1つのスレッドを持つことを考えています。どうすればこれを達成できますか? N-スレッドで

//import threading 
import BeautifulSoup 
import urllib2 
import MySQLdb 

con = MySQLdb.connect(...) 

def open_page(url): 
    cur = con.cursor() 
    // do SQL query 

//Get a dictionary of city URL 

cities = [ 
    'http://example.com/atlanta/', 
    'http://example.com/los-angeles/', 
    ... 
    'http://example.com/new-york/' 
] 

for city_url in cities: 
    soup = BeautifulSoup(urllib2.urlopen(city_url)) 

    // find every page per city 
    pages = soup.findAll('div', { 'class' : 'page' }) 

    for page in pages: 
     page_url = page.find('a')[ 'href' ] 
     open_page(page_url) 
+0

スクリプトのパフォーマンスを向上させるためにマルチスレッドが必要であるかどうかはわかりません。それが私の場合は、まず、この記事で提案されているように、自動コミットが無効になっていることを確認します:http://stackoverflow.com/questions/6482004/pythonmysql-bulk-insertそれから、1ページあたり*ではなく、都市ごとに1つ以上のステートメントを実行することを検討します。それは、実行されているステートメントの数を大幅に減らすことになります。これらのオプションを使い切ってからは、マルチスレッドを検討します。 – Hoons

答えて

1

あなた初期のアイデアは絶対に実現可能です。 1つの同じキューの入力を待機するワーカー・スレッドを10個だけ起動してください。その後、メールプロセスはURLをこのキューに入れます。ロードバランシングは自動的に行われます。

SQLバインディングがスレッドセーフであれば、ワーカースレッドでINSERTまたはUPDATEを実行できます。それ以外の場合は、別のキューに入力を待って、SQL用のスレッドをもう1つ追加します。その後、ワーカースレッドはクエリをこのキューに入れ、SQLスレッドがそれを実行します。

"python worker threads queue"については、いくつかの例があります。

+0

ワーカースレッドは私が探していたもののようです。ありがとう! – hobbes3

1
  1. パースのURL:

    現在、私のコードは次のようなもののように見えます。

  2. TEMPテーブル
  3. を作成して解析されたURLから
  4. を.CSVソースを作成します。TEMPテーブルからメインテーブルにdupes WITHOUT http://dev.mysql.com/doc/refman/5.1/en/load-data.html
  5. 挿入によりCSVからのTEMPテーブルに挿入し
関連する問題