python - español - scrapy run spider del script
scrapy ruby (4)
¡Es una acción tan simple y directa!
Solo revisa la documentación oficial . Me gustaría hacer un pequeño cambio para que pueda controlar la araña para que se ejecute solo cuando lo haga python myscript.py
y no cada vez que solo importa desde allí. Solo agregue un if __name__ == "__main__"
:
import scrapy
from scrapy.crawler import CrawlerProcess
class MySpider(scrapy.Spider):
# Your spider definition
...
if __name__ == "__main__":
process = CrawlerProcess({
''USER_AGENT'': ''Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)''
})
process.crawl(MySpider)
process.start() # the script will block here until the crawling is finished
Ahora guarde el archivo como myscript.py
y ejecute ''python myscript.py`.
¡Disfrutar!
Quiero ejecutar mi araña desde un script en lugar de un scrap crawl
Encontré esta página
http://doc.scrapy.org/en/latest/topics/practices.html
pero en realidad no dice dónde poner esa secuencia de comandos.
cualquier ayuda por favor?
¿Por qué no haces esto?
from scrapy import cmdline
cmdline.execute("scrapy crawl myspider".split())
Pon esa secuencia de comandos en el mismo camino donde pones scrapy.cfg
Afortunadamente, la fuente de scrapy está abierta, por lo que puedes seguir el funcionamiento del comando crawl y hacer lo mismo en tu código:
...
crawler = self.crawler_process.create_crawler()
spider = crawler.spiders.create(spname, **opts.spargs)
crawler.crawl(spider)
self.crawler_process.start()
Puedes simplemente crear un script de Python normal y luego usar el runpider de la opción de línea de comando de runspider
, que te permite ejecutar un spider sin tener que crear un proyecto.
Por ejemplo, puede crear un solo archivo _spider.py
con algo como esto:
import scrapy
class QuestionItem(scrapy.item.Item):
idx = scrapy.item.Field()
title = scrapy.item.Field()
class Spider(scrapy.spider.Spider):
name = ''SO''
start_urls = [''http://.com'']
def parse(self, response):
sel = scrapy.selector.Selector(response)
questions = sel.css(''#question-mini-list .question-summary'')
for i, elem in enumerate(questions):
l = scrapy.contrib.loader.ItemLoader(QuestionItem(), elem)
l.add_value(''idx'', i)
l.add_xpath(''title'', ".//h3/a/text()")
yield l.load_item()
Luego, siempre que tenga scrapy correctamente instalado, puede ejecutarlo usando:
scrapy runspider _spider.py -t json -o questions-items.json