从python脚本调用scrapy而不是创建JSON输出fi

2024-05-29 04:05:07 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我用来调用scrapy的python脚本

Scrapy crawl from script always blocks script execution after scraping

def stop_reactor():
    reactor.stop()
dispatcher.connect(stop_reactor, signal=signals.spider_closed)
spider = MySpider(start_url='abc')
crawler = Crawler(Settings())
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start()
log.msg('Running reactor...')
reactor.run()  # the script will block here until the spider is closed
log.msg('Reactor stopped.')

这是我的管道.py代码

^{pr2}$

这个密码是从这里取的

Scrapy :: Issues with JSON export

当我像这样运行爬虫的时候

scrapy crawl MySpider -a start_url='abc'

创建了一个具有预期输出的links文件,但是当我执行python脚本时,它并没有创建任何文件,尽管爬虫程序运行时转储的垃圾统计数据与上次运行的相似。 我认为python脚本中有一个错误,因为文件是在第一种方法中创建的?在


Tags: 文件脚本logurlscriptstartspiderscrapy
2条回答

一个对我有效的解决方案是放弃run脚本和使用内部API,而是使用命令行&gnupallel来并行化。在

要运行所有已知的spider,每个核心一个:

scrapy list | parallel  line-buffer scrapy crawl

scrapy list每行列出一个spider,允许我们将它们作为参数传递到传递给GNU Parallel的命令(scrapy crawl)的后面。 line-buffer表示从进程返回的输出将被打印到stdout mixed,但要逐行打印,而不是将四分之一行混在一起(对于其他选项,请查看 group ungroup)。在

注意:显然这在有多个CPU内核的机器上运行得最好,因为默认情况下,gnupallell将为每个内核运行一个作业。请注意,与许多现代开发机器不同,廉价的AWS EC2和DigitalOcean层只有一个虚拟CPU核心。因此,如果希望在一个内核上同时运行作业,则必须使用gnuparellel的 jobs参数。e、 g为每个核心运行2个碎片爬虫:

^{pr2}$

这个代码对我有用:

from scrapy import signals, log
from scrapy.xlib.pydispatch import dispatcher
from scrapy.conf import settings
from scrapy.http import Request
from multiprocessing.queues import Queue
from scrapy.crawler import CrawlerProcess
from multiprocessing import Process
# import your spider here
def handleSpiderIdle(spider):
        reactor.stop()
mySettings = {'LOG_ENABLED': True, 'ITEM_PIPELINES': '<name of your project>.pipelines.scrapermar11Pipeline'} 

settings.overrides.update(mySettings)

crawlerProcess = CrawlerProcess(settings)
crawlerProcess.install()
crawlerProcess.configure()

spider = <nameofyourspider>(domain="") # create a spider ourselves
crawlerProcess.crawl(spider) # add it to spiders pool

dispatcher.connect(handleSpiderIdle, signals.spider_idle) # use this if you need to handle idle event (restart spider?)

log.start() # depends on LOG_ENABLED
print "Starting crawler."
crawlerProcess.start()
print "Crawler stopped."

相关问题 更多 >

    热门问题