【愚公系列】《Python网络爬虫从入门到精通》057-分布式爬取中文日报新闻数据

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟

📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主!

👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"挖山不止"的毅力为开发者们搬开知识道路上的重重阻碍!

💎【行业认证·权威头衔】
✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家
✔ 开发者社区全满贯:CSDN博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主
✔ 技术生态共建先锋:横跨鸿蒙、云计算、AI等前沿领域的技术布道者

🏆【荣誉殿堂】
🎖 连续三年蝉联"华为云十佳博主"(2022-2024)
🎖 双冠加冕CSDN"年度博客之星TOP2"(2022&2023)
🎖 十余个技术社区年度杰出贡献奖得主

📚【知识宝库】
覆盖全栈技术矩阵:
◾ 编程语言:.NET/Java/Python/Go/Node…
◾ 移动生态:HarmonyOS/iOS/Android/小程序
◾ 前沿领域:物联网/网络安全/大数据/AI/元宇宙
◾ 游戏开发:Unity3D引擎深度解析
每日更新硬核教程+实战案例,助你打通技术任督二脉!

💌【特别邀请】
正在构建技术人脉圈的你:
👍 如果这篇推文让你收获满满,点击"在看"传递技术火炬
💬 在评论区留下你最想学习的技术方向
⭐ 点击"收藏"建立你的私人知识库
🔔 关注公众号获取独家技术内参
✨与其仰望大神,不如成为大神!关注"愚公搬代码",让坚持的力量带你穿越技术迷雾,见证从量变到质变的奇迹!✨ |

文章目录

  • 🚀前言
  • 🚀一、分布式爬取中文日报新闻数据
    • 🔎1.网页分析
    • 🔎2.数据库设计
    • 🔎3.Scrapy项目搭建
    • 🔎4.分布式配置 (`settings.py`)
    • 🔎5.启动分布式爬虫


🚀前言

在前几篇中,我们已经深入探讨了 Scrapy 和 Redis 的基本应用,以及如何利用 Scrapy-Redis 实现分布式爬虫系统。今天,我们将带领大家实际操作,通过分布式爬取中文日报新闻数据,进一步提升我们在实际项目中的应用能力。

在爬虫开发中,新闻数据的爬取是一个非常典型的应用场景。通过爬取中文日报网站的新闻数据,我们不仅可以获取到实时的新闻信息,还能够深入分析新闻内容,进行数据挖掘与应用。而使用分布式爬虫架构,可以让我们在面对大规模新闻数据时,轻松实现高效的数据抓取与处理。

在本篇文章中,我们将通过实际案例,学习如何分布式爬取中文日报的新闻数据,并实现以下功能:

  1. 分析中文日报网站结构:如何解析中文日报网站的 HTML 结构,定位新闻数据,提取有价值的信息。
  2. Scrapy-Redis 实现分布式抓取:结合 Scrapy 和 Redis,实现新闻数据的分布式爬取,提高爬取效率。
  3. 新闻数据存储与清洗:如何存储抓取到的新闻数据,并进行简单的数据清洗和处理,使数据更加有用。
  4. 数据去重与分布式管理:使用 Redis 的去重功能,避免重复抓取新闻数据,实现任务的高效分发与管理。
  5. 处理中文文本:如何处理中文文本数据,并对新闻标题、内容等进行进一步的分析和存储。

通过本篇文章的学习,你将能够运用分布式爬虫技术,抓取并存储中文日报的新闻数据,为你后续的数据分析和项目开发打下坚实的基础。如果你希望深入了解分布式爬虫在实际项目中的应用,那么今天的教程将是一个绝佳的实践机会。

🚀一、分布式爬取中文日报新闻数据

🔎1.网页分析

  1. 目标网址

    • 示例分页地址规律:
      http://china.chinadaily.com.cn/5bd5639ca3101a87ca8ff636/page_{页码}.html
    • 通过修改末尾页码实现翻页(1-100页)。
  2. 数据定位

    • 使用开发者工具定位以下字段的HTML位置:
      • 新闻标题 <h3> 标签内文本
      • 新闻简介 <p> 标签内文本
      • 新闻详情页地址 <a> 标签的 href 属性
      • 发布时间 <b> 标签内文本

在这里插入图片描述

🔎2.数据库设计

  1. 创建数据库

    • 数据库名:news_data
    • 字符集:utf8mb4,排序规则:utf8mb4_0900_ai_ci
  2. 数据表结构

    • 表名:news
    • 字段:
      • id (主键,自增)
      • title (新闻标题,VARCHAR 255)
      • synopsis (简介,VARCHAR 255)
      • url (详情页地址,VARCHAR 255)
      • time (发布时间,VARCHAR 20)

在这里插入图片描述

🔎3.Scrapy项目搭建

  1. 创建项目

    scrapy startproject distributed
    cd distributed
    scrapy genspider distributedSpider china.chinadaily.com.cn
    

    在这里插入图片描述

  2. 项目结构

    • items.py:定义数据字段
    • middlewares.py:随机请求头中间件
    • pipelines.py:MySQL数据存储管道
    • settings.py:分布式配置

核心代码实现

  1. 随机请求头中间件 (middlewares.py)

    from fake_useragent import UserAgent  # 导入请求头类
    # 自定义随机请求头的中间件
    class RandomHeaderMiddleware(object):def __init__(self, crawler):self.ua = UserAgent()  # 随机请求头对象# 如果配置文件中不存在就使用默认的Google Chrome请求头self.type = crawler.settings.get("RANDOM_UA_TYPE", "chrome")@classmethoddef from_crawler(cls, crawler):# 返回cls()实例对象return cls(crawler)# 发送网络请求时调用该方法def process_request(self, request, spider):# 设置随机生成的请求头request.headers.setdefault('User-Agent', getattr(self.ua, self.type))
    
  2. 数据项定义 (items.py)

    import scrapyclass DistributedItem(scrapy.Item):news_title = scrapy.Field()  # 保存新闻标题news_synopsis = scrapy.Field()  # 保存新闻简介news_url = scrapy.Field()  # 保存新闻详情页面的地址news_time = scrapy.Field()  # 保存新闻发布时间pass
    
  3. MySQL存储管道 (pipelines.py)

    # -*- coding: utf-8 -*-# Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.htmlimport pymysql            # 导入数据库连接pymysql模块
    class DistributedPipeline(object):# 初始化数据库参数def __init__(self,host,database,user,password,port):self.host = hostself.database = databaseself.user = userself.password = passwordself.port = port@classmethoddef from_crawler(cls, crawler):# 返回cls()实例对象,其中包含通过crawler获取配置文件中的数据库参数return cls(host=crawler.settings.get('SQL_HOST'),user=crawler.settings.get('SQL_USER'),password=crawler.settings.get('SQL_PASSWORD'),database=crawler.settings.get('SQL_DATABASE'),port=crawler.settings.get('SQL_PORT'))# 打开爬虫时调用def open_spider(self, spider):# 数据库连接self.db = pymysql.connect(self.host, self.user, self.password, self.database, self.port, charset='utf8')self.cursor = self.db.cursor()  # 床架游标# 关闭爬虫时调用def close_spider(self, spider):self.db.close()def process_item(self, item, spider):data = dict(item)  # 将item转换成字典类型# sql语句sql = 'insert into news (title,synopsis,url,time) values(%s,%s,%s,%s)'# 执行插入多条数据self.cursor.executemany(sql, [(data['news_title'], data['news_synopsis'],data['news_url'],data['news_time'])])self.db.commit()  # 提交return item  # 返回item
    
  4. 爬虫逻辑 (distributedSpider.py)

    # -*- coding: utf-8 -*-
    import scrapy
    from distributed.items import DistributedItem   # 导入Item对象
    class DistributedspiderSpider(scrapy.Spider):name = 'distributedSpider'allowed_domains = ['china.chinadaily.com.cn']start_urls = ['http://china.chinadaily.com.cn/']# 发送网络请求def start_requests(self):for i in  range(1,101):    # 由于新闻网页共计100页,所以循环执行100次# 拼接请求地址url = self.start_urls[0] + '5bd5639ca3101a87ca8ff636/page_{page}.html'.format(page=i)# 执行请求yield scrapy.Request(url=url,callback=self.parse)# 处理请求结果def parse(self, response):item = DistributedItem()               # 创建item对象all = response.css('.busBox3')         # 获取每页所有新闻内容for i in all:                          # 循环遍历每页中每条新闻title = i.css('h3 a::text').get()    # 获取每条新闻标题synopsis = i.css('p::text').get()    # 获取每条新闻简介url = 'http:'+i.css('h3 a::attr(href)').get()      # 获取每条新闻详情页地址time_ = i.css('p b::text').get()       # 获取新闻发布时间item['news_title'] = title            # 将新闻标题添加至itemitem['news_synopsis'] = synopsis      # 将新闻简介内容添加至itemitem['news_url'] = url                # 将新闻详情页地址添加至itemitem['news_time'] = time_                   # 将新闻发布时间添加至itemyield item  # 打印item信息pass# 导入CrawlerProcess类
    from scrapy.crawler import CrawlerProcess
    # 导入获取项目配置信息
    from scrapy.utils.project import get_project_settings# 程序入口
    if __name__=='__main__':# 创建CrawlerProcess类对象并传入项目设置信息参数process = CrawlerProcess(get_project_settings())# 设置需要启动的爬虫名称process.crawl('distributedSpider')# 启动爬虫process.start()
    

🔎4.分布式配置 (settings.py)

BOT_NAME = 'distributed'SPIDER_MODULES = ['distributed.spiders']
NEWSPIDER_MODULE = 'distributed.spiders'# Obey robots.txt rules
ROBOTSTXT_OBEY = True# 启用redis调度存储请求队列
SCHEDULER  = 'scrapy_redis.scheduler.Scheduler'
#确保所有爬虫通过redis共享相同的重复筛选器。
DUPEFILTER_CLASS  = 'scrapy_redis.dupefilter.RFPDupeFilter'
#不清理redis队列,允许暂停/恢复爬虫
SCHEDULER_PERSIST =True
#使用默认的优先级队列调度请求
SCHEDULER_QUEUE_CLASS ='scrapy_redis.queue.PriorityQueue'
REDIS_URL ='redis://127.0.0.1:6379'
DOWNLOADER_MIDDLEWARES = {# 启动自定义随机请求头中间件'distributed.middlewares.RandomHeaderMiddleware': 200,# 'distributed.middlewares.DistributedDownloaderMiddleware': 543,
}
# 配置请求头类型为随机,此处还可以设置为ie、firefox以及chrome
RANDOM_UA_TYPE = "random"
ITEM_PIPELINES = {'distributed.pipelines.DistributedPipeline': 300,'scrapy_redis.pipelines.RedisPipeline':400
}
# 配置数据库连接信息
SQL_HOST = '127.0.0.1'      # 数据库地址
SQL_USER = 'root'            # 用户名
SQL_PASSWORD='123456'          # 密码
SQL_DATABASE = 'news_data'    # 数据库名称
SQL_PORT = 3306              # 端口

🔎5.启动分布式爬虫

  1. 数据库远程配置

    • Redis:修改 redis.windows-service.confbind 为服务器IP,重启服务。
    • MySQL:执行以下SQL开启远程连接:
      UPDATE mysql.user SET host='%' WHERE user='root';
      FLUSH PRIVILEGES;
      
  2. 多节点运行

    • 在多台机器部署爬虫代码,修改 settings.py 中的数据库IP为服务器地址。
    • 同时启动爬虫,观察Redis任务队列与MySQL数据入库情况。

效果验证

  • Redis Desktop Manager 查看去重URL (dupefilter) 和爬取数据 (items)。
  • MySQL 中 news 表应包含所有爬取的新闻数据。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统编程 day9 SIGCHLD and 线程

SIGCHLD信号 只要子进程信号发生改变&#xff0c;就会产生SIGCHLD信号。 借助SIGCHLD信号回收子进程 回收子进程只跟父进程有关。如果不使用循环回收多个子进程&#xff0c;会产生多个僵尸进程&#xff0c;原因是因为这个信号不会循环等待。 #include<stdio.h> #incl…

微信小程序拖拽排序有效果图

效果图 .wxml <view class"container" style"--w:{{w}}px;" wx:if"{{location.length}}"><view class"container-item" wx:for"{{list}}" wx:key"index" data-index"{{index}}"style"--…

hadoop三大组件的结构及各自的作用

1 HDFS 1.1功能 HDFS 是 Hadoop 的分布式文件系统&#xff0c;用于存储和管理海量数据。它具有高容错性、高吞吐量和可扩展性&#xff0c;能够在多个节点上存储和管理大规模数据 1.2架构&#xff1a;采用主从架构&#xff0c;由一个 NameNode 和多个 DataNode 组成。NameNode…

解决jupyter notebook修改路径下没有c.NotebookApp.notebook_dir【建议收藏】

文章目录 一、检查并解决问题二、重新设置默认路径创作不易&#xff0c;感谢未来首富们的支持与关注&#xff01; 最近在用jupyter notebook编写代码时&#xff0c;更新了一下Scikit-learn的版本&#xff0c;然后重新打开jupyter notebook的时候&#xff0c;我傻眼了&#xff0…

MCP Host、MCP Client、MCP Server全流程实战

目录 准备工作 MCP Server 实现 调试工作 MCP Client 实现 MCP Host 配置 第一步:配置支持 function calling的 LLM 第二步:添加MCP Server 一般有两种方式,第一种json配置,第二种直接是Command形式,我这里采用Command形式 第三步:使用MCP Server 准备工作 安装…

4.21—4.22学习总结 JavaWeb:HTML-CSS

Web&#xff1a;能够通过浏览器访问到的网站。 Web标准&#xff1a; HTML&#xff1a; vscode中进行注释的快捷键为ctrl斜线/ h1的字体最大&#xff0c;依次递减&#xff0c;只存在h1—h6。 超链接&#xff1a; 设置字体颜色&#xff1a; 方式三写一个css文件&#xff0c;将方…

Kaamel Agent: 基于EU AI Act的AI影响评估(AIIA)

1. 引言&#xff1a;安全视角下的AI监管 随着人工智能技术的快速发展和广泛应用&#xff0c;AI系统在为社会带来创新和效率的同时&#xff0c;也引发了诸多关于安全、隐私和合规的担忧。在这一背景下&#xff0c;全球范围内涌现出多种监管框架和标准&#xff0c;旨在确保AI系统…

Mongodb分布式文件存储数据库

文章目录 一、MongoDB 简介基本信息特点内部组件 二、MongoDB 部署1. 安装依赖2. 解压部署并配置环境变量3. 修改配置文件以及启动服务4.数据库权限管理 三、MongoDB 管理1. 角色权限2. 操作命令用户管理命令常用命令&#xff08;Mongo4.2.8&#xff09;数据库相关用户相关集合…

麒麟V10安装MySQL8.4

1、下载安装包 wget https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-8.4.5-1.el7.x86_64.rpm-bundle.tar2、解压 mkdir -p /opt/mysql tar -xvf mysql-8.4.5-1.el7.x86_64.rpm-bundle.tar -C /opt/mysql3、安装MySQL 3.1、卸载mariadb rpm -qa | grep mariadb rpm -e m…

Unreal如何使用后处理材质实现一个黑屏渐变效果

文章目录 前言相机后期处理材质创建材质相机设置动态修改FadeAlpha参数使用示例最后前言 UE5 开发VR ,如何通过PostProcess轻松实现黑屏渐变效果 最简单的办法,其实是使用一个半球形模型,遮挡住相机,然后控制这个半球形遮罩的颜色透明度,至少Unity中默认的Tunneling是这么…

其它生成式(对比列表生成式)

一、字典生成式&#xff1a; # keys[name, age, gender] # dic{key:None for key in keys} # print(dic) items[(name, Tom), (age, 18), (gender, male)] res{k:v for k,v in items if k ! gender} print(res) 二、集合生成式&#xff1a; keys[name, age, gender] set1{ke…

健身房管理系统(springboot+ssm+vue+mysql)含运行文档

健身房管理系统(springbootssmvuemysql)含运行文档 健身房管理系统是一个全面的解决方案&#xff0c;旨在帮助健身房高效管理其运营。系统提供多种功能模块&#xff0c;包括会员管理、员工管理、会员卡管理、教练信息管理、解聘管理、健身项目管理、指导项目管理、健身器材管理…

LeetCode 第 262 题全解析:从 SQL 到 Swift 的数据分析实战

文章目录 摘要描述题解答案&#xff08;SQL&#xff09;Swift 题解代码分析代码示例&#xff08;可运行 Demo&#xff09;示例测试及结果时间复杂度分析空间复杂度分析总结未来展望 摘要 在实际业务中&#xff0c;打车平台要监控行程的取消率&#xff0c;及时识别服务质量的问…

三生原理与现有密码学的核心区别?

AI辅助创作&#xff1a; 三生原理与现有密码学的核心区别 一、‌哲学基础与设计逻辑‌ ‌动态生成 vs 静态分析‌ 三生原理以“阴阳动态平衡”为核心&#xff0c;通过参数化生成&#xff08;如素数构造中的阴阳元联动公式&#xff09;模拟系统演化过程&#xff0c;而现有密码…

4.19-4.20学习总结 网络编程+反射+动态代理

网络编程&#xff1a; IPv6有2的128次方个ip。 端口号&#xff1a; 协议&#xff1a; UDP发送和接收消息&#xff1a; UDP的三种通信方式&#xff1a; 单播&#xff1a;一对一&#xff0c;一个发送端对应一个接收端 创建DatagramSocket对象 组播&#xff1a;一个发送端对应一…

Swiper、样式结构重用、GridGridItem

今日核心&#xff1a; 容器组件&#xff1a;Swiper、Grid\GridItem样式&结构重用&#xff1a;Builder、Extend、Styles 相关资源: 图片素材&#xff1a;&#x1f4ce;day01.zip 1. Swiper 1.1. 适用场景 首先来看看 Swiper 在什么情况下会用到 链接 Swiper组件提供滑…

前沿分享|技术雷达202504月刊精华

本期雷达 ###技术部分 7. GraphRAG 试验 在上次关于 检索增强生成&#xff08;RAG&#xff09;的更新中&#xff0c;我们已经介绍了GraphRAG。它最初在微软的文章中被描述为一个两步的流程&#xff1a; &#xff08;1&#xff09;对文档进行分块&#xff0c;并使用基于大语言…

数据结构与算法-顺序表应用

一.通讯录的创建 首先我们要理解的是通讯录本身就是以顺序表为底层的 只不过顺序表中的数组&#xff0c;这里我们是用结构体来替代&#xff0c;用来存储用户的信息 由于是通讯录的本质就是顺序表&#xff0c;所以顺序表的任何方法它都能套用 Contact.h: #pragma once #def…

【C++】新手入门指南(下)

文章目录 前言 一、引用 1.引用的概念和定义 2.引用的特性 3.引用的使用 4.const引用 5.指针和引用的关系 二、内联函数 三、nullptr 总结 前言 这篇续上篇的内容新手入门指南&#xff08;上&#xff09;&#xff0c;继续带大家学习新知识。如果你感兴趣欢迎订购本专栏。 一、…

uniapp-商城-33-shop 布局搜索页面以及u-search

shop页面上有一个搜索&#xff0c;可以进行商品搜索&#xff0c;这里我们先做一个页面布局&#xff0c;后面再来进行数据i联动。 1、shop页面的搜索 2、搜索的页面代码 <navigator class"searchView" url"/pagesub/pageshop/search/search"> …