前言

在使用 Scrapy 爬取动态渲染页面(JS 加载、异步接口数据)时,原生爬虫无法直接获取页面真实内容,经常出现网页解析失败、数据为空等问题。

Splash 是一款轻量级 JavaScript 渲染服务,可以模拟浏览器执行 JS、渲染动态网页,搭配 scrapy-splash 插件能完美补齐 Scrapy 不支持动态页面的短板。

本文将从 Docker 部署 Splash 镜像开始,一步步讲解环境搭建、依赖安装、Scrapy 项目配置与代码编写,带你完整实现 Scrapy + Splash 抓取动态网页。

一、Docker部署

1.1 环境配置

我是以centos7为例,本次所有部署都是在centos7虚拟机上进行,如果使用的不同,可按需参考。首先需要一台CentOS 7虚拟机,没有centos7可参考:centos-7-isos-x86_64安装包下载-开源镜像站-阿里云Oracle VirtualBox虚拟机安装CentOS 7

1.2安装Docker 安装Docker

1.验证服务器是否接入互联网

ping baidu.com

如果能够正常显示ping信息证明网络可用

2. 检查CentOS内核版本

Docker要求CentOS系统的内核版本高于3.10,看一下CentOS版本是否支持Docker。

uname -r

3.使用root权限登录CentOS。确保yum包更新到最新

sudo yum update

4.安装Docker所需依赖

yum -y install yum-utils device-mapper-persistent-data lvm2

5.指定Docker镜像源,使用阿里云加速

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

6.安装Docker

yum -y install docker-ce

7. 验证安装成功

docker -v

8. 启动Docker

sudo systemctl start docker

9. 设置开机启动(注意,如果你长时间用这个虚拟机的话,并且内存分配的比较少,建议跳过这一步)

sudo systemctl enable docker

10. 测试镜像

docker run hello-world

二、slpsh的配置及使用

1.获取splash的镜像

sudo docker pull scrapinghub/splash

2. 运行镜像

前台运行

sudo docker run -p 8050:8050 scrapinghub/splash

后台运行

sudo docker run -d -p 8050:8050 scrapyinghub/splash

建议:初次运行建议前台运行,观察部署是否出现问题

3. Pycharm中连接Splash服务

(1)在python虚拟环境中安装scrapy-splash包(注意python解释器版本需要3.8以上)

pip install scrapy-splash

(2)在scrapy中使用splash

    创建项目(在终端执行命令)

 scrapy startproject scrapy_splash_demo

   进入项目目录

 cd scrapy_splash_demo

 在settings文件中添加splash的配置信息

#渲染服务的url
SPLASH_URL = "http://0.0.0.0:8050"
#下载器中间件
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
#去重过滤器
DUPEFILTER_CLASS = 'scrapy_splash.SpiderFilter'
#使用Splash的Http缓存
HTTPCACHE_STORAGE = 'scrapy_splash.SpiderCacheStorage'
ROBOTSTXT_OBEY = False

  在spider中导入类并使用

import scrapy
from scrapy_splash import SplashRequest #使用scrapy_splash包提供的request对象
def start_requests(self):
	yield SplashRequest(self.start_urls[0],
					   callback=self.parse_splash,
					   args={'wait': 10}, #最大超时时间,单位:秒
					   endpoint='render.html') #使用slpash服务的固定参数

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐