从脚本scrapy运行蜘蛛

Posted

技术标签:

【中文标题】从脚本scrapy运行蜘蛛【英文标题】:scrapy run spider from script 【发布时间】:2014-03-06 22:15:22 【问题描述】:

我想从脚本而不是 scrap crawl 运行我的蜘蛛

我找到了这个页面

http://doc.scrapy.org/en/latest/topics/practices.html

但实际上它并没有说明该脚本的放置位置。

有什么帮助吗?

【问题讨论】:

大概,您将该代码放在您想用来运行蜘蛛的脚本中。 @Talvalin 我在问我应该把脚本放在哪里? 如果您的系统路径和 PYTHONPATH 设置正确,您应该可以将脚本放在您喜欢的任何位置 @Talvalin 所以即使我的scrapy项目也应该在pythonpath中?如是。假设我有 5 个项目来废弃这个域xxx.com 如果所有蜘蛛都具有相同的名称但在不同的项目中,哪个会被解雇?我居然有这种情况 简单的蜘蛛不需要创建项目,可以使用命令scrapy runspider。我的回答包含一个完整的例子。 【参考方案1】:

简单明了:)

只需检查official documentation。我会在那里做一些改变,这样你就可以控制蜘蛛只在你做python myscript.py时运行,而不是每次你从它导入时。只需添加一个if __name__ == "__main__"

import scrapy
from scrapy.crawler import CrawlerProcess

class MySpider(scrapy.Spider):
    # Your spider definition
    pass

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

现在将文件保存为myscript.py 并运行“python myscript.py”。

享受吧!

【讨论】:

我已经完成了你的代码。那么,如何将输出保存到 JSON 文件中呢?如果我们从命令提示符或终端运行 scrapy,我们可以设置 scrapy crawl MySpider -o output.json 并获得输出 JSON 文件。如果我们使用您的代码,我可以将代码放在哪里以将输出保存到 JSON 文件? @AlmogCohen @syaifulhusein 是的,它更复杂。我可以看到,在我的一个项目中,我做了以下事情:我创建了一个 Scrapy Pipleline,将处理过的项目存储在内存中。然后在蜘蛛运行结束时,我将它们从内存存储中取出并按照我的意愿操作这些项目。如果愿意提出一个新问题,我可以用代码示例在那里回答。 +Almog Cohen 我认为您的代码示例是我在***.com/questions/52141729/… 的问题的解决方案,请问您能在那里回答吗? @PaulozOiOzuLLuFabrício 你明白了。在那里看到我的答案。 syaifulhusein 如果您仍然需要回答您的问题,您也可以去那里。 ***.com/questions/52141729/… 非常优雅的解决方案【参考方案2】:

幸运的是,scrapy 源是开放的,所以你可以按照 crawl command 的工作方式在你的代码中做同样的事情:

...
crawler = self.crawler_process.create_crawler()
spider = crawler.spiders.create(spname, **opts.spargs)
crawler.crawl(spider)
self.crawler_process.start()

【讨论】:

**opts.spargs 是什么?【参考方案3】:

你为什么不这样做呢?

from scrapy import cmdline

cmdline.execute("scrapy crawl myspider".split())

将该脚本放在与 scrapy.cfg 相同的路径中

【讨论】:

【参考方案4】:

您可以只创建一个普通的 Python 脚本,然后使用 Scrapy 的命令行选项runspider,这样您就可以运行蜘蛛而无需创建项目。

例如,您可以使用以下内容创建单个文件 ***_spider.py

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()

然后,只要你正确安装了scrapy,你就可以使用:

scrapy runspider ***_spider.py -t json -o questions-items.json

【讨论】:

我在l = scrapy.contrib.loader.ItemLoader(QuestionItem(), elem) : exceptions.AttributeError: 'module' object has no attribute 'loader' 上收到此错误。关于如何解决这个问题的任何想法? @Basj 你需要import scrapy.contrib.loader 才能工作。 谢谢@elias。我应该在您的代码中添加什么才能从 python ***_spider.py 而不是 scrapy runspider ... 运行它?我真的被这个小问题困住了。 @Basj 由于 Scrapy 在 Twisted 之上的工作方式,这不是推荐的使用方式:通常你使用 scrapy 命令运行爬虫或将项目部署在 scrapyd 的实例上。如果您真的想在脚本中运行,我无法补充您从这些文档中获得的太多信息——我从未亲自做过。

以上是关于从脚本scrapy运行蜘蛛的主要内容,如果未能解决你的问题,请参考以下文章

从脚本运行scrapy,不包括管道

在 Celery 任务中运行 Scrapy 蜘蛛

Scrapy - 如何启动同一个蜘蛛进程的多个实例?

以受控方式运行数十个 Scrapy 蜘蛛

通过扭曲的inlineCallbacks运行Scrapy蜘蛛

如何让我可以用一只scrapy蜘蛛一致地绕过一系列网站?