我在我的pipleline中有一个方法来检查项目的发布日期是否比mysql中发现的更早,所以让lastseen
成为从数据库中检索的最新日期时间:
def process_item(self, item, spider):
if item['post_date'] < lastseen:
# set flag to close_spider
# raise DropItem("old item")
此代码基本上有效,除了:我每小时检查一次网站只是为了获取新帖子,如果我不停止蜘蛛,它将继续爬行数千页,如果我停止蜘蛛在旗帜上,很少有请求不会被处理,因为它们可能会在蜘蛛关闭后重新排队,即使这些请求在发布日期可能更新,但是说,是否有解决方法可以进行更精确的抓取?
谢谢,
答案 0 :(得分:0)
不确定这是否适合您的设置,但您可以在初始化蜘蛛时从MySQL获取lastseen
并在响应包含postdate < lastseen
的项目时停止在回调中生成请求,因此基本上移动了逻辑停止直接在Spider内部爬行而不是管道。
将参数传递给蜘蛛
有时会更简单scrapy crawl myspider -a lastseen=20130715
并设置Spider的属性以在回调中进行测试(http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments)
class MySpider(BaseSpider):
name = 'myspider'
def __init__(self, lastseen=None):
self.lastseen = lastseen
# ...
def parse_new_items(self, reponse):
follow_next_page = True
# item fetch logic
for element in <some_selector>:
# get post_date
post_date = <extract post_date from element>
# check post_date
if post_date < self.lastseen:
follow_next_page = False
continue
item = MyItem()
# populate item...
yield item
# find next page to crawl
if follow_next_page:
next_page_url = ...
yield Request(url = next_page_url, callback=parse_new_items)