首页
技术小册
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.9 Scrapy 对接 Selenium 在Python网络爬虫领域,Scrapy作为一个快速高级的Web爬虫框架,以其强大的异步请求处理能力、易于扩展的架构和丰富的中间件支持而广受好评。然而,面对复杂的动态网页内容(如JavaScript渲染的页面),Scrapy直接通过HTTP请求和响应的方式往往难以有效抓取数据。这时,将Scrapy与Selenium结合使用便成为了一个强大的解决方案。Selenium是一个自动化测试工具,它能够模拟用户在浏览器中的操作,包括点击、滚动、填写表单等,并且能够处理JavaScript渲染的页面内容。将Scrapy与Selenium对接,可以使得Scrapy能够抓取到那些仅通过JavaScript动态生成的页面内容。 #### 15.9.1 为什么需要Scrapy对接Selenium - **动态内容抓取**:现代Web页面越来越多地依赖于JavaScript来动态生成内容,而Scrapy默认不支持执行JavaScript。 - **复杂的用户交互**:有些网页需要用户登录、填写表单或进行复杂的交互操作后才能显示数据,这些场景Scrapy难以直接处理。 - **AJAX请求**:页面数据可能通过AJAX异步请求加载,Scrapy难以直接捕获这些数据。 #### 15.9.2 Scrapy与Selenium结合的基本思路 Scrapy与Selenium的结合主要通过自定义Scrapy的Downloader Middleware(下载中间件)来实现。Scrapy的请求首先通过Selenium Middleware处理,由Selenium驱动浏览器执行请求,并等待页面加载完成(包括JavaScript执行完毕),然后将Selenium渲染后的页面源码作为响应返回给Scrapy,由Scrapy继续进行后续的解析和抓取工作。 #### 15.9.3 实现步骤 ##### 1. 安装必要的库 首先,确保安装了Scrapy和Selenium。同时,还需要安装一个WebDriver,它是Selenium与浏览器交互的桥梁。以Chrome为例,需要下载ChromeDriver,并确保其路径已添加到系统的环境变量中。 ```bash pip install scrapy selenium ``` ##### 2. 创建Selenium Middleware 在Scrapy项目中创建一个新的middleware文件,用于处理Selenium相关的操作。 ```python # myproject/middlewares.py from selenium import webdriver from selenium.webdriver.chrome.options import Options from scrapy.http import HtmlResponse class SeleniumMiddleware: def __init__(self, settings): # 配置Selenium chrome_options = Options() chrome_options.add_argument('--headless') # 无头模式 chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') self.driver = webdriver.Chrome(options=chrome_options) def process_request(self, request, spider): # 使用Selenium发起请求 self.driver.get(request.url) # 等待页面加载(根据需要调整等待策略) # 例如:使用WebDriverWait和expected_conditions # 这里简单使用time.sleep作为示例 import time time.sleep(5) # 等待时间需根据实际情况调整 # 获取渲染后的页面源码 body = self.driver.page_source # 创建一个Scrapy的Response对象,并将Selenium获取的页面源码传递给它 return HtmlResponse(url=request.url, body=body.encode('utf-8'), request=request, encoding='utf-8', status=200) def spider_closed(self, spider): # 爬虫结束时关闭浏览器 self.driver.quit() ``` ##### 3. 配置Scrapy使用Selenium Middleware 在Scrapy项目的`settings.py`文件中,添加或修改MIDDLEWARES配置,以启用Selenium Middleware。 ```python # settings.py DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.SeleniumMiddleware': 543, # 确保SeleniumMiddleware的优先级高于Scrapy默认的Downloader Middleware } ``` ##### 4. 编写Spider抓取数据 编写Spider时,就像平常使用Scrapy一样编写解析函数,因为Selenium Middleware已经处理了动态内容的加载问题,所以Spider可以直接从Response中解析数据。 ```python # myproject/spiders/example_spider.py import scrapy class ExampleSpider(scrapy.Spider): name = 'example' start_urls = ['https://example.com/dynamic_page'] def parse(self, response): # 从Selenium渲染后的页面中解析数据 for item in response.css('selector::text').getall(): yield {'data': item} ``` ##### 5. 运行Scrapy项目 现在,你可以像平常一样运行Scrapy项目了。Scrapy会先通过Selenium Middleware加载页面,等待JavaScript执行完毕,然后将渲染后的页面内容传递给Spider进行解析。 ```bash scrapy crawl example ``` #### 15.9.4 注意事项与优化 - **性能问题**:使用Selenium会显著降低爬虫的性能,因为每个请求都需要启动浏览器并等待页面加载完成。考虑使用Scrapy的Splash或Puppeteer等替代方案,它们提供了更轻量级的JavaScript渲染支持。 - **资源管理**:确保在爬虫结束时正确关闭浏览器和WebDriver,避免资源泄漏。 - **异常处理**:在Selenium Middleware中添加异常处理逻辑,以处理如页面加载超时、WebDriver异常等问题。 - **等待策略**:避免使用简单的`time.sleep()`来等待页面加载完成,考虑使用Selenium的WebDriverWait和expected_conditions来智能等待页面元素的出现。 - **环境配置**:确保Selenium WebDriver与浏览器版本兼容,并根据需要配置无头模式、代理等。 通过以上步骤,你可以将Scrapy与Selenium有效结合,实现对复杂动态网页的高效抓取。这种结合方式虽然在一定程度上牺牲了性能,但为爬虫开发者提供了一种强大的工具来应对日益复杂的Web环境。
上一篇:
15.8 Extension的使用
下一篇:
15.10 Scrapy 对接 Splash
该分类下的相关小册推荐:
Python机器学习基础教程(下)
Python与办公-玩转PPT
Python合辑7-集合、列表与元组
Python与办公-玩转Excel
Python合辑3-字符串用法深度总结
Python合辑5-格式化字符串
Python爬虫入门与实战开发(下)
Python3网络爬虫开发实战(上)
Python机器学习实战
Python合辑2-字符串常用方法
Python合辑11-闭包函数
Python编程轻松进阶(四)