使用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
相关产品推荐
相关产品推荐

