Python 用于测试的刮擦极限请求

Python 用于测试的刮擦极限请求,python,python-2.7,web-scraping,scrapy,scrapy-spider,Python,Python 2.7,Web Scraping,Scrapy,Scrapy Spider,我一直在搜索零碎的文档,寻找一种方法来限制我的爬行器可以发出的请求数量。在开发过程中,我不想坐在这里等待我的爬行完成整个爬行,即使爬行非常集中,它们仍然需要相当长的时间 我希望能够说,“在向站点发送x个请求后,我将停止生成新请求。” 我想知道,在我尝试提出自己的解决方案之前,是否有一个我可能错过的设置,或者使用框架的其他方法来实现它 我正在考虑实现一个downloader中间件,该中间件将跟踪正在处理的请求数量,并在达到限制后停止将请求传递给downloader。但是就像我说的,如果可能的话,我

我一直在搜索零碎的文档,寻找一种方法来限制我的爬行器可以发出的请求数量。在开发过程中,我不想坐在这里等待我的爬行完成整个爬行,即使爬行非常集中,它们仍然需要相当长的时间

我希望能够说,“在向站点发送x个请求后,我将停止生成新请求。”

我想知道,在我尝试提出自己的解决方案之前,是否有一个我可能错过的设置,或者使用框架的其他方法来实现它

我正在考虑实现一个downloader中间件,该中间件将跟踪正在处理的请求数量,并在达到限制后停止将请求传递给downloader。但是就像我说的,如果可能的话,我宁愿使用框架中已经存在的机制

有什么想法吗?谢谢。

您正在寻找:

一个整数,指定要爬网的最大响应数。 如果爬行器爬行的次数超过该次数,则爬行器将关闭 原因
closespider\u pagecount
。如果为零(或未设置),spider将不会 将按爬网响应的数量关闭


作为@alecxe答案的补充,值得注意的是:

当前在下载程序队列中的请求(最多
并发_请求
请求)仍在处理中

尽管上述文档目前仅针对
CLOSESPIDER\u ITEMCOUNT
(而不是
CLOSESPIDER\u PAGECOUNT
)提供,但它也应该出现在那里,因为它就是这样工作的

可以使用以下代码进行验证:

# scraper.py

from scrapy import Spider
from scrapy import Request

class MySpider(Spider):
    name = 'MySpider'
    custom_settings = {'CLOSESPIDER_PAGECOUNT': 2}

    def start_requests(self):
        data_urls = [
          'https://www.example.com', 'https://www.example1.com', 'https://www.example2.com'
        ]
        for url in data_urls:
            yield Request(url=url, callback=lambda res: print(res))
假设在返回两个响应之前生成了所有3个请求(我100%的测试都是这样),第三个请求(到
example2.com
)仍然会被执行,因此运行它:

scrapy runspider scraper.py
。。。将输出(注意,尽管spider进入了
关闭spider
阶段,
GEThttps://example2.com
仍在执行):

因此,现在只有2个请求排队并执行。输出:

[...]
DEBUG: Crawled (200) <GET https://www.example.com> (referer: None)
<200 https://www.example.com>
DEBUG: Crawled (200) <GET https://www.example1.com> (referer: None)
<200 https://www.example1.com>
INFO: Closing spider (closespider_pagecount)
INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 431,
 'downloader/request_count': 2,
 'downloader/request_method_count/GET': 2,
 'downloader/response_bytes': 3468,
 'downloader/response_count': 2,
 'downloader/response_status_count/200': 2,
 'elapsed_time_seconds': 5.827646,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2020, 10, 4, 11, 29, 41, 801185),
 'log_count/DEBUG': 2,
 'log_count/INFO': 10,
 'response_received_count': 2,
 'scheduler/dequeued': 2,
 'scheduler/dequeued/memory': 2,
 'scheduler/enqueued': 2,
 'scheduler/enqueued/memory': 2,
 'start_time': datetime.datetime(2020, 10, 4, 11, 29, 30, 749048)}
INFO: Spider closed (finished)
[…]
调试:已爬网(200)(引用程序:无)
调试:已爬网(200)(引用程序:无)
信息:关闭爬行器(关闭爬行器\u页面计数)
信息:正在转储碎片统计信息:
{'downloader/request_bytes':431,
“下载程序/请求计数”:2,
“下载器/请求\方法\计数/获取”:2,
“downloader/response_字节”:3468,
“下载程序/响应计数”:2,
“下载程序/响应状态\计数/200”:2,
“已用时间”秒:5.827646,
“完成原因”:“完成”,
“完成时间”:datetime.datetime(2020,10,4,11,29,41,801185),
“日志计数/调试”:2,
“日志计数/信息”:10,
“响应\u已收到\u计数”:2,
“调度程序/出列”:2,
“调度程序/出列/内存”:2,
“调度程序/排队”:2,
“调度程序/排队/内存”:2,
“开始时间”:datetime.datetime(2020,10,4,11,29,30749048)}
信息:十字轴关闭(完成)

太棒了。我明天到办公室时会试试这个。非常感谢。这正是我需要的——再次感谢。
from scrapy import Spider
from scrapy import Request

class MySpider(Spider):
    name = 'MySpider'
    limit = 2

    def start_requests(self):
        data_urls = [
           'https://www.example.com', 'https://www.example1.com', 'https://www.example2.com'
        ]
        for url in data_urls:
            if self.limit > 0:
                yield Request(url=url, callback=lambda res: print(res))
                self.limit -= 1
[...]
DEBUG: Crawled (200) <GET https://www.example.com> (referer: None)
<200 https://www.example.com>
DEBUG: Crawled (200) <GET https://www.example1.com> (referer: None)
<200 https://www.example1.com>
INFO: Closing spider (closespider_pagecount)
INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 431,
 'downloader/request_count': 2,
 'downloader/request_method_count/GET': 2,
 'downloader/response_bytes': 3468,
 'downloader/response_count': 2,
 'downloader/response_status_count/200': 2,
 'elapsed_time_seconds': 5.827646,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2020, 10, 4, 11, 29, 41, 801185),
 'log_count/DEBUG': 2,
 'log_count/INFO': 10,
 'response_received_count': 2,
 'scheduler/dequeued': 2,
 'scheduler/dequeued/memory': 2,
 'scheduler/enqueued': 2,
 'scheduler/enqueued/memory': 2,
 'start_time': datetime.datetime(2020, 10, 4, 11, 29, 30, 749048)}
INFO: Spider closed (finished)