首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
12.1 Charles 抓包工具的使用
12.2 mitmproxy 抓包工具的使用
12.3 mitmdump 实时抓包处理
12.4 Appium 的使用
12.5 基于 Appium 的 App 爬取实战
12.6 Airtest 的使用
12.7 基于 Airtest 的 App 爬取实战
12.8 手机群控爬取实战
12.9 云手机的使用
13.0 Android 逆向
13.1 jadx 的使用
13.2 JEB 的使用
13.3 Xposed 框架的使用
13.4 基于 Xposed 的爬取实战案例
13.5 Frida 的使用
13.6 SSL Pining 问题的解决方案
13.7 Android 脱壳技术简介与实战
13.8 利用 IDA Pro 静态分析和动态调试 so 文件
13.9 基于 Frida-RPC 模拟执行 so 文件
13.10 基于 AndServer-RPC 模拟执行 so 文件
13.11 基于 unidbg 模拟执行 so 文件
14.1 页面智能解析简介
14.2 详情页智能解析算法简介
14.3 详情页智能解析算法的实现
14.4 列表页智能解析算法简介
14.5 列表页智能解析算法的实现
14.6 如何智能分辨列表页和详情页
15.1 Scrapy框架介绍
15.2 Scrapy入门
15.3 Selector 的使用
15.4 Spider 的使用
15.5 Downloader Middleware的使用
15.6 Spider Middleware的使用
15.7 Item Pipeline的使用
15.8 Extension的使用
15.9 Scrapy 对接 Selenium
15.10 Scrapy 对接 Splash
15.11 Scrapy 对接 Pyppeteer
15.12 Scrapy 规则化爬虫
15.13 Scrapy 实战
16.1 分布式爬虫理念
16.2 Scrapy-Redis原理和源码解析
16.3 基于Scrapy-Redis的分布式爬虫实现
16.4 基于Bloom Filter进行大规模去重
16.5 基于RabbitMQ的分布式爬虫
17.1 Scrapyd和ScrapydAPI的使用
17.2 Scrapyd-Client 的使用
17.3 Gerapy 爬虫管理框架的使用
17.4 将Scrapy 项目打包成 Docker 镜像
17.5 Docker Compose 的使用
17.6 Kubernetes的使用
17.7 用 Kubernetes 部署和管理 Scrapy 爬虫
17.8 Scrapy 分布式爬虫的数据统计方案
17.9 基于Prometheus和Grafana的分布式爬虫监控方案
当前位置:
首页>>
技术小册>>
Python3网络爬虫开发实战(下)
小册名称:Python3网络爬虫开发实战(下)
### 15.10 Scrapy 对接 Splash 在网络爬虫的开发过程中,经常会遇到需要处理JavaScript渲染的网页内容。传统的HTTP请求库(如requests、urllib等)无法直接执行JavaScript代码,因此无法获取由JavaScript动态生成的数据。为了解决这个问题,我们可以使用Scrapy框架结合Splash工具来实现对JavaScript渲染页面的爬取。 #### 15.10.1 Splash 简介 Splash是一个JavaScript渲染服务,它使用WebKit浏览器引擎(类似于Chrome和Safari的浏览器引擎)来执行JavaScript,并能够将渲染后的HTML、PNG、JPEG等格式的内容返回给客户端。Splash特别适用于需要抓取动态网页内容的场景,如单页应用(SPA)或需要JavaScript才能显示的数据。 Splash可以作为一个独立的HTTP服务运行,支持多种编程语言的接口调用,包括Python。Scrapy作为一个功能强大的网络爬虫框架,通过中间件(Middleware)和扩展(Extensions)机制,可以很方便地与Splash集成,实现JavaScript渲染页面的爬取。 #### 15.10.2 安装与配置 ##### 1. 安装Splash Splash的安装可以通过Docker来简化过程,因为Docker容器提供了运行Splash所需的所有依赖项。首先,确保你的系统上安装了Docker。然后,通过以下命令拉取Splash的Docker镜像并启动服务: ```bash docker pull scrapinghub/splash docker run -p 8050:8050 scrapinghub/splash ``` 这条命令会启动Splash服务,并将其映射到宿主机的8050端口上。 ##### 2. 配置Scrapy 要在Scrapy中使用Splash,你需要在Scrapy项目中配置Splash的相关设置。这通常包括在`settings.py`文件中添加Splash的URL和必要的中间件。 ```python # settings.py # Splash服务URL SPLASH_URL = 'http://localhost:8050' # 启用Splash中间件 DOWNLOADER_MIDDLEWARES = { 'scrapy_splash.SplashCookiesMiddleware': 723, 'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, } # 设置Splash的DUPEFILTER_CLASS(如果需要) DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter' # Splash请求设置 SPIDER_MIDDLEWARES = { 'scrapy_splash.SplashDeduplicateArgsMiddleware': 100, } # 启用HTTP缓存 HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage' ``` 注意:以上配置可能需要根据你的具体需求进行调整。 #### 15.10.3 编写Splash请求 在Scrapy中,当你想要通过Splash发送请求时,你需要在请求(Request)对象中添加一些特殊的参数,以指示Scrapy通过Splash发送该请求。这些参数包括`splash_url`(Splash服务的URL,通常与`SPLASH_URL`相同,但可以在请求级别覆盖)、`endpoint`(Splash的API端点,如`'render.html'`)、`args`(传递给Splash的额外参数,如JavaScript等待时间`wait`)。 ```python import scrapy from scrapy_splash import SplashRequest class MySpider(scrapy.Spider): name = 'my_splash_spider' def start_requests(self): url = 'http://example.com/javascript_rendered_page' yield SplashRequest(url=url, endpoint='render.html', args={'wait': 0.5}, callback=self.parse) def parse(self, response): # 这里处理渲染后的HTML print(response.text) # 提取数据... ``` 在上面的例子中,`SplashRequest`类被用来创建一个请求,该请求通过Splash的`'render.html'`端点发送,并设置了一个0.5秒的等待时间,以确保JavaScript有足够的时间来渲染页面。渲染后的HTML内容将通过Scrapy的响应对象传递给`parse`回调函数进行处理。 #### 15.10.4 处理JavaScript生成的动态内容 一旦页面通过Splash渲染,你就可以像处理普通HTML页面一样,使用Scrapy的选择器(Selectors)或XPath、CSS选择器来提取数据了。由于Splash已经处理了JavaScript的渲染,所以你现在可以看到并提取那些原本被JavaScript动态生成的内容。 ```python from scrapy.selector import Selector def parse(self, response): # 使用Selector或response.css/response.xpath来提取数据 selector = Selector(response) dynamic_content = selector.css('div.dynamic-content::text').get() print(dynamic_content) # 还可以继续发送其他请求或进行其他处理... ``` #### 15.10.5 注意事项与优化 - **性能考虑**:Splash渲染JavaScript页面比直接下载HTML要慢,因为它需要等待JavaScript执行完毕。因此,在设计爬虫时应考虑减少不必要的Splash请求,或优化Splash服务的性能。 - **资源消耗**:Splash服务会消耗较多的CPU和内存资源,尤其是在高并发请求的情况下。确保你的服务器或Docker容器有足够的资源来支持Splash的运行。 - **错误处理**:在使用Splash时,可能会遇到各种JavaScript错误或渲染问题。确保你的爬虫能够妥善处理这些错误,例如通过重试机制或记录错误日志。 - **Splash参数调整**:Splash提供了许多参数来调整渲染过程,如等待时间、视口大小、浏览器代理等。根据你的具体需求调整这些参数,以优化渲染效果和性能。 #### 15.10.6 结论 Scrapy与Splash的集成为网络爬虫开发者提供了一种强大的方式来处理JavaScript渲染的网页内容。通过合理配置Scrapy项目和编写适当的Splash请求,你可以轻松地从动态网页中提取所需的数据。然而,也需要注意到Splash渲染过程的性能开销和资源消耗,并采取相应的优化措施来确保爬虫的稳定运行。
上一篇:
15.9 Scrapy 对接 Selenium
下一篇:
15.11 Scrapy 对接 Pyppeteer
该分类下的相关小册推荐:
Python爬虫入门与实战开发(下)
Python高性能编程与实战
Python与办公-玩转Word
Python合辑13-面向对象编程案例(上)
Python合辑4-130个字符串操作示例
Python编程轻松进阶(二)
Python合辑14-面向对象编程案例(下)
Python面试指南
机器学习算法原理与实战
Python与办公-玩转PDF
Python数据分析与挖掘实战(上)
Python合辑9-判断和循环