使用python-Scrapy刮擦动态内容

时间:2015-05-20 09:27:13

标签: python web-scraping scrapy

免责声明:我在StackOverflow上看过很多其他类似的帖子,并尝试以相同的方式进行,但它们似乎无法在此网站上运行。

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

但是,我无法获得动态生成的产品尺寸。具体来说,如果有人可以通过this链接的下拉菜单向我提供一些“不可用”尺寸标记,我将不胜感激。

我可以静态获取大小列表,但这样做我只能获得大小列表,但不能获得哪些大小。

4 个答案:

答案 0 :(得分:37)

您也可以使用ScrapyJS解决问题(无需selenium和真正的浏览器):

  

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

按照SplashScrapyJS的安装说明操作,启动启动对接器容器:

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

答案 1 :(得分:6)

据我所知,大小可用性是在浏览器中执行的javascript中动态确定的。 Scrapy不是浏览器,无法执行javascript。

如果你可以切换到selenium browser automation tool,这里有一个示例代码:

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

请注意,您可以使用Chrome或Safari等其他网络驱动程序代替Firefox。还可以选择使用无头PhantomJS浏览器。

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

答案 2 :(得分:1)

我遇到了这个问题并通过以下步骤轻松解决了

pip install splash
pip安装scrapy-splash
pip install scrapyjs

下载并安装docker-toolbox

打开docker-quickterminal并输入

$ docker run -p 8050:8050 scrapinghub/splash

通过输入
$ docker-machine ip default
(我的IP为192.168.99.100)来设置SPLASH_URL检查泊坞机中配置的默认IP

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

DUPEFILTER_CLASS = 'scrapyjs.SplashAwareDupeFilter'

就是这样!

答案 3 :(得分:0)

您必须解释网站的json,示例 scrapy.readthedocstestingcan.github.io

import scrapy
import json
class QuoteSpider(scrapy.Spider):
   name = 'quote'
   allowed_domains = ['quotes.toscrape.com']
   page = 1
   start_urls = ['http://quotes.toscrape.com/api/quotes?page=1]

   def parse(self, response):
      data = json.loads(response.text)
      for quote in data["quotes"]:
        yield {"quote": quote["text"]}
      if data["has_next"]:
          self.page += 1
          url = "http://quotes.toscrape.com/api/quotes?page={}".format(self.page)
          yield scrapy.Request(url=url, callback=self.parse)