【问题标题】:Access items yielded by my spider when running Scrapy from script从脚本运行 Scrapy 时访问我的蜘蛛产生的项目
【发布时间】:2020-02-18 20:52:33
【问题描述】:

从 Python 脚本调用 Scrapy Spider。我想访问 Spider 从我的脚本中生成的项目。但我不知道该怎么做。

脚本工作正常,蜘蛛被调用并产生正确的项目,但我不知道如何从我的脚本中访问这些项目。

这是脚本的代码

Class UASpider(scrapy.Spider):
     name = 'uaspider'
     start_urls = ['http://httpbin.org/user-agent']

     def parse(self, response):
         payload = json.loads(response.body.decode(response.encoding))
         yield {'ua':payload}

 def main():
     process = CrawlerProcess(get_project_settings())
     process.crawl(UASpider)
     process.start() # the script will block here until the crawling is finished

 if (__name__ == '__main__'):
     main()

这是显示蜘蛛工作正常并产生项目的日志部分。

2020-02-18 20:44:10 [scrapy.core.engine] INFO: Spider opened
2020-02-18 20:44:10 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2020-02-18 20:44:10 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2020-02-18 20:44:10 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://httpbin.org/user-agent> (referer: None)
2020-02-18 20:44:10 [scrapy.core.scraper] DEBUG: Scraped from <200 http://httpbin.org/user-agent>
{'ua': {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}}
2020-02-18 20:44:10 [scrapy.core.engine] INFO: Closing spider (finished)

非常感谢您的帮助!!


我能想到的一个选择是创建一个存储项目的管道,然后从该存储中访问项目:

  • 为此,我需要在脚本中配置管道(而不是在项目设置中)。
  • 另外,最好存储在变量而不是文件中(我这样做是为了自动化测试,速度很重要)。

【问题讨论】:

  • 你想在哪里使用你的输出如果它在蜘蛛中你可以很容易地将它放在meta并传递它,如果它在你之后main()你可以使用蜘蛛作为生成器并使用您从那里获得的输出。话虽这么说,您已经可以通过使用网站从response.request.headers['User-Agent'] 访问您的用户代理
  • 在遇到类似问题时,我使用了一个管道:gitlab.com/gallaecio/versiontracker/-/blob/master/…
  • @wishmaster - 我想使用main() 之后的输出。我会在通话中保持我的项目设置的效果吗? (例如,如果我配置一个默认用户代理,我希望该用户代理)。 - 我如何将蜘蛛用作发电机?您可以粘贴一些代码示例吗? - 谢谢!!

标签: python scrapy


【解决方案1】:

我已经按照@Gallaecio 的建议完成了这项工作,谢谢!!。

此解决方案使用将值存储在全局变量中的管道。从 Scrapy 项目中读取设置,并在脚本中添加额外的管道以避免更改整体设置。

这是使它工作的代码

user_agent = ''

Class UASpider(scrapy.Spider):
     name = 'uaspider'
     start_urls = ['http://httpbin.org/user-agent']

     def parse(self, response):
         payload = json.loads(response.body.decode(response.encoding))
         yield {'ua':payload}

class TempStoragePipeline(object):
    def process_item(self, item, spider):
        user_agent = item.get('ua').get('user-agent')
        return item

def main():
    settings = get_project_settings()
    settings.set('ITEM_PIPELINES', {
        '__main__.TempStoragePipeline': 100
    })

    process = CrawlerProcess(get_project_settings())
    process.crawl(UASpider)
    process.start() # the script will block here until the crawling is finished

if (__name__ == '__main__'):
    print(f'>>> {user_agent}'
    main()

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    相关资源
    最近更新 更多