2013-11-21 15 views
6

Sto tentando di popolare start_url con un SELECT da una tabella MYSQL utilizzando spider.py. Quando eseguo "scrapy runpider spider.py" non ottengo output, solo che è finito senza errori.Python Scrapy: popola start_urls da mysql

Ho testato la query SELECT in uno script python e start_url viene popolato con gli accessi dalla tabella 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() 

risposta

13

Un approccio migliore è quello di ignorare il metodo start_requests.

Questo può interrogare il database, in modo simile a populate_start_urls e restituire una sequenza di oggetti Request.

Si avrebbe solo bisogno di rinominare il metodo populate_start_urls-start_requests e modificare le seguenti righe:

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

grazie per la risposta. ha funzionato, ho solo dovuto cambiare 'def populate_start_urls (self, url):' a 'def start_requests (self):'. l'ho contrassegnato come accettato poiché è il più vicino al codice che ho pubblicato. – maryo

+0

Come si può fare se si dispone di siti Web di 22 milioni per eseguire la scansione generica? Suppongo che devi farlo iterationg 1000 alla volta. Puoi mostrare come iterarlo usando start_requests? –

4

Scrivi il popolamento nella __init__:

def __init__(self): 
    super(ProductsSpider,self).__init__() 
    self.start_urls = get_start_urls() 

Supponendo get_start_urls() rendimenti delle URL.