python - 如何动态地将作业添加到 Scrapy/Selenium 蜘蛛?
问题描述
我正在使用 Scrapy + Selenium 来抓取 Facebook 好友数据。我想编写一个程序,它将 2 个用户名作为输入,递归地抓取他们的好友列表,直到找到连接 2 个用户的链。我的蜘蛛可以登录、生成项目并将它们发送到 MongoDB(通过管道)。我有一个可以向 Mongo 查询以检查链是否存在并返回的工作函数。我对算法的看法:
- 获取输入(2 个用户名)
- 将 2 个用户放入爬取 QUEUE
- Facebook登入
- 弹出 QUEUE 并开始爬取
- 一旦每个其他项目都发送到 Mongo -> 检查是否找到链 -> 如果没有:将抓取的用户的朋友用户名放入 QUEUE -> 弹出 QUEUE。
- 一旦找到链 -> 抓取 + 写入新链(如果找到)并弹出直到 QUEUE 为空
- 返回所有找到的链
登录过程只是一个创建 Selenium 实例,成功登录并返回 webdriver 实例的函数,该实例进一步传递给蜘蛛。
目前我无法理解如何组织 QUEUE 过程。我可以将单个用户名或列表传递给蜘蛛,但不知道如何根据爬行结果将更多作业传递给同一个蜘蛛。
我开始为单个用户进行爬网,如下所示:
process = CrawlerProcess(config)
process.crawl(FacebookSpider, <username>, session)
process.start()
我将如何在不停止蜘蛛的情况下将新用户名添加到 QUEUE(在一次爬网完成并处理项目之后)?或者也许方法应该是“等待蜘蛛完成工作”->“创建新的”?
我已经尝试过翻阅 Scrapy 文档,但对于像我这样的新手来说,它是压倒性的。我尝试使用 CrawlerRunner,但无法正常工作。
解决方案
推荐阅读
- postgresql - 我可以将 AWS AppSync 与自托管 PostgreSQL 一起使用吗?
- php - 通过 php 服务器提供的图像名称中的变音符号 (äöü)
- python-3.x - 为 urllib 提供一个列表并将结果输出到单个文件
- sql - 如何使用 sql 查询基于逻辑获取输出列
- hibernate - 具有多个实例的应用程序上的 JPA PESSIMISTIC_WRITE
- python - query = SELECT id (...) 返回整个查询
- google-cloud-platform - 将 Actions on Google 项目移动到不同的 Google 电子邮件帐户?
- asp.net - CsvHelper GetRecords 没有结果
- java - 将 View 动画直接应用到 Drawable 而不是整个 View
- dart - 颤动水平滚动图像和小部件