You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy新手求助:爬取阿里巴巴产品描述及图片遇问题

Scrapy爬取阿里巴巴产品描述与图片实操方案

一、反爬基础配置(必做)

阿里巴巴反爬机制严格,先在settings.py里配置基础参数:

  • 设置真实用户代理:
    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    
  • 增加请求延迟,避免触发频率限制:
    DOWNLOAD_DELAY = 2
    
  • 若遇到登录验证,可手动登录后复制Cookie到请求头,或启用Cookie持久化:
    COOKIES_ENABLED = True
    

二、页面解析:静态/动态处理

1. 静态页面解析(优先尝试)

先检查页面源码是否包含目标数据,用XPath/CSS选择器提取:

  • 产品描述:通常在富文本容器中,用string(.)提取纯文本
  • 产品图片:提取图片标签的src属性,注意用response.urljoin()补全绝对URL

2. 动态页面处理(静态解析失效时)

阿里部分页面依赖JS渲染,需用Scrapy-Splash渲染页面:

  • 安装依赖:pip install scrapy-splash
  • 启动Splash服务(Docker方式最便捷):docker run -p 8050:8050 scrapinghub/splash
  • 在settings.py配置Splash:
    SPLASH_URL = 'http://localhost:8050'
    DOWNLOADER_MIDDLEWARES = {
        'scrapy_splash.SplashCookiesMiddleware': 723,
        'scrapy_splash.SplashMiddleware': 725,
        'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }
    DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
    

三、关联产品爬取逻辑

提取当前页面的关联产品链接,生成新请求递归爬取:

  • 用CSS/XPath提取关联产品的相对链接
  • 转成绝对URL后,回调产品解析函数

四、图片下载配置(用Scrapy自带ImagesPipeline)

  1. 在items.py定义字段:
import scrapy

class AlibabaItem(scrapy.Item):
    description = scrapy.Field()  # 产品描述
    image_urls = scrapy.Field()   # 图片URL列表
    images = scrapy.Field()       # 下载后的图片信息(路径、哈希值等)
  1. 在settings.py启用图片管道:
ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline': 1,
}
IMAGES_STORE = './alibaba_product_images'  # 图片保存路径
  1. 解析时将图片URL存入image_urls字段:
image_urls = response.css('div.product-image-container img::attr(src)').getall()
item['image_urls'] = [response.urljoin(url) for url in image_urls]

五、完整爬虫示例

import scrapy
from scrapy_splash import SplashRequest
from your_project.items import AlibabaItem

class AlibabaProductSpider(scrapy.Spider):
    name = 'alibaba_product'
    allowed_domains = ['alibaba.com']
    start_urls = ['你的指定起始链接']

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(
                url,
                callback=self.parse_product,
                args={'wait': 3}  # 等待3秒确保JS加载完成
            )

    def parse_product(self, response):
        item = AlibabaItem()
        # 提取产品描述(根据实际页面结构调整选择器)
        item['description'] = response.xpath('//div[@class="product-description"]/string(.)').get(default='').strip()
        
        # 提取产品图片URL
        raw_image_urls = response.css('ul.product-image-list img::attr(src)').getall()
        item['image_urls'] = [response.urljoin(url) for url in raw_image_urls if url]
        
        yield item

        # 爬取关联产品
        related_links = response.css('div.related-products a::attr(href)').getall()
        for link in related_links:
            full_link = response.urljoin(link)
            yield SplashRequest(
                full_link,
                callback=self.parse_product,
                args={'wait': 3}
            )

注意事项

  • 若遇到图片防盗链,需在请求头添加Referer:
    headers={'Referer': response.url}
    
  • 产品描述若需保留HTML结构,可直接提取片段:
    item['description'] = response.xpath('//div[@class="product-description"]').get()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:00:07