使用 python-Scrapy 抓取动态内容

2025-02-20 09:23:00
admin
原创
26
摘要:问题描述:免责声明:我在 StackOverflow 上看到过许多其他类似的帖子,并尝试以同样的方式去做,但它们似乎无法在这个网站上起作用。我正在使用 Python-Scrapy 从 koovs.com 获取数据。但是,我无法获取动态生成的产品尺寸。具体来说,如果有人能指导我如何从此链接的下拉菜单中获取“不可...

问题描述:

免责声明:我在 StackOverflow 上看到过许多其他类似的帖子,并尝试以同样的方式去做,但它们似乎无法在这个网站上起作用。

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

但是,我无法获取动态生成的产品尺寸。具体来说,如果有人能指导我如何从此链接的下拉菜单中获取“不可用”尺寸标签,我将不胜感激。

我能够静态获取尺寸列表,但这样做只能获取尺寸列表,而不知道其中哪些可用。


解决方案 1:

您还可以使用以下方法解决此问题ScrapyJS(无需selenium真正的浏览器):

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

Splash按照和 的安装说明ScrapyJS,启动 splash docker 容器:

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

解决方案 2:

据我所知,大小可用性是在浏览器中执行的 javascript 中动态确定的。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您可以使用其他 Web 驱动程序(如 Chrome 或 Safari)。您还可以选择使用无头PhantomJS浏览器。

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

  • selenium 与 scrapy 实现动态页面

  • scrapy-webdriver

  • seleniumcrawler

解决方案 3:

我遇到了这个问题,按照以下步骤轻松解决

pip 安装 splash

pip 安装 scrapy-splash

pip 安装 scrapyjs

下载并安装docker-toolbox

打开 docker-quickterminal 并输入

$ docker run -p 8050:8050 scrapinghub/splash

**要设置 SPLASH_URL,请输入以下内容检查 docker 机器中配置的默认 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'

就是这样!

解决方案 4:

你必须解释网站的 json,例如
scrapy.readthedocs和
testingcan.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)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用