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