【问题标题】:scrapy run spider from script从脚本scrapy运行蜘蛛
【发布时间】: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。我的回答包含一个完整的例子。

标签: python python-2.7 scrapy


【解决方案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 我认为您的代码示例是我在stackoverflow.com/questions/52141729/… 的问题的解决方案,请问您能在那里回答吗?
  • @PaulozOiOzuLLuFabrício 你明白了。在那里看到我的答案。 syaifulhusein 如果您仍然需要回答您的问题,您也可以去那里。 stackoverflow.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,这样您就可以运行蜘蛛而无需创建项目。

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

    import scrapy
    
    class QuestionItem(scrapy.item.Item):
        idx = scrapy.item.Field()
        title = scrapy.item.Field()
    
    class StackoverflowSpider(scrapy.spider.Spider):
        name = 'SO'
        start_urls = ['http://stackoverflow.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 stackoverflow_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 stackoverflow_spider.py 而不是 scrapy runspider ... 运行它?我真的被这个小问题困住了。
    • @Basj 由于 Scrapy 在 Twisted 之上的工作方式,这不是推荐的使用方式:通常你使用 scrapy 命令运行爬虫或将项目部署在 scrapyd 的实例上。如果您真的想在脚本中运行,我无法补充您从这些文档中获得的太多信息——我从未亲自做过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2017-10-11
    • 2018-12-23
    相关资源
    最近更新 更多