【问题标题】:Stop Scrapy after N items scraped刮掉 N 个项目后停止刮擦
【发布时间】:2015-07-06 12:43:11
【问题描述】:

我在使用 Scrapy 时遇到问题。我需要能够为每个给定的 url 报废多达 1000 个内部链接的代码。我的代码在命令行运行时可以工作,但蜘蛛不会停止,只会收到消息。

我的代码如下:

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.item import Item, Field
from scrapy.contrib.closespider import CloseSpider

class MyItem(Item):
    url= Field()

class MySpider(CrawlSpider):
    name = 'testspider1'
    allowed_domains = ['angieslist.com']
    start_urls = ['http://www.angieslist.com']

    rules = (Rule(SgmlLinkExtractor(), callback='parse_url', follow=True), )

    def parse_url(self, response):
        item = MyItem()
        item['url'] = response.url

        scrape_count = self.crawler.stats.get_value('item_scraped_count')
        print scrape_count

        limit = 10

        if scrape_count == limit:
            raise CloseSpider('Limit Reached')

        return item

【问题讨论】:

  • 你确定它不会停止吗?我相信在收到 CloseSpider 后,scrapy 将继续处理已经请求的项目。我的意思是,它不会立即停止,但不会请求新项目
  • This 你可能会很感兴趣。
  • 你是对的,它确实停止了。但是,我计划扩大这个过程,并希望删除任何不必要的处理。我希望有某种方法可以“停在一角钱上”。可以这么说。
  • 还有,你为什么不用doc.scrapy.org/en/latest/topics/…
  • 弗兰克,我想你找到了我需要的东西。我只是想弄清楚如何实现/测试它。阿里克,我试试看。

标签: python scrapy


【解决方案1】:

我的问题是试图在错误的地方应用近距离蜘蛛。这是一个需要在 settings.py 文件中设置的变量。当我在那里手动设置它,或者在命令行中将它设置为参数时,它起作用了(在 N 的 10-20 内停止它的价值)。

settings.py:

BOT_NAME = 'internal_links'
SPIDER_MODULES = ['internal_links.spiders']
NEWSPIDER_MODULE = 'internal_links.spiders'
CLOSESPIDER_PAGECOUNT = 1000
ITEM_PIPELINES = ['internal_links.pipelines.CsvWriterPipeline']
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'yo mama'
LOG_LEVEL = 'DEBUG'

【讨论】:

  • 我已经实现了相同的方法,正如你所说,它在所需值的10-20 之间停止。你知道这是为什么吗?为了完整起见,我希望我的蜘蛛立即停止!
  • 据我记忆,进程是异步的,因此在向进程发出请求时不会立即执行。不过已经很长时间了,我正在研究记忆,所以可能不再是这种情况了。
  • 至少您通过在用户代理中识别自己来负责任地抓取
猜你喜欢
  • 2018-05-22
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 2020-01-09
  • 2021-09-06
  • 2014-08-10
相关资源
最近更新 更多