2017-05-30 1 views
-1

私は論理ジレンマを持っています。PythonとSQL:値を格納し、クエリし、次の構文解析を行います

フランスのすべてのレストランをYelpで取得しようとしています。 そうするために、Yelp APIをスクラップしてデータを取得するWebクローラを作成しています。 クエリは、このようなものです:

https://api.yelp.com/v3/businesses/search?cc=fr&location=Paris&categories=restaurants 

は私がフランスのすべての都市でSQLデータベースを持っている(素敵はそれではないのですか?):

enter image description here

は、私は今、自分のWebを実行していますよクローラは手動でcityという名前を手で入力します。私は私のスクリプトをしたいと思います。もちろん、 :

  1. クエリSQL Serverの
  2. Countryを取り、City
  3. は(私はそれを行う方法を知っている)URLに値を渡す
  4. 値をとります次の行から(私はそれを行う方法がわからない)

だから私の質問は、より多くの試合ロジックです:全体のことを構造化する方法?

次のクエリを実行して実行するにはどうすればよいですか?

def get_restaurants_for(country, city): 
    # your api calls etc here 
    ... 

def main(): 
    db = yourdbmodule.connect(**connexion_infos) 
    cursor = db.cursor() 
    try: 
     cursor.execute("select country, city from yourtable") 
     for country, city in cursor: 
      get_restaurants_for(city, country) 
    finally: 
     cursor.close() 
     db.close() 

答えて

2

それぞれの環境の強みと、それぞれのアプローチのトレードオフが何であるかを示します。

Pythonは、反復によって物事がどのように引き渡されるかに関して非常に一貫しています。理想的にはあなたのようにあなたのコードを構築したい:

for city in cities(): 
    crawl_yelp(city) 

今明らかに、単純なアプローチは、カーソルを返し、あなたはそれを反復処理のように、あなたはあなたのクロール関数に渡すレコードを取得することです。あなたのデータベースが高い書き込み負荷の下にない場合、私の疑いは、読んだトランザクションをこの間オープンにしておくことはおそらくひどいことではないということです。

もしそうなら、cities()は行をリストに集めて返します。より高い書き込み負荷のもとで、データベース・サーバー自体でより簡単になるようなものについては、メモリーと初期レイテンシをトレードすることになります。メモリが問題であれば、csvファイルに書き込んだ後、それを開き、それを反復処理することができます(後方互換性のある方法で行うにはさらに多くの作業が必要になることがあります)。

時期尚早な最適化はすべての悪の根源であり、ここで適用されます。したがって、重要なことは、事柄を壊さずに後で変更できるように、ロジックを適切に分離できることを確認することです。だから私はそれが問題になることがわかっていない限り、カーソルをループすることから始めます。そして、それが問題である場合(または、問題が示されている場合)、私は他のオプションを探索します。辞書(またはタプル)の配列を返し、それを返すか、ファイルにシリアライズしてそれを繰り返します。

+0

親愛なる@ブリュノ、私は正確で速い再生を期待していませんでした! (5分未満。)私は試してみましょう、あなたにお知らせします、ありがとう –

+0

私は言葉がない@ブリュノ、あなたは今日何かを教えて;) –

0

[OK]をので、のは、演奏についての基本的なポイントから始めましょう:あなたは自分のカーソルを反復しなければならない(あなたがベンダーに言及しなかった...)データベースのpython db-api compliantコネクタがありますと仮定

関連する問題