Python爬蟲(六):Scrapy框架

"Scrapy到底該怎么學?"今天,我將用這篇萬字長文,帶你從零開始掌握Scrapy框架的核心用法,并分享我在實際項目中的實戰經驗!建議收藏?!

一、Scrapy簡介:為什么選擇它?

1.1 Scrapy vs Requests+BeautifulSoup

很多新手會問:“我已經會用Requests+BeautifulSoup了,為什么還要學Scrapy?”

對比項Requests+BS4Scrapy
性能同步請求,速度慢異步IO,高性能
擴展性需要手動實現內置中間件、管道系統
功能完整性僅基礎爬取自帶去重、隊列管理、異常處理
適用場景小規模數據采集企業級爬蟲項目

👉 結論:如果是小型項目,Requests夠用;但如果是商業級爬蟲,Scrapy是更好的選擇!

1.2 Scrapy核心架構

(圖解Scrapy架構,建議配合流程圖理解)

生成Request
發送請求
排隊
返回Response
生成Item
Spider
Engine
Scheduler
Downloader
Item Pipeline

二、手把手實戰:開發你的第一個Scrapy爬蟲

2.1 環境準備

# 推薦使用虛擬環境
python -m venv scrapy_env
source scrapy_env/bin/activate  # Linux/Mac
scrapy_env\Scripts\activate  # Windowspip install scrapy

2.2 創建項目

scrapy startproject book_crawler
cd book_crawler
scrapy genspider books books.toscrape.com

2.3 編寫爬蟲代碼

# spiders/books.py
import scrapyclass BooksSpider(scrapy.Spider):name = "books"def start_requests(self):urls = ['http://books.toscrape.com/']for url in urls:yield scrapy.Request(url=url, callback=self.parse)def parse(self, response):# 提取書籍信息for book in response.css('article.product_pod'):yield {'title': book.css('h3 a::attr(title)').get(),'price': book.css('p.price_color::text').get(),'rating': book.css('p.star-rating::attr(class)').get().split()[-1]}# 翻頁邏輯next_page = response.css('li.next a::attr(href)').get()if next_page:yield response.follow(next_page, callback=self.parse)

2.4 運行爬蟲

scrapy crawl books -o books.csv

三、Scrapy高級技巧(企業級應用)

3.1 突破反爬:隨機UserAgent+代理IP

# middlewares.py
from fake_useragent import UserAgent
import randomclass RandomUserAgentMiddleware:def process_request(self, request, spider):request.headers['User-Agent'] = UserAgent().randomclass ProxyMiddleware:PROXY_LIST = ['http://proxy1.example.com:8080','http://proxy2.example.com:8080']def process_request(self, request, spider):proxy = random.choice(self.PROXY_LIST)request.meta['proxy'] = proxy

settings.py中啟用:

DOWNLOADER_MIDDLEWARES = {'book_crawler.middlewares.RandomUserAgentMiddleware': 543,'book_crawler.middlewares.ProxyMiddleware': 544,
}

3.2 數據存儲:MySQL+Pipeline

# pipelines.py
import pymysqlclass MySQLPipeline:def __init__(self):self.conn = pymysql.connect(host='localhost',user='root',password='123456',db='scrapy_data',charset='utf8mb4')self.cursor = self.conn.cursor()def process_item(self, item, spider):sql = """INSERT INTO books(title, price, rating) VALUES (%s, %s, %s)"""self.cursor.execute(sql, (item['title'],item['price'],item['rating']))self.conn.commit()return itemdef close_spider(self, spider):self.conn.close()

四、常見問題Q&A

Q1:如何爬取JavaScript渲染的頁面?

方案一:Scrapy+Splash

# 安裝:docker run -p 8050:8050 scrapinghub/splash
yield scrapy.Request(url,self.parse,meta={'splash': {'args': {'wait': 2.5}}}
)

方案二:Scrapy+Playwright(推薦)

# settings.py
DOWNLOAD_HANDLERS = {"http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler","https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
}

Q2:如何實現分布式爬蟲?

使用scrapy-redis

# settings.py
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL = 'redis://:password@localhost:6379/0'

五、性能優化技巧

  1. 并發控制

    # settings.py
    CONCURRENT_REQUESTS = 32  # 默認16
    DOWNLOAD_DELAY = 0.25  # 防止被封
    
  2. 緩存請求

    HTTPCACHE_ENABLED = True
    HTTPCACHE_EXPIRATION_SECS = 86400  # 緩存1天
    
  3. 自動限速

    AUTOTHROTTLE_ENABLED = True
    AUTOTHROTTLE_START_DELAY = 5.0
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84652.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84652.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84652.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux中關閉swap分區

在 Linux 系統中關閉 swap 分區(或交換文件)的步驟如下,請務必在操作前保存所有數據,以免丟失: 📌 完整操作步驟: 1. 查看當前 swap 使用情況 free -h swapon --show # 查看活躍的 swap 設…

RPGMZ游戲引擎之如何設計每小時開啟一次的副本

本文知識點 1. 獲取時間 2. 時間格式要正確 3. 事件內如何設計 正文開始 1. 獲取時間 首先獲取當前時間 然后保存在 事件內的變量里面 后需要判斷時間是否相等 function 獲取當前日期(){const now new Date();return now.toISOString();}; 2. 時間格式要正確 now.toI…

學習路之uniapp--uniapp擴展uni-ui

這里寫目錄標題 一、新建項目二、下載導入插件三、直接創建uni-ui項目 一、新建項目 二、下載導入插件 三、直接創建uni-ui項目 創建uniapp項目時,直接創建uni-ui項目

Kotlin 2.6 猜數小游戲

本次實戰通過開發猜數小游戲,深入學習了 Kotlin 編程的循環控制和條件判斷。游戲要求計算機隨機生成一個數字,用戶通過輸入猜測,程序根據猜測結果給出提示,直到猜中為止。通過實現這一過程,我們掌握了如何使用 while 循…

RNN工作原理和架構

## 1. 什么是 RNN? * **全稱:** Recurrent Neural Network(循環神經網絡) * **核心特點:** 它是一種專門設計用來處理**序列數據**的神經網絡。 * **核心能力:** 擁有“記憶”能力,能夠利用**…

智能計算模擬:第一性原理+分子動力學+機器學習

第一性原理分子動力學機器學習”三位一體的綜合手段,已經成為模擬計算的一個前沿方向,為解決傳統計算化學方法面臨的挑戰提供了新的解決方案。國內外已有科研團隊在深化第一性原理與分子動力學的研究與應用拓展,利用機器學習優化大規模計算、…

基于Attention機制的模型。這使得它擺脫了RNN模型順序讀取序列的缺點,可以實現高度的并行化的理解

這句話的核心意思是:??該模型完全基于注意力機制(Attention Mechanism),不再依賴傳統的循環神經網絡(RNN)結構,因此避免了 RNN 的順序計算問題,能夠實現高效的并行化計算??。我們可以從以下幾個方面深入理解: 1. ??"僅基于 Attention 機制"?? ??傳…

解決虛擬機 Kali 系統安裝了VMware Tools 不能拖入文件問題

進入終端,這里我是root模式下,不是root模式在命令前加一個sudo即可,命令如下: apt install open-vm-tools open-vm-tools-desktop 執行成功后輸入 reboot 重啟后即可

GitHub OAuth 認證示例

GitHub鏈接:github_auth 流程圖 功能特性 ? GitHub OAuth 認證? 獲取用戶基本信息? 顯示用戶的 GitHub 倉庫列表? 安全的會話管理? 響應式用戶界面 技術棧 后端 Flask - Python Web 框架Flask-CORS - 跨域資源共享Requests - HTTP 庫Session - 會話管理 …

百度蘿卜快跑攜4顆禾賽激光雷達進軍迪拜,千輛L4無人車開啟全球化戰略

3月28日,百度旗下自動駕駛出行服務平臺“蘿卜快跑”宣布在迪拜市區啟動無人駕駛規模化測試及服務,計劃部署超1000輛L4級全無人駕駛汽車。此次出海不僅是蘿卜快跑首次在中國以外地區實現規模化落地,更以“單車搭載4顆禾賽激光雷達”的硬件配置引發行業關注,標志著中國自動駕…

湖北師范大學人工智能與計算機學院電子信息研究生課程《隨機過程》第六次作業

一. 計算題(共10題,100分) 1. (計算題, 10分)隨機信號 的實測樣本函數如題圖(a)與(b)所示, ,期中X為隨機變量, ,試說明它們可能是均值各態歷經的嗎?(寫明道理&#xff…

解決Windows Server打開DNS提示“拒絕訪問”和“RPC服務器不可用”

問題背景 在一個活動目錄域xyzz.internal中,有兩臺域控制器(Domain Controller),各位于一個站點。 問題 當我們在其中一臺域控制器上的服務器管理器中打開DNS管理工具時,卻看到類似如下錯誤,提示拒絕訪問…

Python中字符串常用的操作方法

在Python中,字符串是不可變序列類型,提供了豐富的內置方法。以下是常用的字符串操作方法及示例: 1. 大小寫轉換 lower() 轉小寫 upper() 轉大寫 capitalize() 首字母大寫 title() 每個單詞首字母大寫 swapcase() 大小寫互換 print(&q…

利用百度/高德地圖API實現車輛軌跡跟蹤系統

利用百度/高德地圖API實現車輛軌跡跟蹤系統 摘要: 本文詳細闡述了如何利用百度地圖API或高德地圖API構建一套完整的車輛軌跡跟蹤系統。內容涵蓋系統架構設計、數據采集與傳輸、地圖API核心功能實現(地圖展示、軌跡繪制、實時定位、歷史軌跡回放)、關鍵優化技術(軌跡糾偏、…

解鎖K-近鄰算法:數據挖掘的秘密武器

目錄 一、K - 近鄰算法是什么二、算法原理深度剖析2.1 核心思想2.2 距離度量方式2.3 K 值的選擇2.4 分類決策規則 三、K - 近鄰算法實踐3.1 準備數據集3.2 代碼實現步驟3.3 結果分析與評估 四、K - 近鄰算法優缺點4.1 優點闡述4.2 缺點分析 五、應用案例展示5.1 圖像識別領域5.…

華為OD機試_2025 B卷_構成正方形數量(Python,100分)(附詳細解題思路)

題目描述 輸入N個互不相同的二維整數坐標&#xff0c;求這N個坐標可以構成的正方形數量。[內積為零的的兩個向量垂直] 輸入描述 第一行輸入為N&#xff0c;N代表坐標數量&#xff0c;N為正整數。N < 100 之后的 K 行輸入為坐標x y以空格分隔&#xff0c;x&#xff0c;y為整…

Qt:智能指針QScopedPointer使用

QScopedPointer和C中的智能指針std::unique_ptr其概念是一樣的&#xff0c;它包裝了new操作符在堆上分配的動態對象&#xff0c;能夠保證動態創建的對象在任何時候都可以被正確地刪除。但它有更嚴格的所有權&#xff0c;并且不能轉讓&#xff0c;一旦獲取了對象的管理權&#x…

TensorFlow基礎之理解計算圖

Tensor Flow TensorFlow 本章介紹TensorFlow的基礎。特別地&#xff0c;你將學習如何用TensorFlow進行基礎計算。在開始使用 TensorFlow之前,你必須理解它背后的哲學。 這個庫基于計算圖的概念&#xff0c;如果你不理解計算圖是如何工作的&#xff0c;你就不能理解如何使用這…

【HarmonyOS Next之旅】DevEco Studio使用指南(三十五) -> 配置構建(二)

目錄 1 -> 定制HAP多目標構建產物 1.1 -> 定義產物的HAP包名 1.2 -> 定義產物的deviceType 1.3 -> 定義產物的distributionFilter 1.4 -> 定義產物preloads的分包 1.5 -> 定義產物的source源碼集-pages 1.6 -> 定義產物的source源碼集-sourceRoots…

[muduo] ThreadPool | TcpClient | 異步任務 | 通信測試

第九章&#xff1a;線程池&#xff08;ThreadPool&#xff09; 在第八章《TcpServer》中&#xff0c;我們了解到muduo::net::TcpServer通過EventLoop線程池處理入站連接。 這些EventLoop線程主要負責網絡I/O&#xff1a;套接字讀寫和定時器處理&#xff0c;由Poller和Channel…