请求失败并显示504:在使用zyte的Docker合成中使用scrapy-splash时网关超时

8wtpewkr  于 2022-11-09  发布在  Docker
关注(0)|答案(2)|浏览(193)

我试图刮一个网站,其中部分呈现内容使用JS。
我找到了这个项目:https://github.com/scrapinghub/sample-projects/tree/master/splash_smart_proxy_manager_example,它非常清楚地解释了如何设置。下面是我现在拥有的内容:
坞缀:

version: '3.8'

services:
    scraping:
        build:
            context: .
            dockerfile: Dockerfile
        volumes:
            - "./scraping:/scraping"
        environment:
            - PYTHONUNBUFFERED=1
        depends_on:
            - splash
        links:
            - splash
    splash:
        image: scrapinghub/splash
        restart: always
        expose:
            - 5023
            - 8050
            - 8051
        ports:
            - "5023:5023"
            - "8050:8050"
            - "8051:8051"

蜘蛛:

class HappySider(scrapy.Spider):
    ...
    custom_settings = {
        'DUPEFILTER_CLASS': 'scrapy_splash.SplashAwareDupeFilter',
        'SPIDER_MIDDLEWARES': {
            'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
        },
        'DOWNLOADER_MIDDLEWARES': {
            'scrapy_splash.SplashCookiesMiddleware': 723,
            'scrapy_splash.SplashMiddleware': 725,
            'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
        },
        'ITEM_PIPELINES': {
            'scraping.pipelines.HappySpiderPipeline': 300,
        },
        'RETRY_HTTP_CODES': [500, 502, 503, 504, 522, 524, 408, 429, 403],
        'RETRY_TIMES': 20,
        'DOWNLOAD_DELAY': 5,
        'DOWNLOAD_TIMEOUT': 30,
        'CONCURRENT_REQUESTS': 1,
        'CONCURRENT_REQUESTS_PER_DOMAIN': 1,
        'COOKIES_ENABLED': False,
        'ROBOTSTXT_OBEY': True,
        # enable Zyte Proxy
        'ZYTE_SMARTPROXY_ENABLED': True,
        # the APIkey you get with your subscription
        'ZYTE_SMARTPROXY_APIKEY': '<my key>',
        'SPLASH_URL': 'http://splash:8050/',
    }

    def __init__(self, testing=False, name=None,**kwargs):
        self.LUA_SOURCE = get_data(
            'scraping', 'scripts/smart_proxy_manager.lua'
        ).decode('utf-8')
        super().__init__(name,**kwargs)

    def start_requests(self):

        yield SplashRequest(
            url='https://www.someawesomesi.te',
            endpoint='execute',
            args={
                'lua_source': self.LUA_SOURCE,
                'crawlera_user': self.settings['ZYTE_SMARTPROXY_APIKEY'],
                'timeout': 90,
            },
            # tell Splash to cache the lua script, to avoid sending it for every request
            cache_args=['lua_source'],
            meta={
                'max_retry_times': 10,
            },
            callback=self.my_callback
        )

我得到的输出是:

2022-08-10 13:09:32 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET https://www.someawesomesi.te via http://splash:8050/execute> (failed 1 times): 504 Gateway Time-out

我不知道如何继续。我确实查了一下为什么它会给我504,splash docks确实建议了一些处理它的方法...但是我没有太多的并发URL,脚本在第一个失败了。另外,我正在刮的网站非常快,如果我只是使用Zyte而不使用splash,那么它刮得非常快。
因此,如果有人能建议这里有什么问题,以及如何解决它-我将非常感谢。

r6hnlfcb

r6hnlfcb1#

Splash很快就要被弃用了。你可以使用智能代理管理器和无头浏览器库来渲染JS。Zyte最近推出了三个无头浏览器库。

  1. Zyte SmartProxy Puppeteer.
  2. Zyte SmartProxy Playwright.
  3. Zyte SmartProxy Selenium.
    这些客户端库是在Chromium、Firefox和WebKit的本地库之上构建的,可以与Zyte智能代理管理器无缝协作。使用这些库,您将不再需要在后台运行一个单独的软件(如splash)来帮助连接Zyte智能代理管理器。
    1.我的建议是使用Zyte API。Zyte API是一个端到端的API解决方案,它可以执行Web抓取序列中的所有任务。它可以提取动态加载的网页内容,而无需花费时间通过JavaScript、无头浏览器库和额外的请求来重新创建浏览器所做的事情。
    对于此特定解决方案,请遵循以下文档。只需设置javascript参数:至
    在浏览器渲染过程中打开或关闭JavaScript。它只是工作...
    我在Zyte担任开发人员倡导者。
mzillmmw

mzillmmw2#

这个例子对我来说也不是现成的。把splash_smart_proxy_manager_example/scripts/smart_proxy_manager.lua中指定的Zyte智能代理管理器的端口号改为8010会有所帮助。

local port = 8010

8010在较早的示例中使用

相关问题