使用 python-Scrapy 抓取动态内容
- 2025-02-20 09:23:00
- admin 原创
- 26
问题描述:
免责声明:我在 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)
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)