使用python-Scrapy刮取dynamic内容

免责声明:我已经在StackOverflow上看到许多其他类似的post,并试图以同样的方式做,但他们似乎并没有在这个网站上工作。

我正在使用Python-Scrapy从koovs.com获取数据。

但是,我无法获得dynamic生成的产品大小。 具体来说,如果有人可以指导我从这个链接的下拉菜单中获取“不可用”尺寸标签,我将不胜感激。

我能够静态地获得大小列表,但是这样做只能获取大小列表,而不能获取大小列表。

你也可以用ScrapyJS解决它(不需要selenium和一个真正的浏览器):

该库使用Splash提供Scrapy + JavaScript集成。

按照SplashScrapyJS的安装说明,启动splash ScrapyJS容器:

 $ docker run -p 8050:8050 scrapinghub/splash 

将以下设置放入settings.py

 SPLASH_URL = 'http://192.168.59.103:8050' DOWNLOADER_MIDDLEWARES = { 'scrapyjs.SplashMiddleware': 725, } DUPEFILTER_CLASS = 'scrapyjs.SplashAwareDupeFilter' 

这里是你的示例蜘蛛,能够看到大小可用性信息:

 # -*- coding: utf-8 -*- import scrapy class ExampleSpider(scrapy.Spider): name = "example" allowed_domains = ["koovs.com"] start_urls = ( 'http://www.koovs.com/only-onlall-stripe-ls-shirt-59554.html?from=category-651&skuid=236376', ) def start_requests(self): for url in self.start_urls: yield scrapy.Request(url, self.parse, meta={ 'splash': { 'endpoint': 'render.html', 'args': {'wait': 0.5} } }) def parse(self, response): for option in response.css("div.select-size select.sizeOptions option")[1:]: print option.xpath("text()").extract() 

这是控制台上打印的内容:

 [u'S / 34 -- Not Available'] [u'L / 40 -- Not Available'] [u'L / 42'] 

据我所知,在浏览器中执行的JavaScriptdynamic确定大小可用性。 Scrapy不是浏览器,不能执行JavaScript。

如果你可以切换到selenium浏览器自动化工具 ,这里是一个示例代码:

 from selenium import webdriver from selenium.webdriver.support.select import Select from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC browser = webdriver.Firefox() # can be webdriver.PhantomJS() browser.get('http://www.koovs.com/only-onlall-stripe-ls-shirt-59554.html?from=category-651&skuid=236376') # wait for the select element to become visible select_element = WebDriverWait(browser, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.select-size select.sizeOptions"))) select = Select(select_element) for option in select.options[1:]: print option.text browser.quit() 

它打印:

 S / 34 -- Not Available L / 40 -- Not Available L / 42 

请注意,代替Firefox您可以使用Chrome或Safari等其他networking驱动器。 也有一个select使用无头PhantomJS浏览器。

如果需要,您也可以将Scrapy与Selenium结合使用,请参阅:

  • selenium与scrapydynamic页面
  • scrapy-webdriver
  • seleniumcrawler

我面对这个问题,并通过以下步骤轻松解决

点安装飞溅
点安装scrapy飞溅
点安装scrapyjs

下载并安装docker-toolbox

打开docker快捷terminal并进入

 $ docker run -p 8050:8050 scrapinghub/splash 

要设置SPLASH_URL,请通过input来检查docker机器中configuration的默认IP地址
$ docker-machine ip default (我的IP是192.168.99.100)

 SPLASH_URL = 'http://192.168.99.100:8050' DOWNLOADER_MIDDLEWARES = { 'scrapyjs.SplashMiddleware': 725, } DUPEFILTER_CLASS = 'scrapyjs.SplashAwareDupeFilter' 

而已!