首页 > 解决方案 > 如何获取url列表并在scrapy python中用于Web数据提取

问题描述

我正在使用 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 时做错了什么?

标签: pythonpython-3.xweb-scrapingwoocommercescrapy

解决方案


要提取所有页面信息,您需要提取下一页 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)

推荐阅读