我正在尝试用Scrapy Splash保存抓取的网页截图。我已经将这里的代码复制并粘贴到我的管道文件夹中: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我还遵循了这里提供的设置splash的说明: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()。我想我可能需要修改一下源代码?
发布于 2021-02-10 14:29:38
你应该在爬行器中的脚本中使用scrapy-splash,而不是在管道中。
我遵循了这个docs,它对我很有效。
https://stackoverflow.com/questions/60639837
复制相似问题