Python 刮痕-重复前2页和完成部分
在开始之前,我会说我在一般情况下很少有编码经验。我目前正在使用Scrapy和Python 3.5为家得宝的网站获取SKU#和定价值。使用零碎的教程文档,我成功地将正确的数据整合到一起,并进入下一页 问题是,在Scrapy生成第二页项目后,它会再次返回到第一页,然后在关闭前重复。从本质上讲,它只是运行Url 1->Url 2->Url 1->Url->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
# -*- 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&Nao=48&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&Nao=48&Ns=None" data-pagenumber="3">
</a>
</li>
因此,您不仅需要根据类来选择它,还需要根据
标题来选择它。您可以使用xpath选择器,像这样重写代码next=response.xpath('//a[contains(@title,“next”)]/@href')。extract_first()
值得注意的是,scrapy“过滤器”默认情况下会重复请求。因此,如果发生这种情况,则意味着每次访问同一页面时都会有一个新的url(或类似于标题的不同内容)。