首页 > 解决方案 > 如何动态地将作业添加到 Scrapy/Selenium 蜘蛛?

问题描述

我正在使用 Scrapy + Selenium 来抓取 Facebook 好友数据。我想编写一个程序,它将 2 个用户名作为输入,递归地抓取他们的好友列表,直到找到连接 2 个用户的链。我的蜘蛛可以登录、生成项目并将它们发送到 MongoDB(通过管道)。我有一个可以向 Mongo 查询以检查链是否存在并返回的工作函数。我对算法的看法:

  1. 获取输入(2 个用户名)
  2. 将 2 个用户放入爬取 QUEUE
  3. Facebook登入
  4. 弹出 QUEUE 并开始爬取
  5. 一旦每个其他项目都发送到 Mongo -> 检查是否找到链 -> 如果没有:将抓取的用户的朋友用户名放入 QUEUE -> 弹出 QUEUE。
  6. 一旦找到链 -> 抓取 + 写入新链(如果找到)并弹出直到 QUEUE 为空
  7. 返回所有找到的链

登录过程只是一个创建 Selenium 实例,成功登录并返回 webdriver 实例的函数,该实例进一步传递给蜘蛛。

目前我无法理解如何组织 QUEUE 过程。我可以将单个用户名或列表传递给蜘蛛,但不知道如何根据爬行结果将更多作业传递给同一个蜘蛛。

我开始为单个用户进行爬网,如下所示:

process = CrawlerProcess(config)
process.crawl(FacebookSpider, <username>, session)
process.start()

我将如何在不停止蜘蛛的情况下将新用户名添加到 QUEUE(在一次爬网完成并处理项目之后)?或者也许方法应该是“等待蜘蛛完成工作”->“创建新的”?

我已经尝试过翻阅 Scrapy 文档,但对于像我这样的新手来说,它是压倒性的。我尝试使用 CrawlerRunner,但无法正常工作。

标签: pythonseleniumscrapy

解决方案


推荐阅读