【愚公系列】《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.pswp.cn/bicheng/77925.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77925.shtml
英文地址,請注明出處:http://en.pswp.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"> …