gpt4 book ai didi

python - Scrapy spider_idle 调用以重新启动 scrape

转载 作者:行者123 更新时间:2023-11-28 17:39:45 26 4
gpt4 key购买 nike

我在 Scrapy 中有一个抓取设置,它以数字序列的形式定位 100 万个唯一 url。例如:http://www.foo.com/PIN=000000000001

我将 PIN 保存在数据库中。我不是将 1M PIN 加载到内存中并创建 1M start_url,而是使用 start_requests() 函数一次查询数据库 5000 个 PIN。完成 5000 个唯一 URL 后,我想重新开始抓取并继续这样做,直到抓取所有 100 万个 URL。在 scrapy 用户组中,他们推荐我使用 spider_idle 函数来保持重新启动 scrape。我根据下面的代码正确设置了它,但我似乎无法找到正确的代码来重新启动抓取。见下文:

class Foo(Spider):
name = 'foo'
allowed_domains = ['foo.com']

def __init__(self, *args, **kwargs):
super(Foo, self).__init__(*args, **kwargs)
dispatcher.connect(self.spider_idle, signals.spider_idle)

def spider_idle(self, spider):
print 'idle function called' # this prints correctly so I know this function is getting called.
self.start_requests() #this code does not restart the query

def start_requests(self):
data = self.coll.find({'status': 'unscraped'}).limit(5000)

for row in data:
pin = row['pin']
url = 'http://foo.com/Pages/PIN-Results.aspx?PIN={}'.format(pin)
yield Request(url, meta={'pin': pin})

我需要什么代码来重新启动抓取?

最佳答案

我不会重新启动蜘蛛,而是查询数据库中的 unscraped 项目,直到什么都没有为止:

class Foo(Spider):
name = 'foo'
allowed_domains = ['foo.com']

def start_requests(self):
while True:
data = self.coll.find({'status': 'unscraped'}).limit(5000)

if not data:
break

for row in data:
pin = row['pin']
url = 'http://foo.com/Pages/PIN-Results.aspx?PIN={}'.format(pin)
yield Request(url, meta={'pin': pin})

您可能需要在具有限制和偏移量的集合上实现真正的分页。

关于python - Scrapy spider_idle 调用以重新启动 scrape,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26179390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com