2013-11-21 6 views
6

spider.pyを使用して、start_urlにMYSQLテーブルのSELECTを挿入しようとしています。私が "scrapy runspider spider.py"を実行すると、出力がなくなり、エラーがなくなっただけです。Python Scrapy - mysqlからstart_urlsを作成する

私はpythonスクリプトでSELECTクエリをテストし、start_urlにはMYSQLテーブルからのエントリが入力されます。

spider.py

from scrapy.spider import BaseSpider 
from scrapy.selector import Selector 
import MySQLdb 


class ProductsSpider(BaseSpider): 
    name = "Products" 
    allowed_domains = ["test.com"] 
    start_urls = [] 

    def parse(self, response): 
     print self.start_urls 

    def populate_start_urls(self, url): 
     conn = MySQLdb.connect(
       user='user', 
       passwd='password', 
       db='scrapy', 
       host='localhost', 
       charset="utf8", 
       use_unicode=True 
       ) 
     cursor = conn.cursor() 
     cursor.execute(
      'SELECT url FROM links;' 
      ) 
    rows = cursor.fetchall() 

    for row in rows: 
     start_urls.append(row[0]) 
    conn.close() 

答えて

13

より良いアプローチは、start_requestsメソッドをオーバーライドすることです。

populate_start_urlsとよく似たデータベースにクエリを実行し、Requestというオブジェクトのシーケンスを返すことができます。

あなただけの次の行をstart_requestsにごpopulate_start_urls方法の名前を変更し、変更する必要があります:

for row in rows: 
    yield self.make_requests_from_url(row[0]) 
+0

ありがとう応答のために。それはうまくいきました。私は 'def populate_start_urls(self、url):'を 'def start_requests(self):'に変更するだけでした。私はこれが私が投稿したコードに最も近いので、これを受け入れたものとしてマークしました。 – maryo

+0

ブロードキャストする22Mのウェブサイトがある場合、どうすればできますか?私はあなたが一度にiterationg 1000でそれをしなければならないと思います。 start_requestsを使用して反復する方法を示してください。 –

4

__init__に移入を書く:

get_start_urls()戻りURLを仮定し
def __init__(self): 
    super(ProductsSpider,self).__init__() 
    self.start_urls = get_start_urls() 

関連する問題