Python中使用CrawlSpider+Scrapy-Splash爬取美的商城商品信息,部分商品页缺失如何解决?

<div class=“paginator”><span class=“page-start”>&lt;</span><span class=“page-this”>1</span><a href="#nolink" pagetag=“go” pageid=“2”>2</a><a href="#nolink" class=“page-next” pagetag=“go” pageid=“2”>&gt;</a></div> 由于商品列表的下一页没有相对链接进去,所以采用 scrapy-splash,感觉并没有实现翻页功能,因为后面几页商品列表中的商品详情页并没有爬取到!
Python中使用CrawlSpider+Scrapy-Splash爬取美的商城商品信息,部分商品页缺失如何解决?


1 回复

我遇到类似问题,通常是因为Splash渲染时机不对。试试在CrawlSpider规则里调整wait参数,并添加timeout控制:

import scrapy
from scrapy_splash import SplashRequest
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class MideaSpider(CrawlSpider):
    name = 'midea'
    allowed_domains = ['midea.com']
    start_urls = ['https://mall.midea.com']
    
    rules = (
        Rule(LinkExtractor(allow=r'/product/\d+'), 
             callback='parse_product', 
             process_request='splash_request'),
    )
    
    def splash_request(self, request):
        return SplashRequest(
            request.url,
            args={
                'wait': 2.5,  # 关键:等待页面完全加载
                'timeout': 90,
                'resource_timeout': 10,
                'images': 0  # 禁用图片加速
            },
            endpoint='render.html',
        )
    
    def parse_product(self, response):
        # 检查页面是否完整加载
        if not response.css('.product-detail'):
            self.logger.warning(f'页面不完整: {response.url}')
            # 可考虑重试或记录缺失URL
            yield None
        else:
            yield {
                'title': response.css('.product-title::text').get(),
                'price': response.css('.product-price::text').get(),
                'url': response.url
            }

如果还有缺失,可能是动态加载内容。在Splash参数里加'wait': 0.5, 'js_source': 'window.scrollTo(0, document.body.scrollHeight)'模拟滚动。另外检查robots.txt和频率限制。

总结:调wait参数和超时设置。

回到顶部