使用scrapy来抓取节点

时间:2016-01-15 08:43:27

标签: python scrapy

我尝试使用scrapy从this网站抓取一些广告信息。 该网站的div标记为class="product-card new_ outofstock installments_ "

当我使用时:

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

我得到了一个类属性为"product-description"但没有"product-card"的节点。

当我使用时:

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

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

为什么?

2 个答案:

答案 0 :(得分:0)

您想要的数据由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并获得如下结果: enter image description here

然后使用脚本填充数据,并且必须使用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

答案 1 :(得分:0)

正如前面的回答所指出的,您尝试抓取的内容是使用javascript动态生成的。如果性能对您来说不是很重要,那么您可以使用Selenium来模拟真实用户并与该站点进行交互。与此同时,您可以让Scrapy为您获取数据。

如果您想要一个类似的示例,请考虑本教程:http://www.6020peaks.com/2014/12/how-to-scrape-hidden-web-data-with-python/