首页 > 解决方案 > 如何在 AWS Lambda 函数中附加代理以避免“403 禁止错误”?

问题描述

我正在制作一个抓取网站数据并通过 AWS Lambda 函数将其插入到 dynamoDB 的爬虫

有时它工作正常 - 返回我想要的所有数据,状态为 200。有时它不会因为 403(禁止)状态而爬行。

我检查了在 AWS Cloud9 上出现 403 Forbidden 错误的可能性会比在 AWS Lambda 上少:AWS Cloud9 上运行了 100 个函数,并且只有 3 个 Forbidden,AWS Lambda 上运行了 100 个函数和 78 Forbidden。所以我认为我应该尝试使用 AWS Lambda 网络设置做一些事情,比如附加代理或其他东西,但是,我该怎么做呢?

我已经尝试过爬虫的设置,例如:

process = CrawlerProcess({
    'USER_AGENT':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3)    AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10',
    'ROBOTSTXT_OBEY':False,
    'DOWNLOAD_DELAY': random.randint(1,10),
    'DOWNLOAD_TIMEOUT': random.randint(80,150),
    'REDIRECT_ENABLED':False,
    'SPIDER_MIDDLEWARES' : {
        'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware':True
    }
})

以前的设置是:

process = CrawlerProcess({
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})

但这没有区别:在 cloud9 上仍然可以正常工作,有时(很少)在 AWS Lambda 上很好

UPD:我发现我在白天(从大约 8:00 到 22:00)获得 403 禁止状态,而在夜间我大多获得 200 ok 状态,所以我认为这是因为允许和禁止机器人进入的站点权限一天中的不同时段,但为什么通过 AWS cloud9 运行相同的脚本即使在白天也能正常运行,而 AWS lambda 大多不是?

预先为语法道歉

标签: proxyscrapyaws-lambdaaws-sdkhttp-status-code-403

解决方案


推荐阅读