【问题标题】:How to perform the function, after all crawling is done in scrapy?在scrapy中完成所有爬取之后如何执行该功能?
【发布时间】:2017-04-22 14:13:01
【问题描述】:

spider_closed() 函数未执行。如果我只给出打印语句,它正在打印,但如果我执行任何函数调用并返回它不工作的值。

import scrapy
import re
from pydispatch import dispatcher
from scrapy import signals

from SouthShore.items import Product
from SouthShore.internalData import internalApi
from scrapy.http import Request

class bestbuycaspider(scrapy.Spider):
    name = "bestbuy_dca"

    allowed_domains = ["bestbuy.ca"]

    start_urls = ["http://www.bestbuy.ca/Search/SearchResults.aspx?type=product&page=1&sortBy=relevance&sortDir=desc&pageSize=96&query=south+shore+furniture+beds",
              "http://www.bestbuy.ca/Search/SearchResults.aspx?type=product&page=1&sortBy=relevance&sortDir=desc&pageSize=96&query=south+shore+furniture+night+stand",
              "http://www.bestbuy.ca/Search/SearchResults.aspx?type=product&page=1&sortBy=relevance&sortDir=desc&pageSize=96&query=south+shore+furniture+headboard",
              "http://www.bestbuy.ca/Search/SearchResults.aspx?type=product&page=1&sortBy=relevance&sortDir=desc&pageSize=96&query=south+shore+furniture+desk",
              "http://www.bestbuy.ca/Search/SearchResults.aspx?type=product&page=1&sortBy=relevance&sortDir=desc&pageSize=96&query=south+shore+furniture+bookcase",
              "http://www.bestbuy.ca/Search/SearchResults.aspx?type=product&page=1&sortBy=relevance&sortDir=desc&pageSize=96&query=south+shore+furniture+dresser",
              "http://www.bestbuy.ca/Search/SearchResults.aspx?type=product&page=1&sortBy=relevance&sortDir=desc&pageSize=96&query=south+shore+furniture+tv+stand",
              "http://www.bestbuy.ca/Search/SearchResults.aspx?type=product&page=1&sortBy=relevance&sortDir=desc&pageSize=96&query=south+shore+furniture+armoire",
              "http://www.bestbuy.ca/Search/SearchResults.aspx?type=product&page=1&sortBy=relevance&sortDir=desc&pageSize=96&query=south+shore+furniture+kids",
              "http://www.bestbuy.ca/Search/SearchResults.aspx?type=product&page=1&sortBy=relevance&sortDir=desc&pageSize=96&query=south+shore+furniture+changing+table",
              "http://www.bestbuy.ca/Search/SearchResults.aspx?type=product&page=1&sortBy=relevance&sortDir=desc&pageSize=96&query=south+shore+furniture+baby"]

    def __init__(self,jsondetails="",serverdetails="", *args,**kwargs):
        super(bestbuycaspider, self).__init__(*args, **kwargs)
        dispatcher.connect(self.spider_closed, signal=signals.spider_closed)
        self.jsondetails = jsondetails
        self.serverdetails=serverdetails
        self.data = []

    def parse(self,response):
        #my stuff here 



    def spider_closed(self,spider):
        print "returning values"
        self.results['extractedData']=self.data
        print self.results=internalApi(self.jsondetails,self.serverdetails)
        yield self.results

1) 我想调用一些函数并返回抓取的值

【问题讨论】:

  • 所以您想继续在spider_closed 中爬行?产生项目或请求?
  • 不,我想在蜘蛛关闭后返回爬取的项目并在另一个 py 文件中再调用一个函数,所以它会做一些操作并给出一些值。我需要将我的爬取值和调用的函数输出一起附加并返回。
  • scrapy 项目不存储在内存中,它们在您调用yield item 时输出。如果您想在输出时处理每个项目,则必须使用管道,但是一旦蜘蛛结束就使用所有这些是一种非常糟糕的做法(因为您必须自己存储它们)

标签: python-2.7 web-scraping scrapy screen-scraping scrapy-spider


【解决方案1】:

您可以使用close_spider() 方法创建Item Pipeline

class MyPipeline(object):
    def close_spider(self, spider):
        do_something_here()

请不要忘记在 settings.py 中激活它,如上面的文档链接中所述。

【讨论】:

  • 道歉,我是scrapy的新手,我需要在pipelines.py文件中创建管道类和closs_spider函数还是我可以在我的蜘蛛文件中更改类名。
  • 如果我需要在 pipelines.py 文件中创建类和函数,所以我的疑问是 1) 我如何将该管道类导入到我的蜘蛛文件中或自动导入? 2)如何将爬取的值传递给pipelines.y文件中的close_spider函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多