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)
- 在
items.py定义字段:
import scrapy class AlibabaItem(scrapy.Item): description = scrapy.Field() # 产品描述 image_urls = scrapy.Field() # 图片URL列表 images = scrapy.Field() # 下载后的图片信息(路径、哈希值等)
- 在
settings.py启用图片管道:
ITEM_PIPELINES = { 'scrapy.pipelines.images.ImagesPipeline': 1, } IMAGES_STORE = './alibaba_product_images' # 图片保存路径
- 解析时将图片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
相关产品推荐
相关产品推荐

