scrapy 如何在xml网站Map中只获取产品页面url

3ks5zfa0  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(150)

我正在使用Scrapy的xml提要蜘蛛网站Map来抓取和提取url,而且只有url。
xml站点Map如下所示:

<url>
<loc>
https://www.example.com/american-muscle-5-pc-kit-box.html
</loc>
<lastmod>2020-10-14T15:40:02+00:00</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
<image:image>
<image:loc>
https://www.example.com/pub/media/catalog/product/cache/de5bc950da2c28fc62848f9a6b789a5c/1/2/1202_45.jpg
</image:loc>
<image:title>
5 PC. GAUGE KIT, 3-3/8" & 2-1/16", ELECTRIC SPEEDOMETER, AMERICAN MUSCLE
</image:title>
</image:image>
<PageMap>
<DataObject type="thumbnail">
<Attribute name="name" value="5 PC. GAUGE KIT, 3-3/8" & 2-1/16", ELECTRIC SPEEDOMETER, AMERICAN MUSCLE"/>
<Attribute name="src" value="https://www.example.com/pub/media/catalog/product/cache/de5bc950da2c28fc62848f9a6b789a5c/1/2/1202_45.jpg"/>
</DataObject>
</PageMap>
</url>

我只想获取<loc></loc>的内容
因此,我把我的Scrapy Spider设计成这样(为了简洁起见,省略了一些部分):

start_urls = ['https://www.example.com/sitemap.xml']
    namespaces = [('n', 'http://www.sitemaps.org/schemas/sitemap/0.9')]
    itertag = 'url'

def parse_node(self, response, selector):
    item = {}
    item['url'] = selector.select('url').get()
    selector.remove_namespaces()
    yield {
        'url': selector.xpath('//loc/text()').getall()
    }

这最终给了我所有产品图片的url和url。我怎么才能设置这个蜘蛛只得到实际的产品页面url?

332nm8kg

332nm8kg1#

为了更改站点Map蜘蛛逻辑的这一部分,需要覆盖It's _parse_sitemap方法(源代码)
和替换部分

elif s.type == 'urlset':
        for loc in iterloc(it, self.sitemap_alternate_links):
            for r, c in self._cbs:
                if r.search(loc):
                    yield Request(loc, callback=c)
                    break

被这样的东西

elif s.type == 'urlset':
        for entry in it:
            item = entry #entry - sitemap entry parsed as dictionary by Sitemap spider
            ...
            yield item # instead of making request - return item

在这种情况下,spider应该从已解析的站点Map条目中返回项目,而不是对每个链接都发出请求

相关问题