Scrapy中间件的使用

devtools/2025/1/24 6:24:43/

使用 Scrapy 中间件爬取网易新闻四大板块数据

在爬取动态加载网页数据时,我们经常需要结合 Scrapy 的强大爬虫框架和自动化工具的功能,来获取完整的页面数据。本文将以 网易新闻四大板块(国内、国际、军事、航空)数据爬取 为例,讲解如何使用 Scrapy 中间件 实现数据抓取。


1. Scrapy 中间件概述

Scrapy 提供了两种中间件

  • 下载中间件:位于引擎和下载器之间,用于拦截和修改请求及响应。常见用途包括添加请求头、设置代理、修改响应内容等。
  • 爬虫中间件:位于引擎和爬虫之间,主要用于对传递到爬虫的数据进行处理,一般很少使用。

在本次项目中,我们将重点使用 下载中间件,并结合自动化工具处理动态加载页面的问题。


2. 项目目标

网易新闻的四大板块页面结构一致,我们希望爬取以下数据:

  1. 国内新闻
  2. 国际新闻
  3. 军事新闻
  4. 航空新闻

这些板块每次访问只能获取前 50 条数据,部分板块需要通过滚动加载或点击“加载更多”按钮来获取全部内容。


3. 项目实现

3.1 环境准备

安装 Scrapy 和 Selenium(自动化工具):

pip install scrapy selenium

确保已安装浏览器驱动,例如 ChromeDriver,并将其路径添加到环境变量。

3.2 创建 Scrapy 项目

使用以下命令初始化 Scrapy 项目:

scrapy startproject wy_news

创建爬虫文件:

cd wy_news
scrapy genspider wyxw news.163.com
3.3 爬虫代码实现

(1)爬取四个板块的 URL

以下代码解析网易新闻主页,提取四个板块的 URL:

python">import scrapyclass WyxwSpider(scrapy.Spider):name = "wyxw"start_urls = ["https://news.163.com/"]  # 网易新闻主页urls = []  # 存储四个板块的 URLdef parse(self, response):# 解析主页,获取四个板块的 URLlis = response.xpath('//div[@class="ns_area list"]/ul/li')lis2 = lis[1:3] + lis[4:6]  # 选取国内、国际、军事、航空板块for li in lis2:news_url = li.xpath('./a/@href').get()self.urls.append(news_url)# 发起请求获取板块数据yield scrapy.Request(url=news_url, callback=self.parse_news)

(2)解析新闻标题

对每个板块的 URL 发送请求,提取新闻标题:

python">    def parse_news(self, response):# 解析板块页面中的新闻标题divs = response.xpath('//div[@class="hidden"]/div')for div in divs:title = div.xpath('./a/text()').get()print(title)

3.4 处理滚动加载

对于需要滚动加载的页面,我们使用 Selenium 模拟滚动和点击操作。通过 Scrapy 的下载中间件结合 Selenium,自动加载全部数据。

中间件代码:

python">from scrapy import signals
from scrapy.http import HtmlResponse
from selenium.webdriver import Chromeclass Scrapy4DownloaderMiddleware:@classmethoddef from_crawler(cls, crawler):s = cls()crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)return sdef process_response(self, request, response, spider):# 判断当前 URL 是否需要使用自动化技术if request.url in spider.urls:driver = Chrome()driver.get(request.url)while True:# 模拟滚动driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")try:load_more_btn = driver.find_element_by_css_selector('.load_more_btn')load_more_btn.click()except Exception:# 判断是否加载完毕if "display: block;" in driver.find_element_by_css_selector('.load_more_tip').get_attribute('style'):break# 获取页面源码并封装为 Scrapy 响应对象body = driver.page_sourcedriver.quit()return HtmlResponse(url=request.url, body=body, encoding='utf-8', request=request)else:return response

配置中间件settings.py 文件中启用中间件

python">DOWNLOADER_MIDDLEWARES = {'wy_news.middlewares.Scrapy4DownloaderMiddleware': 543,
}

4. 注意事项

  1. 开发环境:确保浏览器和驱动版本匹配。
  2. 响应处理:将自动化工具的输出封装为 Scrapy 的响应对象(HtmlResponse),以便继续使用 Scrapy 的解析能力。
  3. 调试:对于动态加载页面,先用浏览器开发者工具检查加载逻辑,确认滚动或按钮是否正确模拟。

5. 总结

通过结合 Scrapy 中间件和自动化工具,我们解决了动态加载页面数据的抓取问题。这种方法不仅可以应对网易新闻的场景,还适用于其他需要滚动加载或动态交互的网页。

完整代码和实现步骤提供了一个基础框架,希望大家能灵活应用到自己的项目中!

以上就是Scrapy中间件的使用的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!


http://www.ppmy.cn/devtools/153065.html

相关文章

Web安全:缓存欺骗攻击;基于缓存、CDN的新型Web漏洞

基于缓存、CDN的新型Web漏洞 漏洞原理利用方式解决方法 Web缓存欺骗漏洞(Web Cache Deception)是一种利用不安全的缓存机制来泄露用户敏感信息的攻击方式。攻击者通过操控请求URL诱导缓存系统将敏感信息缓存并对其他用户公开,可能导致用户数据…

Spring Boot整合WebSocket

目录 ?引言 1.WebSocket 基础知识 ?1.1 什么是 WebSocket? ?1.2 WebSocket 的应用场景 ?2.Spring Boot WebSocket 整合步骤 2.1 创建 Spring Boot 项目 2.2 添加 Maven 依赖 2.3 配置 WebSocket 2.4 创建 WebSocket 控制器 2.5 创建前端页面 引言 在…

《RWA全球产业白皮书》发布:向凌云教授解析全球经济转型与RWA的未来

2025年1月16日,旅美经济学家、全球新兴产业金融专家向凌云教授在美国发布了引人注目的《RWA全球产业白皮书》。该白皮书通过深入分析全球产业结构变化,尤其强调了“真实世界资产”(Real-World Assets,简称RWA)在当前及…

Flutter_学习记录_基本组件的使用记录

1.TextWidge的常用属性 1.1TextAlign: 文本对齐属性 常用的样式有: TextAlign.center 居中TextAlign.left 左对齐TextAlign.right 有对齐 使用案例: body: Center(child: Text(开启 TextWidget 的旅程吧,珠珠, 开启 TextWidget 的旅程吧&a…

基于 STM32 的智能农业温室控制系统设计

1. 引言 随着农业现代化的发展,智能农业温室控制系统对于提高农作物产量和质量具有重要意义。该系统能够实时监测温室内的环境参数,如温度、湿度、光照强度和土壤湿度等,并根据这些参数自动调节温室设备,如通风扇、加热器、加湿器…

docker-registry

安装依赖 apt install apache2-utils设置密码 htpasswd -Bbn 用户名 密码 >/data/registry_hub/passwd#docker私服部署 docker run -d -p 5000:5000 --name docker-registry -v /data/registry_hub/:/var/lib/registry -v /data/registry_hub/passwd:/auth/htpasswd \ -e …

【前端】CSS实战之音乐播放器

目录 播放器背景旋转音乐封面按钮进度条音量调节音乐信息按钮的效果JavaScript部分播放和暂停音乐切换音乐信息进度条 音量调节避免拖拽时的杂音音量调节条静音和解除静音 自动下一首实现一个小效果最终效果 播放器背景 <div class"play_box"></div>设置…

从0到1:.NET Core微服务的Docker容器奇幻冒险

扬帆起航&#xff1a;开启技术新征程 在当今软件开发的广袤海洋中&#xff0c;技术浪潮此起彼伏&#xff0c;不断推动着行业的变革与发展。.NET Core 微服务与 Docker 容器化技术的结合&#xff0c;宛如一艘强大的战舰&#xff0c;引领着开发者驶向高效、灵活、可扩展的软件开…