使用python 3进行网络抓取。我有一个URL列表,每个URL都有100多个文章URL(包括分页)。
在lambda中添加了脚本。首先,它从CSV文件中读取URL,并将每个主要URL发送到选择每个文章的所有href的函数。
以上所有过程都可以正常工作。
问题是,据我们所知,lambda的时间不足15分钟,因此我们需要重新运行URL页面号和其余URL的终点。
CSV文件被熊猫读取,并转换为目录。 从字典中选择一个对象,然后使用页面的正则表达式(要分页(分页)的页面数)传递给函数。
我们能否将当前页面和其余URL相同地存储在lambda和renun的本地文件夹中,如果可以的话,我们该怎么做。
答案 0 :(得分:2)
Lambda中的本地存储不保证一致性。一个新的Lambda实例将被触发,您将丢失该数据。
我建议您进行Cloudwatch cron事件,该事件将触发Lambda(我们将其称为DispatcherLambda)。该lambda会查看CSV文件(也许可以像DynamoDB中那样更好地存储数据),并决定如何拆分工作。例如:
1-10 URLs: worker #1
11-20 URLs: worker #2
...
一旦确定,该lambda会将事件发布到SQS队列(事件输入将包含该范围)。订阅到队列后,将有另一个Lambda(可以说是WorkerLambda)进行实际的抓取。这样,您就不会有任何超时问题,可以更快地完成工作(调用并行性),并且容错性更高(如果Lambda失败,SQS可以再次触发它)。
答案 1 :(得分:0)
对于 Step Functions 状态机来说,这是一个非常好的案例。使用状态机,您可以在时间不足时退出 Lambda 并返回有关您在过程中所处位置的信息。然后,该信息可以在下一次执行时传递到 Lambda 中,循环直到您返回表明您已完成的内容。使用循环可以持续长达一年的标准工作流程(希望不会花那么长时间)。