代码之家  ›  专栏  ›  技术社区  ›  traiantomescu

刮痧不在OBD现场工作

  •  0
  • traiantomescu  · 技术社区  · 8 年前

    我想在oneblockdown上使用scrapy spider。它可以从最新的产品中获取所有产品,并将其存储到数据库中。

    我的监视器中的一些站点正在工作,但OBD之类的某些站点不工作,没有向db上传任何内容。这是我的职责:

    class OneBlockDownSpider(Spider):
    
    name = "OneBlockDownSpider"
    allowded_domains = ["oneblockdown.it"]
    start_urls = [OneBlockDownURL]
    
    def __init__(self):
        logging.critical("OneBlockDown STARTED.")
    
    def parse(self, response):
        products = Selector(response).xpath("//div[@id='product-list']")
    
        for product in products:
            item = OneBlockDownItem()
            item['name'] = product.xpath('.//div[@class="catalogue-product-title"]//h3').extract.first
            item['link'] = product.xpath('.//div[@class="catalogue-product-title"]//h3/a/@href').extract.first
            # # item['image'] = "http:" + product.xpath("/div[@class='catalogue-product-cover']/a[@class='catalogue-product-cover-image']/img/@src").extract()[0]
            # item['size'] = '**NOT SUPPORTED YET**'
            yield item
    
        yield Request(OneBlockDownURL, callback=self.parse, dont_filter=True, priority=15)
    

    我想我使用了错误的xpath,但我无法解决它

    2 回复  |  直到 8 年前
        1
  •  0
  •   gangabass    8 年前

    首先 该站点受Cloudflare保护 (防止刮伤)。

    此外,您的代码也存在一些问题:

    1. 你的 products 是单个节点
    2. 您正在使用 extract.first 而不是 extract_first()

      products = response.xpath("//div[@id='product-list']/div")
      
      for product in products:
          item = OneBlockDownItem()
          item['name'] = product.xpath('.//div[@class="catalogue-product-title"]//h3').extract_first()
          item['link'] = product.xpath('.//div[@class="catalogue-product-title"]//h3/a/@href').extract_first()
          yield item
      
        2
  •  0
  •   VMRuiz abin    8 年前

    你应该以 '.' 使用类似于相对选择器的产品时:

    item['image'] = "http:" + product.xpath("./div[@class='catalogue-product-cover']/a[@class='catalogue-product-cover-image']/img/@src").extract()[0]
    

    否则,它将尝试使用以下xpath获取元素: /body/div[@class='catalogue-product-cover']