scrapy:如何收集仅通过点击“显示更多项目”按钮显示的项目?

时间:2017-08-09 06:33:39

标签: python-2.7

我使用scrapy从网站收集产品:https://www.coop.nl/boodschappen/groenten-en-aardappelen 但有些产品只能通过按下按钮显示: Toon meer producten 我尝试使用Roll进入按钮但没有成功 它只收集了12个显示的第一个项目。 如何收集这些产品的数据?

这是我的代码:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
import re

class Product(scrapy.Item):
    barcode = scrapy.Field()
    name = scrapy.Field()

class BarcodessSpider(CrawlSpider):
    name = "coop_barcodes"
    allowed_domains = ["www.coop.nl"]
    start_urls = [
        "https://www.coop.nl/boodschappen/groenten-en-aardappelen/roerbakgroenten/roerbakgroenten"
    ]

    rules = (Rule(LinkExtractor(allow=('https:.*',),  
                           restrict_xpaths='//*[(@id = "showMoreProductsContainer")] | //*[contains(concat( " ", @class, " " ), concat( " ", "btn", " " ))]'),
                           callback='parse_item1',
                           follow=True),)

    items = []

    def parse_item1(self, response):
        for product in response.xpath('//@href'): 
            prod = product.root
            if re.match('\d{8}\d+',str(prod).split('/')[-1]) != None:
                 self.items.append(name)
        for item in self.items:
            yield item

1 个答案:

答案 0 :(得分:0)

使用动态加载的网站通常必须发送HTTP请求以获取新内容,Chrome可以捕获这些内容(我不知道如何在其他浏览器中执行此操作)。在Chrome中打开该网站,按F12并转到“控制台”标签。右键单击空白控制台,然后选择" LogXMLHttpRequests"。然后按"加载更多"按钮(或任何触发加载的东西)。您应该会在控制台中看到一个或几个URL。具有GET请求的那个是你想要的。在您的网站中,link会为您提供所有已加载产品的精美JSON列表。

在这些情况下,我建议直接通过这些URL进行抓取(在URL中注意如何更改PageNumber和PageSize进行导航)而不是主站点。