爬虫—Scrapy 整合 ChromeDriver 实现动态网页拉取

打印 上一主题 下一主题

主题 809|帖子 809|积分 2437

在进行爬虫开发时,利用 Scrapy 配合 ChromeDriver 来模拟真实浏览器加载 JavaScript 渲染内容是一种常见且高效的方法。Scrapy 本身是一个非常强大的爬虫框架,然而它默认利用的是 requests 库来抓取静态网页内容。对于需要通过 JavaScript 渲染的动态网页,Scrapy 本身可能无法直接处理。
因此,利用 ChromeDriver 来模拟浏览器渲染 JavaScript 天生动态内容,然后再用 Scrapy 提取数据,成为了办理这一问题的一种好方式。本文将带你通过现实代码示例,教你如何联合 Scrapy 和 ChromeDriver 抓取动态网页内容。

1. 环境准备

1.1 安装 Scrapy

首先,需要确保你已经安装了 Scrapy。你可以利用以下下令来安装 Scrapy:
  1. pip install scrapy
复制代码
1.2 安装 Selenium 和 ChromeDriver

在 Scrapy 中利用 Chrome 浏览器来模拟哀求,我们需要通过 Selenium 来控制 ChromeDriver。所以,首先需要安装 Selenium
  1. pip install selenium
复制代码
然后,下载并安装 ChromeDriver。你可以根据你 Chrome 浏览器的版本去 ChromeDriver 官网 下载合适的版本。确保 ChromeDriver 路径已经到场到系统环境变量中,或者你可以在代码中指定路径。
1.3 安装 Scrapy-Selenium

为了让 Scrapy 与 Selenium 配合利用,官方提供了 scrapy-selenium 扩展。安装它:
  1. pip install scrapy
  2. -selenium
复制代码

2. 配置 Scrapy 项目

2.1 创建 Scrapy 项目

在下令行中创建一个新的 Scrapy 项目:
  1. scrapy startproject scrapy_chromedriver
  2. cd scrapy_chromedriver
复制代码
2.2 配置 settings.py

打开项目目录中的 settings.py,添加以下配置来启用 scrapy-selenium 中间件。
  1. # settings.py
  2. # 启用 scrapy-selenium 中间件
  3. DOWNLOADER_MIDDLEWARES = {
  4.     'scrapy_selenium.SeleniumMiddleware': 800,
  5. }
  6. # 设置 ChromeDriver 的路径
  7. SELENIUM_DRIVER_NAME = 'chrome'
  8. SELENIUM_DRIVER_EXECUTABLE_PATH = '/path/to/chromedriver'  # 替换成你下载的 ChromeDriver 路径
  9. SELENIUM_DRIVER_ARGUMENTS = ['--headless', '--disable-gpu', '--no-sandbox']  # 使用无头模式(可选)
  10. # 默认设置 User-Agent
  11. USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
复制代码
2.3 配置 Spider

现在,你可以创建一个爬虫(Spider)来抓取动态网页。
  1. scrapy genspider dynamic_spider example.com
复制代码
编辑天生的 dynamic_spider.py 文件,配置爬虫来利用 Selenium 打开网页并提取数据。
  1. # dynamic_spider.py
  2. import scrapy
  3. from scrapy_selenium import SeleniumRequest
  4. class DynamicSpider(scrapy.Spider):
  5.     name = 'dynamic_spider'
  6.     allowed_domains = ['example.com']
  7.     start_urls = ['https://example.com/dynamic-page']
  8.     def start_requests(self):
  9.         # 使用 SeleniumRequest 代替 Scrapy 的 Request
  10.         for url in self.start_urls:
  11.             yield SeleniumRequest(url=url, callback=self.parse)
  12.     def parse(self, response):
  13.         # 使用 Selenium 请求加载后的 HTML 页面
  14.         page_title = response.xpath('//title/text()').get()
  15.         print("Page Title: ", page_title)
  16.         # 提取页面中的其他数据,例如某些动态生成的内容
  17.         dynamic_data = response.xpath('//div[@class="dynamic-content"]/text()').get()
  18.         yield {
  19.             'title': page_title,
  20.             'dynamic_data': dynamic_data
  21.         }
复制代码
在这个例子中,我们用 SeleniumRequest 替代了 Request,并在回调函数中提取动态页面内容。SeleniumRequest 会启动一个浏览器实例来加载页面,并返回最终渲染的 HTML 内容。

3. 运行爬虫

完成配置后,你可以在下令行中运行爬虫:
  1. scrapy crawl dynamic_spider
复制代码
如果一切配置正确,Scrapy 会通过 Selenium 启动 Chrome 浏览器,加载动态内容并提取数据。

4. 调试与优化

4.1 启用浏览器可视化模式

为了调试,你可以去掉 --headless 参数,这样就可以看到现实的浏览器行为:
  1. SELENIUM_DRIVER_ARGUMENTS = ['--disable-gpu', '--no-sandbox']
复制代码
4.2 增加等待时间

有时动态内容加载较慢,你可能需要等待页面完全加载后再提取数据。可以通过 Selenium 提供的 WebDriverWait 来增加等待时间。
  1. from selenium.webdriver.common.by import By
  2. from selenium.webdriver.support.ui import WebDriverWait
  3. from selenium.webdriver.support import expected_conditions as EC
  4. def parse(self, response):
  5.     driver = response.request.meta['driver']
  6.     # 等待某个元素加载完毕
  7.     WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//div[@class="dynamic-content"]')))
  8.    
  9.     # 继续提取数据
  10.     dynamic_data = response.xpath('//div[@class="dynamic-content"]/text()').get()
  11.     yield {
  12.         'dynamic_data': dynamic_data
  13.     }
复制代码
4.3 调整延迟与哀求频率

在进行大量数据抓取时,记得调整哀求的频率,制止过分访问同一网站导致 IP 被封锁:
  1. DOWNLOAD_DELAY = 2  # 每次请求之间延迟 2 秒
复制代码

5. 总结

通过 ScrapySelenium 联合利用,能够轻松抓取需要 JavaScript 渲染的动态网页。scrapy-selenium 提供了一个方便的接口来利用浏览器驱动,模拟用户行为获取动态数据。

  • 安装 ScrapySeleniumscrapy-selenium
  • 配置 settings.py,启用 Selenium 驱动。
  • 在 Spider 中利用 SeleniumRequest 替代传统的 Request。
  • 进行调试和优化,确保爬虫运行稳固。
通过这种方式,你能够有用地抓取动态天生的网页内容,而不必担心 JavaScript 渲染的问题。希望本教程能够资助你更好地明白如安在 Scrapy 中集成 ChromeDriver,成功地进举措态网页抓取。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表