Python 刮痕-重复前2页和完成部分

Python 刮痕-重复前2页和完成部分,python,python-3.x,web-scraping,scrapy,Python,Python 3.x,Web Scraping,Scrapy,在开始之前,我会说我在一般情况下很少有编码经验。我目前正在使用Scrapy和Python 3.5为家得宝的网站获取SKU#和定价值。使用零碎的教程文档,我成功地将正确的数据整合到一起,并进入下一页 问题是,在Scrapy生成第二页项目后,它会再次返回到第一页,然后在关闭前重复。从本质上讲,它只是运行Url 1->Url 2->Url 1->Url->2,然后无误地完成。我使用的代码如下: # -*- coding: utf-8 -*- import scrapy class ScraperSp

在开始之前,我会说我在一般情况下很少有编码经验。我目前正在使用Scrapy和Python 3.5为家得宝的网站获取SKU#和定价值。使用零碎的教程文档,我成功地将正确的数据整合到一起,并进入下一页

问题是,在Scrapy生成第二页项目后,它会再次返回到第一页,然后在关闭前重复。从本质上讲,它只是运行Url 1->Url 2->Url 1->Url->2,然后无误地完成。我使用的代码如下:

# -*- coding: utf-8 -*-
import scrapy

class ScraperSpider(scrapy.Spider):
    name = "scraper"
    allowed_domains = ["www.homedepot.com"]
    start_urls = ["http://www.homedepot.com/s/whirlpool?NCNI-5"]

    def parse(self, response):
        for sku in response.css('div.plp-pod'):
            yield {
            'model' : sku.css('div.pod-plp__model::text').extract_first(),
            'price' : sku.css('div.price__wrapper > div:nth-child(1) > span::text').extract_first()
            }

        next = response.css('li.hd-pagination__item.hd-pagination__button > a::attr(href)').extract_first()
        print(next)
        if next is not None:
            next = response.urljoin(next)
            yield scrapy.Request(next, callback=self.parse)

就我通过查看网页所知,第二个URL与第一个URL共享相同的CSS,并且应该请求后续链接。任何帮助都将不胜感激

发生这种情况的原因是“上一步”按钮的外观如下所示:

<li class="hd-pagination__item hd-pagination__button">
    <a class="hd-pagination__link" title="Previous" href="/b/N-5yc1v/Ntk-BrandSearch/Ntt-whirlpool?NCNI-5" data-pagenumber="1">
    </a>
</li>
<li class="hd-pagination__item hd-pagination__button">
    <a class="hd-pagination__link" title="Next" href="/b/N-5yc1v/Ntk-BrandSearch/Ntt-whirlpool?NCNI-5&amp;Nao=48&amp;Ns=None" data-pagenumber="3">
    </a>
</li>
  • 因此,一旦你进入第二页,你就选择了“上一页”按钮。另一方面,“下一步”按钮如下所示:

    <li class="hd-pagination__item hd-pagination__button">
        <a class="hd-pagination__link" title="Previous" href="/b/N-5yc1v/Ntk-BrandSearch/Ntt-whirlpool?NCNI-5" data-pagenumber="1">
        </a>
    </li>
    
    <li class="hd-pagination__item hd-pagination__button">
        <a class="hd-pagination__link" title="Next" href="/b/N-5yc1v/Ntk-BrandSearch/Ntt-whirlpool?NCNI-5&amp;Nao=48&amp;Ns=None" data-pagenumber="3">
        </a>
    </li>
    

  • 因此,您不仅需要根据类来选择它,还需要根据
    标题

    来选择它。您可以使用xpath选择器,像这样重写代码
    next=response.xpath('//a[contains(@title,“next”)]/@href')。extract_first()
    值得注意的是,scrapy“过滤器”默认情况下会重复请求。因此,如果发生这种情况,则意味着每次访问同一页面时都会有一个新的url(或类似于标题的不同内容)。