私はウェブサイトから情報を抽出し、MySQLdbとBeautifulSoupというPythonを使用してデータベースに格納しています。Pythonで複数のSQLクエリをスレッド化するための良いプラクティス/デザイン
このウェブサイトは約15の異なる都市で構成されており、各都市には10から150ページの範囲があります。合計で約500ページあります。
都市ごとに、私はBeautifulSoupを使用してサイトを開き、必要な情報をすべて抽出してからinsert into
またはupdate
SQLクエリを実行します。
現在、私がスレッドを使用していない、そしてそれはPythonプログラムため、すべての500ページを通過するまでに数分かかります...
- は、ページを開きます。
- 情報を抽出します。
- SQLクエリを実行します。
- を開き、次のページ...
理想的には私は、たとえば、約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)
スクリプトのパフォーマンスを向上させるためにマルチスレッドが必要であるかどうかはわかりません。それが私の場合は、まず、この記事で提案されているように、自動コミットが無効になっていることを確認します:http://stackoverflow.com/questions/6482004/pythonmysql-bulk-insertそれから、1ページあたり*ではなく、都市ごとに1つ以上のステートメントを実行することを検討します。それは、実行されているステートメントの数を大幅に減らすことになります。これらのオプションを使い切ってからは、マルチスレッドを検討します。 – Hoons