【问题标题】:use scrapy to crawl node使用scrapy爬取节点
【发布时间】:2016-04-20 19:37:21
【问题描述】:

我正在尝试使用 scrapy 从this 网站抓取一些广告信息。 该网站有一些带有class="product-card new_ outofstock installments_ "div 标签。

当我使用时:

items = response.xpath("//div[contains(@class, 'product-')]")

我得到一些具有类属性 = "product-description" 但不是 "product-card" 的节点。

当我使用时:

items = response.xpath("//div[contains(@class, 'product-card')]")

我仍然没有得到任何结果。

为什么会这样?

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    如上一个答案中所指出的,您尝试抓取的内容是使用 javascript 动态生成的。如果性能对您来说不是什么大问题,那么您可以使用 Selenium 来模拟真实用户并与站点进行交互。同时你可以让 Scrapy 为你获取数据。

    如果您想了解如何执行此操作的类似示例,请参考本教程:http://www.6020peaks.com/2014/12/how-to-scrape-hidden-web-data-with-python/

    【讨论】:

      【解决方案2】:

      您想要的数据正在由 javascripts 填充。

      您必须使用selenium webdriver 来提取数据。

      如果您想事先检查数据是否正在使用 javascript 填充,请打开一个 scrapy shell 并尝试按如下方式提取数据。

      scrapy shell 'http://www.lazada.vn/dien-thoai-may-tinh-bang/?ref=MT'
      
      >>>response.xpath('//div[contains(@class,"product-card")]')
      

      输出:

      []
      

      现在,如果您在浏览器中使用相同的 Xpath 并获得如下结果:

      然后使用脚本填充数据,并且必须使用 selenium 来获取数据。

      这是一个使用 selenium 提取数据的示例:

      import scrapy
      from selenium import webdriver
      from scrapy.http import TextResponse
      
      class ProductSpider(scrapy.Spider):
          name = "product_spider"
          allowed_domains = ['lazada.vn']
          start_urls = ['http://www.lazada.vn/dien-thoai-may-tinh-bang/?ref=MT']
      
          def __init__(self):
              self.driver = webdriver.Firefox()
      
          def parse(self, response):
              self.driver.get(response.url)
              page = TextResponse(response.url, body=self.driver.page_source, encoding='utf-8')
              required_data = page.xpath('//div[contains(@class,"product-card")]').extract()
      
              self.driver.close()
      

      以下是“硒蜘蛛”的一些示例:

      1. Executing Javascript Submit form functions using scrapy in python
      2. Snipplr
      3. Scrapy with selenium
      4. Extract data from dynamic webpages

      【讨论】:

      • 谢谢,但我得到了错误:NameError:未定义全局名称'TextResponse'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      相关资源
      最近更新 更多