2011-12-04 8 views
9

Acabo de instalar scrapy y seguí su simple dmoz tutorial que funciona. Solo busqué el manejo básico de archivos para python e intenté que el rastreador leyera una lista de URL de un archivo pero obtuve algunos errores. Probablemente esto sea incorrecto, pero le di una oportunidad. ¿Alguien podría mostrarme un ejemplo de cómo leer una lista de URL en scrapy? Gracias por adelantado.Scrapy ¿leyó la lista de URL del archivo para raspar?

from scrapy.spider import BaseSpider 

class DmozSpider(BaseSpider): 
    name = "dmoz" 
    allowed_domains = ["dmoz.org"] 
    f = open("urls.txt") 
    start_urls = f 

    def parse(self, response): 
     filename = response.url.split("/")[-2] 
     open(filename, 'wb').write(response.body) 

Respuesta

30

Estabas muy cerca.

f = open("urls.txt") 
start_urls = [url.strip() for url in f.readlines()] 
f.close() 

... mejor aún sería utilizar el gestor de contexto para asegurar el archivo de cerrado como se esperaba:

with open("urls.txt", "rt") as f: 
    start_urls = [url.strip() for url in f.readlines()] 
+2

'readlines()' retiene los saltos de línea al final de cada línea. He enviado una edición que 'pegará()' las líneas nuevas y cerrará el archivo. –

4

Si Dmoz espera simplemente nombres de archivo en la lista, usted tiene que llamar la tira en cada línea. De lo contrario, obtendrá una '\ n' al final de cada URL.

class DmozSpider(BaseSpider): 
    name = "dmoz" 
    allowed_domains = ["dmoz.org"] 
    start_urls = [l.strip() for l in open('urls.txt').readlines()] 

Ejemplo en Python 2,7

>>> open('urls.txt').readlines() 
['http://site.org\n', 'http://example.org\n', 'http://example.com/page\n'] 
>>> [l.strip() for l in open('urls.txt').readlines()] 
['http://site.org', 'http://example.org', 'http://example.com/page'] 
+0

Gracias, cuando ejecuté el código del ejemplo anterior de Brians, vi los errores sobre el formato de la URL. El ejemplo de dmoz de scrapy tenía las URL codificadas, y entre comillas. La eliminación de las comillas y las comas resolvió el problema, y ​​ahora se leen una por línea. – Anagio

Cuestiones relacionadas