使用 Scrapy 和 Splash 抓取无限滚动内容

如何应对复杂网站的动态加载与JavaScript渲染:使用Selenium与Splash 摘要: 现代网页广泛依赖JavaScript动态加载内容,传统爬虫难以获取动态数据。本文对比了两种主流解决方案:Selenium(支持完整浏览器交互但性能较低)和Splash(轻量高效,适合大规模抓取)。Selenium适用于复杂交互场景,而Splash更适合高并发爬取。两种工具各有优劣,开发者可根据需求选择,或结合使用以平衡性能与功能性。 阅读详情

使用 Scrapy 和 Splash 抓取无限滚动内容

在这里,我将带你了解如何将 Scrapy 与 Splash 配置起来,应对无限滚动,获取动态内容,并处理常见的抓取挑战。让我们一步步深入看看具体怎么做。

为什么要抓取无限滚动内容?

无限滚动常见于电商网站、社交媒体平台和新闻聚合网站,当用户向下滚动时会加载更多内容。基础的 HTML 解析器不足以抓取这类网站,因为新内容只有在滚动操作之后才会出现。像 Splash 这样的无头浏览器就能派上用场,它可以帮助模拟滚动并加载动态内容,从而实现有效抓取。

Scrapy 和 Splash 基础

Scrapy 是一个用 Python 编写的开源网页抓取框架,以速度快、简单易用和可扩展性强而闻名。它提供了一种结构化方式来组织代码并从网站中提取信息。

Splash 是专门为网页抓取而构建的无头浏览器。它可以执行 JavaScript 并渲染 HTML 页面。当它以 Scrapy-Splash 的形式与 Scrapy 集成时,我们就可以抓取依赖 JavaScript 加载内容的网站,例如带有无限滚动的网站。

跳过无限滚动抓取——直接获取数据

下面列出了顶级数据集网站,如果你的项目过于复杂且不想浪费时间,可以看看这些网站:

  1. Bright Data — 覆盖各行业的可定制和预构建数据集。

  2. Statista — 面向商业和研究的海量统计数据与报告。

  3. Datarade — 来自多家提供商的优质数据产品市场。

  4. AWS Data Exchange — 与 AWS 服务集成的第三方数据集。

  5. Zyte — 根据业务需求定制的网页抓取和自定义数据集。

  6. Data & Sons — 用于买卖各类数据集的开放市场。

  7. Coresignal — 拥有大量职位相关数据的人力分析服务。

  8. Oxylabs — 专门的公司数据和网页抓取服务。

  9. Bloomberg Enterprise Data Catalog — 面向企业使用的金融数据。

  10. Kaggle — 面向数据科学的免费公共数据集和工具。

步骤 1:将 Scrapy 与 Splash 配置起来

要开始将 Splash 与 Scrapy 一起使用,请按以下初始设置步骤操作。

1. 安装 Scrapy-Splash 打开终端并安装 scrapy-splash 包:

pip install scrapy-splash

2. 在 Docker 中运行 Splash 由于 Splash 需要 Docker 才能高效运行,请确保你的机器上已安装并正在运行 Docker。使用以下命令拉取 Splash Docker 镜像:

docker pull scrapinghub/splash

然后启动 Splash 服务器:

docker run -it -p 8050:8050 - rm scrapinghub/splash

现在,Splash 可在 http://localhost:8050, 访问,已准备好为你的 Scrapy 爬虫渲染 JavaScript。

步骤 2:编写用于滚动的 Lua 脚本

Splash 的 Lua 脚本功能允许你操控浏览器、向下滚动,并等待新内容加载。下面的 Lua 脚本会滚动到页面底部,等待内容加载,并多次重复这个过程。

用于滚动的 Lua 脚本

function main(splash, args)

splash:go(args.url)

splash:wait(args.wait)

local scroll_to = splash:jsfunc('window.scrollTo')

local get_body_height = splash:jsfunc([[

function() {

return document.body.scrollHeight;

}

]])

local scroll_count = 0

for _ = 1, args.max_scrolls do

scroll_count = scroll_count + 1

scroll_to(0, get_body_height())

splash:wait(args.scroll_delay)

end

return {

html = splash:html(),

scroll_count = scroll_count

}

end

在这个脚本中:

  • splash:go(args.url) 会加载目标 URL。

  • splash:wait(args.wait) 会暂停,以便初始页面元素加载完成。

  • for 循环会多次滚动页面,并在每次滚动后短暂等待(args.scroll_delay),让新内容加载出来。

步骤 3:在 Scrapy Spider 中集成 Lua 脚本

准备好 Lua 脚本后,下一步是设置一个 Scrapy spider 来执行它。这个 spider 会向目标站点发送 Splash 请求,并传入 Lua 脚本。

Spider 代码

import scrapy

from scrapy_splash import SplashRequest

class InfiniteScrollSpider(scrapy.Spider):

name = 'infinite_scroll_spider'

allowed_domains = ['example.com']

start_urls = ['http://example.com/target_page']

lua_script = """

function main(splash, args)

splash:go(args.url)

splash:wait(args.wait)

local scroll_to = splash:jsfunc('window.scrollTo')

local get_body_height = splash:jsfunc([[

function() {

return document.body.scrollHeight;

}

]])

local scroll_count = 0

for _ = 1, args.max_scrolls do

scroll_count = scroll_count + 1

scroll_to(0, get_body_height())

splash:wait(args.scroll_delay)

end

return {

html = splash:html(),

scroll_count = scroll_count

}

end

"""

def start_requests(self):

yield SplashRequest(

self.start_urls[0],

self.parse,

endpoint='execute',

args={

'lua_source': self.lua_script,

'wait': 2,

'scroll_delay': 1,

'max_scrolls': 8

}

)

def parse(self, response):

for item in response.css('.item-selector'):

yield {

'name': item.css('.name::text').get(),

'price': item.css('.price::text').get()

}

说明:

  • 该 spider 会发送一个 SplashRequest,其中 lua_source 指向 Lua 脚本。

  • wait、scroll_delay 和 max_scrolls 等参数定义了脚本的滚动行为。

  • parse 函数会从每次滚动迭代中提取商品数据(名称和价格)。

步骤 4:处理分页和“加载更多”按钮

许多无限滚动页面会使用隐藏的“加载更多”按钮,当用户滚动到底部时触发。Splash 的 Lua 脚本可以在该按钮出现时点击“加载更多”按钮来处理这种情况。

用于“加载更多”按钮的修改版 Lua 脚本

function main(splash, args)

splash:go(args.url)

splash:wait(args.wait)

local scroll_to = splash:jsfunc('window.scrollTo')

local get_body_height = splash:jsfunc([[

function() {

return document.body.scrollHeight;

}

]])

local scroll_count = 0

for _ = 1, args.max_scrolls do

scroll_count = scroll_count + 1

scroll_to(0, get_body_height())

splash:wait(args.scroll_delay)

local load_more = splash:select('.load-more-button')

if load_more then

load_more:mouse_click()

splash:wait(1)

end

end

return splash:html()

end

这里,load_more 变量会使用其选择器定位“加载更多”按钮。如果找到该按钮,它会模拟点击,等待内容加载,然后重复滚动。

步骤 5:绕过反机器人防护

无限滚动页面通常会有反机器人措施,包括 CAPTCHA、速率限制和 IP 封禁。绕过这些措施的技术包括:

  1. 代理轮换:更换 IP 地址可以防止被检测到。ZenRows 和 ScraperAPI 等服务提供 IP 轮换,并且设置成本很低。

  2. User-Agent 轮换:通过在每次请求中随机化你的 User-Agent 字符串来避免被检测。

  3. 无头浏览器:Splash 以无头模式运行,使你的请求看起来更像真实用户流量。

下面是如何使用 ZenRows 实现动态代理的示例:

import scrapy

class InfiniteScrollSpider(scrapy.Spider):

name = 'proxy_spider'

allowed_domains = ['example.com']

def start_requests(self):

proxy = 'http://<YOUR_ZENROWS_API_KEY>@api.zenrows.com:8001'

url = 'http://example.com/target_page'

yield scrapy.Request(

url,

callback=self.parse,

meta={'proxy': proxy}

)

def parse(self, response):

# parsing logic

此示例将 Scrapy 配置为对每个请求使用 ZenRows 作为代理。

步骤 6:整合所有内容

下面是一个无限滚动 Scrapy spider 的完整代码,包含 Splash 集成、Lua 脚本和代理轮换:

import scrapy

from scrapy_splash import SplashRequest

class FullInfiniteScrollSpider(scrapy.Spider):

name = 'full_infinite_scroll'

allowed_domains = ['example.com']

start_urls = ['http://example.com/target_page']

lua_script = """

function main(splash, args)

splash:go(args.url)

splash:wait(args.wait)

local scroll_to = splash:jsfunc('window.scrollTo')

local get_body_height = splash:jsfunc([[

function() {

return document.body.scrollHeight;

}

]])

for _ = 1, args.max_scrolls do

scroll_to(0, get_body_height())

splash:wait(args.scroll_delay)

local load_more = splash:select('.load-more-button')

if load_more then

load_more:mouse_click()

splash:wait(1)

end

end

return splash:html()

end

"""

def start_requests(self):

yield SplashRequest(

self.start_urls[0],

self.parse,

endpoint='execute',

args={

'lua_source': self.lua_script,

'wait': 2,

'scroll_delay': 1,

'max_scrolls': 10

}

)

def parse(self, response):

for item in response.css('.item-selector'):

yield {

'name': item.css('.name::text').get(),

'price': item.css('.price::text').get()

}

结论

在抓取无限滚动页面时,我发现 Scrapy 与 Splash 组合非常有吸引力。这是一套很棒的配置,能让你轻松应对即使是最棘手的动态网站。借助 Splash,我可以处理 JavaScript 渲染,而 Scrapy 则擅长数据提取部分。Splash 的 Lua 脚本让你可以与页面上的元素交互,像用户滚动浏览一样加载更多内容。

有任何问题吗?请在评论里告诉我!

对其他网页抓取指南感兴趣?

想看更多精彩文章,请访问我的主页 — Data Journal ❤️

Python Selenium实战:破解闲鱼懒加载,批量抓取商品数据 动态网页数据抓取是网络爬虫领域的核心挑战之一,其原理在于现代网站普遍采用JavaScript异步加载技术(如懒加载)来提升用户体验,这导致传统的静态HTML解析方法失效。从技术价值看,掌握动态内容渲染的应对策略,能极大拓展数据采集的范围与深度,是进行市场分析、价格监控和竞品研究的基础能力。在应用场景上,电商平台、社交媒体等强交互站点都是典型代表。本文以闲鱼商品抓取为例,深入探讨了如何利用Selenium模拟真实浏览器操作,通过渐进式滚动和显式等待触发懒加载机制,并结合XPath精准解析,最终实现完整数据的稳 阅读详情

相关推荐

网页抓取实战:从静态页面到动态链接的自动化提取

本文详细介绍了网页抓取技术的实战应用,从静态页面的基础抓取到动态链接的自动化提取。通过Python的requests库、BeautifulSoup和Selenium等工具,结合实例代码演示了如何处理静态HTML、动态加载内容及API接口数据。文章还涵盖了链接处理、自动化流水线构建、效率优化及法律合规等关键内容,为开发者提供全面的网页抓取解决方案。

weixin_34252686的博客 355

结合Splash与Scrapy:高效爬取动态JavaScript网站

Splash是一个轻量级的浏览器服务,专门为Python爬虫设计,用于渲染JavaScript内容。它基于WebKit引擎,提供了简单的HTTP API,使开发者能够通过发送请求来获取已渲染的页面内容。

neweastsun的专栏 1370

动态网站爬虫实战:从API调用到无头浏览器的三种核心方案

网络爬虫技术是数据采集领域的基础工具,其核心原理是通过模拟HTTP请求获取网页内容并解析提取结构化信息。在静态网页场景中,直接解析HTML文档树即可完成数据提取,但随着前端技术的发展,大量现代网站采用动态渲染技术,数据通过JavaScript异步加载,传统爬虫方法面临失效挑战。从技术价值角度看,动态爬虫需要模拟浏览器执行环境,重现数据生成过程,这对爬虫工程的健壮性和可维护性提出了更高要求。在应用场景上,电商商品列表、社交媒体信息流、实时数据仪表板等单页面应用(SPA)都需要动态爬取方案。针对动态内容,目前主

weixin_33937913的博客 543

爬虫教程( 4 ) --- scrapy-redis、集群、curl-cffi、scrapy-stealth、aio-scrapy、omnicrawl-core、反检测(反爬)浏览器

分布式爬虫 scrapy-redis、集群

freeking101的博客 6822

Python动态表格抓取:用Playwright模拟浏览器操作

网页表格提取是数据采集的基础任务,但现代网站普遍采用JavaScript动态渲染、分页加载、iframe嵌套等技术,导致传统requests+BeautifulSoup方案频繁失效。其根本原理在于:浏览器最终呈现的DOM结构,需经JS执行、资源加载与样式计算后生成,而静态HTML解析无法还原这一过程。Playwright作为可编程浏览器引擎,通过真实渲染、智能等待与跨平台支持,提供了稳定可靠的表格定位与提取能力,显著提升工程落地性。本文聚焦于解决‘页面可见但代码不可见’的核心痛点,结合国家统计局CPI等真实

weixin_34327223的博客 359

Python Selenium实战:破解动态反爬,稳定抓取招聘网站数据

网络爬虫是数据采集的核心技术,其原理是通过模拟HTTP请求或浏览器行为从网页中提取结构化信息。在动态网页技术普及的今天,传统的静态解析方法常因JavaScript渲染而失效,此时浏览器自动化工具的价值凸显。Selenium作为主流的Web自动化框架,能够驱动真实浏览器执行点击、滚动等交互操作,完整渲染页面,从而有效应对动态内容加载。在工程实践中,面对网站部署的复杂反爬机制,如User-Agent检测、IP频率限制、行为指纹分析等,需结合精细化策略提升爬虫的隐蔽性与稳定性。本文聚焦于招聘数据抓取这一典型应用场

weixin_34128839的博客 410

Scrapy 框架进阶:爬取动态网页

现代网站普遍采用前端框架(如React、Vue)实现数据动态加载,初始HTML中仅包含少量静态结构,核心内容需通过JavaScript渲染生成1。传统Scrapy架构基于HTTP请求直接获取页面源码,无法执行JavaScript,导致动态生成的数据无法被有效抓取2。例如,电商平台商品列表通过无限滚动加载,价格信息由JS动态渲染,直接爬取仅能获取空容器元素。

2501_93893138的博客 352

R语言网页抓取入门:rvest核心原理与实战指南

网页抓取(Web Scraping)是将HTML/XML等结构化网页内容转化为可分析数据的关键技术,其核心在于解析DOM树、精准定位节点并提取文本或属性。rvest作为R语言生态中最成熟稳定的HTML解析包,基于CSS选择器语法与函数式管道设计,大幅降低学习门槛与调试成本。它专精于静态页面解析,天然适配R的数据工作流(如dplyr清洗、ggplot2可视化),在学术文献采集、竞品价格监控、政务数据获取等场景中具备高可靠性与中文友好性。本文聚焦rvest的底层抽象逻辑、选择器实战技巧、分页处理范式及生产级容错

dechen6073的博客 379

Selenium抓取Medium动态页面的工程化实践

动态渲染网站(如React单页应用)的内容获取,本质是解决JavaScript执行后DOM状态的可靠捕获问题。其核心原理在于模拟真实浏览器环境,等待异步组件挂载、事件绑定完成及数据注入就绪。技术价值体现在对反爬机制的天然兼容性——绕过静态HTML空壳、触发懒加载、规避环境指纹检测。典型应用场景包括技术文章聚合、作者内容监控、离线知识库构建等。本文聚焦Medium这一典型SPA站点,深入解析Selenium在渲染依赖、交互绑定与环境适配三重维度上的不可替代性,并提供可落地的启动配置、显式等待策略与结构化提取方

深未来技术 428

Twint开源爬虫实战:绕过Twitter API限制获取公开推文

社交媒体数据采集是舆情分析、竞品研究和学术语料构建的基础能力。其核心原理在于解析前端公开HTML而非依赖认证API,具备零成本、无权限门槛、支持历史数据回溯等技术优势。相比官方API的时效墙与审批墙,Twint以轻量异步爬取+DOM精准解析实现稳定可控的数据镜像,特别适用于内容运营、独立开发者及高校研究者对公开可访问推文的批量获取需求。本文聚焦Twint在真实项目中的环境搭建、参数组合、反爬应对与数据交付全流程。

weixin_34184158的博客 417

Selenium与MongoDB实战:构建金融股吧舆情动态采集系统

在数据驱动的时代,网络爬虫技术是获取公开信息、进行市场研究的关键工具。其核心原理在于模拟浏览器行为,自动抓取并解析网页内容,将非结构化数据转化为可分析的格式。这项技术的价值在于能够高效、自动化地获取大规模数据,为决策提供支持。在金融科技、舆情监控、市场分析等应用场景中,爬虫常被用于跟踪论坛讨论、新闻情绪等动态信息。本文聚焦于使用Selenium应对动态网页渲染,并结合MongoDB存储非结构化数据的实践方案,详细阐述了如何搭建一套针对东方财富股吧的稳定采集系统,其中涉及反爬策略对抗与数据存储优化等关键环节。

weixin_33843947的博客 339

NERDTree 配色指南:Vim 主题怎么选、不生效怎么排查

打开 `NERDTree` 后,目录、普通文件、书签几乎全是一种颜色,翻两百行树状输出也找不到自己正在改的那个配置文件——这就是大多数人说"文件树没有配色"的真实场景。实际上 NERDTree 自带一整套高亮分组,问题往往不在插件,而在于 colorscheme 没选对、或者高亮被别处覆盖了。 [![NERDTree 文件树配色效果:目录、文件与帮助区使用不同颜色](https://raw.gi

gitblog_00421的博客 678

Python爬虫高级实战:Scrapy对接Splash实现JavaScript动态页面完美抓取

python"""清理文本内容"""return ''# 去除多余空白和换行"""解析日期字符串"""return ''# 可扩展日期解析逻辑# 基本信息# 内容信息# 元数据# 作者与标签# 媒体资源# SEO信息# 统计信息。

2201_76125261的博客 38

Python+Flask+Vue3构建AI新闻聚合系统实战

信息聚合系统是现代Web开发中的常见需求,其核心原理是通过爬虫技术采集多源数据,结合NLP算法实现智能处理。这类系统能有效解决信息过载问题,特别适合技术动态追踪等场景。本文以AI新闻聚合为例,详细解析了采用Python+Flask构建RESTful API、Vue3实现前端交互、配合Scrapy爬虫和spaCy NLP处理的技术方案。其中重点介绍了分布式爬虫的反反爬策略、基于SimHash的去重算法,以及生产环境中Docker部署的优化实践。该系统实测可节省82%的信息获取时间,为开发者提供了高效的技术资讯

weixin_33713350的博客 390

利用LQR反馈控制器在不同风况下模拟风力涡轮转速控制的MATLAB.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

高校技术转移办公室人员如何提升技术成果的推介效果和市场转化率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

【基于Zernike矩的良性和恶性肿块的分类】应用于乳腺癌诊断中的快速相反权重学习规则(Matlab代码实现)

内容概要:本文详细介绍了基于Plecs软件构建的全桥LLC谐振变换器仿真模型,重点阐述了其在软开关技术条件下的建模方法与仿真分析过程。该模型能够精确模拟LLC谐振变换器在不同运行工况下的动态响应特性,涵盖开环与闭环控制策略的设计与实现,适用于研究变换器的效率优化、谐振参数匹配、系统稳定性及软开关性能等问题。相较于Simulink等传统仿真工具,Plecs在高频电力电子系统仿真中展现出更高的仿真速度与数值精度,尤其适合用于复杂电力电子拓扑的快速原型验证与优化设计。; 适合人群:具备扎实电力电子技术基础和仿真经验,从事高频功率变换器设计、新能源电源开发、电力电子系统研究的研发工程师及高校研究生。; 使用场景及目标:①深入理解全桥LLC谐振变换器的工作原理与软开关实现机制;②掌握在Plecs环境中搭建高精度、高效率电力电子系统仿真模型的方法;③开展变换器控制策略(如变频控制、闭环稳压)的仿真验证与参数优化;④为科研课题、学位论文或工业项目提供可靠的仿真平台与技术支持。; 阅读建议:建议结合相关电力电子教材与LLC变换器设计指南,深入掌握谐振参数计算与系统稳定性分析方法,并通过反复调试仿真模型,观察关键波形(如原边电流零点切换、副边整流波形),以全面理解软开关过程的物理本质与控制实现细节。

两相交错并联BuckBoost变换器仿真模型(Simulink仿真实现)

内容概要:本文档系统整合了电力电子与新能源领域的Simulink仿真资源,聚焦于两相交错并联Buck-Boost变换器的双闭环PWM控制建模与仿真,同时涵盖多种典型拓扑结构,包括交错并联Boost、PFC功率因数校正、LLC谐振变换器、双向CLLC、DAB变换器、VIENNA整流器等。资源体系完整,包含仿真模型、设计报告、计算书、PPT说明文档及Matlab/Python代码,覆盖从基础建模到高级控制策略(如软开关技术、谐波抑制、状态估计、双闭环控制)的全流程。此外,还拓展至状态估计(卡尔曼滤波、粒子滤波)、智能优化算法、机器学习、信号处理、路径规划等多个交叉学科方向,构建了一个面向科研与工程应用的综合性技术平台。; 适合人群:电气工程、自动化、电力电子、新能源科学与工程等专业的硕士博士研究生、高校科研人员,以及从事新能源发电、智能电网、电动汽车、电力传动等领域技术研发的工程师。; 使用场景及目标:①开展电力电子变换器(如Buck-Boost、LLC、DAB、PFC等)的建模、控制与仿真研究;②支撑课程设计、学位论文、科研项目中的系统仿真与算法验证;③学习并复现高水平期刊(如EI)提出的先进控制策略,如基于KKT条件的最优控制、扩展移相调制、恒压恒流双环竞争控制等;④结合智能算法(如粒子群、秃鹰算法)进行微电网调度、储能配置、路径规划等多目标优化问题的研究与快速原型开发。; 阅读建议:建议依据提供的资源目录循序渐进地查阅资料,优先选取与自身研究方向高度契合的内容进行深入学习;应结合仿真模型与配套文档动手实践,调试参数并分析结果,充分利用百度网盘与公众号渠道获取完整资源,提升科研工作的系统性、规范性与创新性。

上一篇: 如何在 Python 中将代理与 SeleniumBase 一起使用
下一篇: 用于网页抓取的 Node-unblocker
Data_Journal
博客等级 码龄1年 158粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值