我尝试使用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')]")
我仍然没有得到任何结果。
为什么?
答案 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")]')
输出:
[]
然后使用脚本填充数据,并且必须使用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 :(得分:0)
正如前面的回答所指出的,您尝试抓取的内容是使用javascript动态生成的。如果性能对您来说不是很重要,那么您可以使用Selenium来模拟真实用户并与该站点进行交互。与此同时,您可以让Scrapy为您获取数据。
如果您想要一个类似的示例,请考虑本教程:http://www.6020peaks.com/2014/12/how-to-scrape-hidden-web-data-with-python/