首页 > 解决方案 > Python3 抓取一页的所有信息

问题描述

我的蜘蛛:

import scrapy

class LinkSpider(scrapy.Spider):
    name = "page"

    start_urls = [
        'https://www.topart-online.com/de/Blattzweige-Blatt-und-Bluetenzweige/l-KAT282?seg=1'
        ]

    def parse(self, response):
        yield{
            'ItemSKU': response.xpath('//span[@class="sn_p01_pno"]/text()').getall(),
            'title': response.xpath('//div[@class="sn_p01_desc h4 col-12 pl-0 pl-sm-3 pull-left"]/text()').getall(),
            'ItemEAN': response.xpath('//div[@class="productean"]/text()').getall(),
            'Delivery_Status': response.xpath('//div[@class="availabilitydeliverytime"]/text()').getall()

        }

如何将我的值分开,我得到一个带有第 1 行的 csv 文件:itemsku,title,itemean,deliverystatus 和正确的值?现在我的 csv 全部存储在一行中,所以都是 skus,所有标题等等。 我的csv文件

标签: python-3.xxpathweb-scrapingscrapy

解决方案


getall()抓取您尝试使用 XPATH 选择器获取的所有值的列表。因此,它将键“ITEMSKU”的值例如放在列表中[item1,item2,item3,item4]

为了获得标题等,您需要使用该get()方法。但在此之前,您需要更详细地检查 HTML。您尝试从中获取数据的页面在单独的“卡片”中包含信息。获取您想要的单个数据ITEMSKU等的最合乎逻辑的方法是循环每个“卡片”,然后生成ITEMSKUwith的字典get()

您还需要检查您的 XPATH 选择器,因为 productean 不在该页面上。它在每个项目自己的链接中,但不在您正在抓取的页面上。

代码示例

import scrapy

class LinkSpider(scrapy.Spider):
    name = "link"
    allow_domains = ['topart-online.com']
    start_urls = ['https://www.topart-online.com/de/Blattzweige-Blatt-und-Bluetenzweige/l-KAT282?seg=1']
    
    def parse(self, response):
        card = response.xpath('//a[@class="clearfix productlink"]')
        for a in card:
            yield{
                'title': a.xpath('.//div[@class="sn_p01_desc h4 col-12 pl-0 pl-sm-3 pull-left"]/text()').get().strip(),
                'links': a.xpath('@href').get(),
                'ItemSKU': a.xpath('.//span[@class="sn_p01_pno"]/text()').get().strip(),
                'ItemEAN': a.xpath('.//div[@class="productean"]/text()').get(),
                'Delivery_Status': a.xpath('.//div[@class="availabilitydeliverytime"]/text()').get().strip().replace('/','')
                }

解释

页面上的每个项目都在一张卡片内。变量 XPATH 选择器为我们提供了这些卡片的card列表。我们可以循环的列表。

然后我们围绕这些卡中的每一个进行循环。请注意,我们使用a.xpath而不是response.xpath. 那是因为我们要从每张卡片中选择数据。

另请注意,在每个 XPATH 选择器的开头,我们使用.//而不是//.

.//告诉 scrapy 我们要查看每个卡片变量的子元素,而不是整个 HTML 文档。请记住//搜索整个 HTML 文档。这称为相对 XPATH,当您有一个“卡片”列表要从每个单独的卡片中获取数据时,与每个 XPATH 选择器一起放置是很重要的。

请注意,我们使用strip()字符串方法去除运行此代码时获得的任何开始和结束空白。

另请注意,对于交付状态,数据中有一个“/”,因此使用替换字符串方法将其替换为“”可以摆脱它。


推荐阅读