【问题标题】:Scrapy not working on OBD siteScrapy 在 OBD 网站上不起作用
【发布时间】:2018-02-28 10:28:42
【问题描述】:

我正在尝试在 oneblockdown.it 上使用 scrapy-spider 从最新产品中获取所有产品并将它们存储到数据库中。

我的监视器中的某些站点正在运行,但是诸如 OBD 之类的站点无法运行,并且没有将任何内容上传到数据库。这是我的功能:

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,但我无法解决它

【问题讨论】:

    标签: python-2.7 scrapy web-crawler scrapy-spider


    【解决方案1】:

    首先网站受 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
      

    【讨论】:

    • 谢谢,有什么办法可以绕过OBD上的scape block吗?
    • @traiantomescu 首先,您需要在代码中支持 Javascript 才能绕过它
    • 我想我需要,但不是我的代码,所以我需要了解它是如何工作的,我该如何开始实施?
    • @traiantomescu 我建议你从谷歌查询“如何绕过 Cloudflare”开始
    【解决方案2】:

    当使用像 product 这样的相对选择器时,您应该以 '.' 开始所有 xpath:

    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']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      相关资源
      最近更新 更多