【问题标题】:How to get list of url and use in scrapy python for web data extraction如何获取 url 列表并在 scrapy python 中用于 Web 数据提取
【发布时间】:2025-12-10 07:55:02
【问题描述】:

我正在使用 scrapy python 创建网络爬虫。这是我的代码

import scrapy

class BlogSpider(scrapy.Spider):
    name = 'blogspider'
    start_urls = [
    'https://perfumehut.com.pk/shop/',
]

    def parse(self, response):

            yield {
                    'product_link': response.css('a.product-image-link::attr("href")').get(),
                    'product_title': response.css('h3.product-title>a::text').get(),
                    'product_price': response.css('span.price > span > bdi::text').get(),

                }
            next_page = response.css('ul.page-numbers>li>a.next.page-numbers::attr("href")').get()

            if next_page is not None:
                print()
                print(next_page)
                print()
                yield scrapy.Request(next_page)

    def parse(self, response):
        yield {
        'title': response.css('h1::text').get(),
        'batt': response.css('td.woocommerce-product-attributes-item__value p::text')[3].get(),
        'brand': response.css('div.woodmart-product-brand img::attr(alt)').get(),
        'brandimg': response.css('div.woodmart-product-brand img::attr(src)').get(),        
        'price': response.css('p.price').xpath('./span/bdi/text()').get(),
        'r-price': response.css('p.price').xpath('./del/span/bdi/text()').get(),
        's-sale': response.css('p.price').xpath('./ins/span/bdi/text()').get(),
        'breadcrumbs': response.css('nav.woocommerce-breadcrumb a::text').getall(),
        'tags': response.css('span.tagged_as a::text').getall(),
        'attributes': response.css('td.woocommerce-product-attributes-item__value p::text').getall(),
        'img': response.css('figure.woocommerce-product-gallery__image a::attr("href")').getall(),
        'description': response.css('div.woocommerce-product-details__short-description p::text').get(),
        'description1': response.css('#tab-description > div > div > p::text').getall(),
        'description2': response.css('#tab-description > div > div > div > div > div > div > div > div > p::text').getall()
        }

这是一个 woocommerce 网站。 共有 57 页,每页 12 个产品。 估计共有 684 种产品。

但是我的代码什么也没返回。

我在抓取 URL 时做错了什么?

【问题讨论】:

    标签: python python-3.x web-scraping woocommerce scrapy


    【解决方案1】:

    要提取所有页面信息,您需要提取下一页 url,然后解析该 url。

    这是一个简单的例子,我认为这可以帮助您解决问题。

    import scrapy
    
    class BlogSpider(scrapy.Spider):
        name = 'blogspider'
        start_urls = [
        'https://perfumehut.com.pk/shop/',
    ]
    
        def parse(self, response):
    
                yield {
                        'product_link': response.css('a.product-image-link::attr("href")').get(),
                        'product_title': response.css('h3.product-title>a::text').get(),
                        'product_price': response.css('span.price > span > bdi::text').get(),
    
                    }
                next_page = response.css('ul.page-numbers>li>a.next.page-numbers::attr("href")').get()
    
                if next_page is not None:
                    print()
                    print(next_page)
                    print()
                    yield scrapy.Request(next_page)
    

    【讨论】:

    • 先生,我的完整代码是什么,实际上我需要从每个 url 中提取数据意味着单个产品页面
    • 您可以从所有页面中提取每个产品 url,然后遍历每个产品 url 以收集所需的数据。
    • 先生,我已经用您的代码更新了有问题的代码,但它在 csv 中没有返回任何内容。你能告诉我我在哪里做错了吗
    • 您应该删除第二个解析方法。这不是您提取数据的方式。
    • 先生,我在 scrapy 中运行您的代码,它只提供每个页面中第一个产品的数据。每页有12个产品,它只返回每页第一项的数据。
    【解决方案2】:

    好的,应该这样做:

    class BlogSpider(scrapy.Spider):
        name = 'blogspider'
        start_urls = [
            'https://perfumehut.com.pk/shop/',
        ]
    
        def parse(self, response):
            for item in response.css(".product-grid-item"):
                yield {
                    'product_link': item.css('a.product-image-link::attr("href")').get(),
                    'product_title': item.css('h3.product-title > a::text').get(),
                    'product_price': item.css('span.price > span > bdi::text').get(),
                }
            next_page = response.css('a.next:contains(→)::attr("href")').get()
    
            if next_page:
                yield scrapy.Request(next_page)
    

    【讨论】:

    • 虽然这段代码可能会回答这个问题,including an explanation 关于如何或为什么解决问题将真正有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。