Scrapy Splash屏幕截图管道不起作用

时间:2020-03-11 15:48:22

标签: python scrapy scrapy-splash

我正在尝试使用Scrapy Splash保存抓取的网页的屏幕截图。我已将此处找到的代码复制并粘贴到我的管道文件夹中:https://docs.scrapy.org/en/latest/topics/item-pipeline.html

这是网址中的代码:

import scrapy
import hashlib
from urllib.parse import quote


class ScreenshotPipeline(object):
    """Pipeline that uses Splash to render screenshot of
    every Scrapy item."""

    SPLASH_URL = "http://localhost:8050/render.png?url={}"

    async def process_item(self, item, spider):
        encoded_item_url = quote(item["url"])
        screenshot_url = self.SPLASH_URL.format(encoded_item_url)
        request = scrapy.Request(screenshot_url)
        response = await spider.crawler.engine.download(request, spider)

        if response.status != 200:
            # Error happened, return item.
            return item

        # Save screenshot to file, filename will be hash of url.
        url = item["url"]
        url_hash = hashlib.md5(url.encode("utf8")).hexdigest()
        filename = "{}.png".format(url_hash)
        with open(filename, "wb") as f:
            f.write(response.body)

        # Store filename in item.
        item["screenshot_filename"] = filename
        return item

我还遵循了以下设置飞溅的说明:https://github.com/scrapy-plugins/scrapy-splash

当我调用命令scrapy crawl spider时,除了管道之外,所有其他东西都可以正常工作。 这是我看到的“错误”。

<coroutine object ScreenshotPipeline.process_item at 0x7f29a9c7c8c0>

蜘蛛会正确产生物品,但不会处理该物品。

有人有什么建议吗?谢谢。

编辑:

我认为这是怎么回事,Scrapy像往常一样正在调用process_item()方法。但是根据这些文档:https://docs.python.org/3/library/asyncio-task.html必须以不同的方式调用协程对象。

asyncio.run(process_item())而不是process_item()。 我想我可能必须修改源代码?

1 个答案:

答案 0 :(得分:0)

你应该在蜘蛛内部的脚本中使用scrapy-splash,而不是在管道中。

我关注了这个 docs,它对我有用。