Я пытаюсь сохранить скриншоты очищенных веб-страниц с помощью Scrapy Spla sh. Я скопировал и вставил код, найденный здесь, в папку конвейера: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
Вот код из URL:
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
Я также следовал инструкциям по настройке spla sh, найденным здесь: 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 (). Я думаю, что мне, возможно, придется изменить исходный код?