You need to enable JavaScript to run this app. 使用Scrapy提取图片时脚本仅获取到页面最后一张图的技术求助
优惠活动
大模型
产品
解决方案
定价
更多

使用Scrapy提取图片时脚本仅获取到页面最后一张图的技术求助

导致当前问题的核心原因

  • 逻辑位置完全错位:遍历图片链接的for循环里只做了取单条url的操作,判断图片后缀、拼接HTML片段的代码全部写在了循环外侧。等循环跑完,url变量只会残留最后一次遍历到的图片地址,后续判断、拼接自然只会处理这一张图,这就是输出结果永远只有最后一张图的根本原因。
  • 方法缩进错误:parse解析方法没有缩进到KwikEKartSpider类内部,属于全局函数,Scrapy框架根本识别不到这个自定义解析逻辑,脚本实际无法正常跑通。
  • 域名配置错误:allowed_domains参数不能填写带协议、路径的完整URL,这个参数的匹配规则只认根域名,填完整路径会导致域名校验失效,页面请求会被框架自动拦截。
  • 标签语法错误:拼接的HTML片段里把闭合链接标签</a>错写成了自闭合的<a/>,生成的页面链接无法正常跳转。
  • 文件写入模式不合理:用追加模式a写文件,多次运行脚本会在同一个输出文件里累积大量重复内容。

修正后的可用脚本

import scrapy

class KwikEKartSpider(scrapy.Spider):
    name = "kek"
    allowed_domains = ["tesco.com"]
    start_urls = (
        'https://www.tesco.com/groceries/en-GB/shop/fresh-food/all',
    )

    def parse(self, response):
        # 一次性拿到所有图片的src地址列表
        all_img_urls = response.xpath("//img/@src").getall()
        html_fragment = ""

        # 逐张遍历,符合格式就直接拼接
        for img_url in all_img_urls:
            if any(suffix in img_url for suffix in [".jpg", ".png"]):
                html_fragment += f"""<a href="{img_url}" target="_blank">
                <img src="{img_url}" height="33%" width="33%"/>
                </a>
                """
        # 循环结束后统一写入文件,用覆盖模式避免重复
        with open("frontpage.html", "w", encoding="utf-8") as f:
            f.write(html_fragment)

后续优化提示

  • 大部分电商页面会用懒加载,图片真实地址存在data-src属性而非src上,遇到抓不到图的情况,可以把xpath的取值部分扩展为同时匹配两个属性,写法为//img/@src | //img/@data-src。
  • 写文件时指定encoding="utf-8",避免生成的HTML出现乱码。

内容的提问来源于stack exchange,提问作者Darragh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 05:54:01