Python3 Scrapy庫(kù)安裝使用教程
前言
Python作為一門(mén)簡(jiǎn)潔、易讀、功能強(qiáng)大的編程語(yǔ)言,其基礎(chǔ)語(yǔ)法是入門(mén)學(xué)習(xí)的核心。掌握好基礎(chǔ)語(yǔ)法,能為后續(xù)的編程實(shí)踐打下堅(jiān)實(shí)的基礎(chǔ)。本文將全面講解Python3的基礎(chǔ)語(yǔ)法知識(shí),適合編程初學(xué)者系統(tǒng)學(xué)習(xí)。Python以其簡(jiǎn)潔優(yōu)雅的語(yǔ)法和強(qiáng)大的通用性,成為當(dāng)今最受歡迎的編程語(yǔ)言。本專(zhuān)欄旨在系統(tǒng)性地帶你從零基礎(chǔ)入門(mén)到精通Python核心。無(wú)論你是零基礎(chǔ)小白還是希望進(jìn)階的專(zhuān)業(yè)開(kāi)發(fā)者,都將通過(guò)清晰的講解、豐富的實(shí)例和實(shí)戰(zhàn)項(xiàng)目,逐步掌握語(yǔ)法基礎(chǔ)、核心數(shù)據(jù)結(jié)構(gòu)、函數(shù)與模塊、面向?qū)ο缶幊?、文件處理、主流?kù)應(yīng)用(如數(shù)據(jù)分析、Web開(kāi)發(fā)、自動(dòng)化)以及面向?qū)ο蟾呒?jí)特性,最終具備獨(dú)立開(kāi)發(fā)能力和解決復(fù)雜問(wèn)題的思維,高效應(yīng)對(duì)數(shù)據(jù)分析、人工智能、Web應(yīng)用、自動(dòng)化腳本等廣泛領(lǐng)域的實(shí)際需求。
一、Scrapy是什么?為什么選它?
在Python爬蟲(chóng)領(lǐng)域,我們可能用過(guò)requests(發(fā)送請(qǐng)求)+BeautifulSoup(解析頁(yè)面)的組合,但這類(lèi)工具更適合簡(jiǎn)單的小規(guī)模爬取。如果需要處理大規(guī)模爬取、自動(dòng)去重、請(qǐng)求頻率控制、數(shù)據(jù)持久化等復(fù)雜需求,Scrapy會(huì)是更優(yōu)選擇。
Scrapy是一個(gè)全功能的Python爬蟲(chóng)框架,內(nèi)置了請(qǐng)求處理、錯(cuò)誤重試、狀態(tài)跟蹤、分布式爬取等核心能力,支持高度自定義擴(kuò)展,廣泛用于數(shù)據(jù)挖掘、信息采集、歷史數(shù)據(jù)存儲(chǔ)等場(chǎng)景。
二、第一步:安裝Scrapy
Scrapy的安裝非常簡(jiǎn)單,通過(guò)pip即可完成,適用于Windows、Mac、Linux全平臺(tái)。
安裝命令
打開(kāi)終端(Windows用CMD或PowerShell,Mac/Linux用Terminal),執(zhí)行:
pip install scrapy
驗(yàn)證安裝
安裝完成后,執(zhí)行以下命令查看版本,若正常輸出則安裝成功:
scrapy version

注意:若Windows系統(tǒng)安裝時(shí)出現(xiàn)依賴(lài)錯(cuò)誤(如pywin32相關(guān)報(bào)錯(cuò)),可先執(zhí)行pip install pywin32,再重新安裝Scrapy。
三、第二步:了解Scrapy項(xiàng)目結(jié)構(gòu)
Scrapy采用結(jié)構(gòu)化目錄管理項(xiàng)目,通過(guò)命令行工具快速創(chuàng)建項(xiàng)目。
1. 創(chuàng)建Scrapy項(xiàng)目
執(zhí)行以下命令,創(chuàng)建一個(gè)名為douban_crawler的項(xiàng)目(項(xiàng)目名可自定義):
scrapy startproject douban_crawler
2. 項(xiàng)目目錄解析
創(chuàng)建完成后,目錄結(jié)構(gòu)如下(關(guān)鍵文件已標(biāo)注作用):
douban_crawler/ # 項(xiàng)目根目錄
├─ scrapy.cfg # 項(xiàng)目全局配置文件(如部署相關(guān))
└─ douban_crawler/ # 項(xiàng)目核心代碼目錄
├─ __init__.py
├─ items.py # 定義數(shù)據(jù)模型(存儲(chǔ)爬取到的數(shù)據(jù)結(jié)構(gòu))
├─ middlewares.py # 中間件(處理請(qǐng)求/響應(yīng),如設(shè)置代理、UA)
├─ pipelines.py # 數(shù)據(jù)管道(清洗、存儲(chǔ)數(shù)據(jù),如存CSV/數(shù)據(jù)庫(kù))
├─ settings.py # 項(xiàng)目核心配置(請(qǐng)求延遲、并發(fā)數(shù)、UA等)
└─ spiders/ # 爬蟲(chóng)腳本目錄(核心爬取邏輯在這里)
└─ __init__.py四、第三步:Scrapy核心組件詳解
Scrapy的工作流程依賴(lài)5個(gè)核心組件,理解它們的作用是編寫(xiě)爬蟲(chóng)的基礎(chǔ):
| 組件 | 作用說(shuō)明 |
|---|---|
| Spider | 爬蟲(chóng)核心腳本,定義“爬哪些頁(yè)面”“怎么提取數(shù)據(jù)”,包含初始URL和數(shù)據(jù)解析邏輯。 |
| Item | 數(shù)據(jù)模型,類(lèi)似Python的類(lèi),用于規(guī)范爬取數(shù)據(jù)的字段(如電影的“標(biāo)題”“評(píng)分”)。 |
| Pipeline | 數(shù)據(jù)處理管道,爬蟲(chóng)提取數(shù)據(jù)后,在這里進(jìn)行清洗(如去重)、存儲(chǔ)(如存CSV)。 |
| Middleware | 中間件,介于引擎和請(qǐng)求/響應(yīng)之間,用于修改請(qǐng)求頭、處理Cookie、設(shè)置代理等。 |
| Settings | 全局配置,控制爬蟲(chóng)的行為(如請(qǐng)求延遲、并發(fā)數(shù)、是否遵守robots協(xié)議)。 |
五、實(shí)戰(zhàn):爬取豆瓣電影Top250
接下來(lái)我們通過(guò)一個(gè)完整案例,從0到1實(shí)現(xiàn)豆瓣電影Top250的數(shù)據(jù)爬取,步驟清晰可復(fù)現(xiàn)。
目標(biāo)
提取豆瓣電影Top250的電影標(biāo)題、評(píng)分、一句話簡(jiǎn)介,并保存到CSV文件中。
步驟1:創(chuàng)建爬蟲(chóng)腳本
進(jìn)入項(xiàng)目根目錄(douban_crawler),執(zhí)行以下命令創(chuàng)建名為movie_spider的爬蟲(chóng),指定爬取域名為movie.douban.com:
cd douban_crawler scrapy genspider movie_spider movie.douban.com
執(zhí)行后,spiders目錄下會(huì)生成movie_spider.py文件,初始代碼如下:
import scrapy
class MovieSpiderSpider(scrapy.Spider):
name = "movie_spider" # 爬蟲(chóng)名稱(chēng)(唯一)
allowed_domains = ["movie.douban.com"] # 允許爬取的域名
start_urls = ["https://movie.douban.com"] # 初始爬取URL
def parse(self, response):
pass # 數(shù)據(jù)解析邏輯待編寫(xiě)步驟2:配置Settings.py(關(guān)鍵!防反爬)
豆瓣有反爬機(jī)制,需修改settings.py中的配置,模擬正常用戶(hù)行為,避免IP被封:
# 1. 設(shè)置User-Agent(模擬瀏覽器請(qǐng)求) 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. 不遵守robots.txt協(xié)議(豆瓣robots禁止爬取Top250,學(xué)習(xí)用途可關(guān)閉) ROBOTSTXT_OBEY = False # 3. 設(shè)置下載延遲(2秒/次,避免請(qǐng)求過(guò)快) DOWNLOAD_DELAY = 2 # 4. 啟用自動(dòng)限速(根據(jù)網(wǎng)站響應(yīng)調(diào)整請(qǐng)求速度) AUTOTHROTTLE_ENABLED = True AUTOTHROTTLE_START_DELAY = 2 # 初始延遲 AUTOTHROTTLE_MAX_DELAY = 5 # 最大延遲
步驟3:編寫(xiě)爬蟲(chóng)核心邏輯(movie_spider.py)
修改movie_spider.py,實(shí)現(xiàn)“請(qǐng)求頁(yè)面→提取數(shù)據(jù)→分頁(yè)爬取”的完整邏輯:
import scrapy
class MovieSpiderSpider(scrapy.Spider):
name = "movie_spider"
allowed_domains = ["movie.douban.com"]
# 初始URL:豆瓣電影Top250首頁(yè)(第1頁(yè))
start_urls = ["https://movie.douban.com/top250"]
# 1. 自定義初始請(qǐng)求(添加Referer,增強(qiáng)模擬瀏覽器效果)
def start_requests(self):
headers = {
# 已在Settings中設(shè)置UA,這里可補(bǔ)充Referer(表明請(qǐng)求來(lái)源)
'Referer': 'https://movie.douban.com/'
}
for url in self.start_urls:
# 生成請(qǐng)求,指定回調(diào)函數(shù)為parse(處理響應(yīng))
yield scrapy.Request(url=url, headers=headers, callback=self.parse)
# 2. 解析頁(yè)面數(shù)據(jù)(核心方法)
def parse(self, response):
# ① 提取當(dāng)前頁(yè)所有電影項(xiàng)(豆瓣Top250每頁(yè)25部電影)
movie_list = response.css('div.item') # CSS選擇器定位電影列表
for movie in movie_list:
# 提取單部電影的字段
yield {
# 電影標(biāo)題(取第一個(gè)span.title的文本)
'title': movie.css('span.title::text').get(),
# 電影評(píng)分(span.rating_num的文本)
'rating': movie.css('span.rating_num::text').get(),
# 一句話簡(jiǎn)介(span.inq的文本,若沒(méi)有則為None)
'quote': movie.css('span.inq::text').get()
}
# ② 處理分頁(yè)(爬取下一頁(yè))
# 定位“下一頁(yè)”鏈接(span.next下的a標(biāo)簽的href屬性)
next_page = response.css('span.next a::attr(href)').get()
if next_page is not None:
# 生成下一頁(yè)的請(qǐng)求,回調(diào)函數(shù)仍為parse(循環(huán)解析)
yield response.follow(next_page, callback=self.parse)步驟4:運(yùn)行爬蟲(chóng)并保存數(shù)據(jù)
執(zhí)行以下命令,啟動(dòng)movie_spider爬蟲(chóng),并將數(shù)據(jù)保存到douban_top250.csv文件中:
scrapy crawl movie_spider -o douban_top250.csv
scrapy crawl movie_spider:?jiǎn)?dòng)名為movie_spider的爬蟲(chóng)-o douban_top250.csv:將爬取結(jié)果輸出到CSV文件(支持JSON、XML等格式)
結(jié)果查看
運(yùn)行完成后,項(xiàng)目根目錄會(huì)生成douban_top250.csv文件,用Excel或文本編輯器打開(kāi)即可看到提取的數(shù)據(jù):
| title | rating | quote |
|---|---|---|
| 肖申克的救贖 | 9.7 | 希望是件好東西,也許是世上最好的東西。 |
| 霸王別姬 | 9.6 | 說(shuō)的是一輩子!差一年,一個(gè)月,一天,一個(gè)時(shí)辰,都不算一輩子! |
六、Scrapy常用方法與設(shè)置匯總
掌握以下常用方法和配置,能應(yīng)對(duì)80%的爬蟲(chóng)場(chǎng)景:
1. 核心爬蟲(chóng)方法
| 方法名 | 作用說(shuō)明 | 示例代碼 |
|---|---|---|
start_requests() | 生成初始請(qǐng)求(可自定義請(qǐng)求頭、方法) | yield scrapy.Request(url, callback=self.parse) |
parse(response) | 解析響應(yīng),提取數(shù)據(jù)或生成新請(qǐng)求 | title = response.css('h1::text').get() |
response.follow() | 自動(dòng)處理相對(duì)URL,生成下一頁(yè)請(qǐng)求 | yield response.follow(next_page, callback=self.parse) |
response.css() | 用CSS選擇器提取數(shù)據(jù) | movie.css('span.title::text').get() |
response.xpath() | 用XPath選擇器提取數(shù)據(jù)(更靈活) | movie.xpath('//span[@class="title"]/text()').get() |
2. 關(guān)鍵配置(Settings.py)
| 配置項(xiàng) | 作用說(shuō)明 | 推薦值 |
|---|---|---|
USER_AGENT | 模擬瀏覽器標(biāo)識(shí),防反爬 | 見(jiàn)步驟2中的Chrome UA |
DOWNLOAD_DELAY | 請(qǐng)求延遲(秒),避免IP被封 | 2-5 |
CONCURRENT_REQUESTS | 并發(fā)請(qǐng)求數(shù)(默認(rèn)16),根據(jù)網(wǎng)站性能調(diào)整 | 8-16 |
ITEM_PIPELINES | 啟用數(shù)據(jù)管道(如存儲(chǔ)到數(shù)據(jù)庫(kù)) | {'douban_crawler.pipelines.MyPipeline': 300} |
七、爬取注意事項(xiàng)
- 遵守網(wǎng)站規(guī)則:優(yōu)先查看目標(biāo)網(wǎng)站的
robots.txt(如https://movie.douban.com/robots.txt),非學(xué)習(xí)用途請(qǐng)勿違反規(guī)則。 - 控制爬取頻率:設(shè)置
DOWNLOAD_DELAY和AUTOTHROTTLE_ENABLED,避免給服務(wù)器造成過(guò)大壓力。 - 避免IP封禁:若爬取量較大,可通過(guò)
Middleware設(shè)置代理IP池,輪換IP地址。 - 合法使用數(shù)據(jù):爬取的數(shù)據(jù)僅用于學(xué)習(xí)和研究,不得用于商業(yè)用途或侵犯他人權(quán)益。
八、總結(jié)與擴(kuò)展
通過(guò)本文,你已經(jīng)掌握了Scrapy的安裝、項(xiàng)目結(jié)構(gòu)、核心組件和實(shí)戰(zhàn)流程。接下來(lái)可以嘗試以下擴(kuò)展方向:
- 數(shù)據(jù)存儲(chǔ):在
pipelines.py中編寫(xiě)邏輯,將數(shù)據(jù)保存到MySQL、MongoDB等數(shù)據(jù)庫(kù)。 - 代理IP配置:在
middlewares.py中添加代理中間件,解決IP封禁問(wèn)題。 - 復(fù)雜頁(yè)面爬取:針對(duì)JavaScript渲染的頁(yè)面(如動(dòng)態(tài)加載內(nèi)容),結(jié)合
Scrapy-Selenium或Playwright爬取。
Scrapy的功能遠(yuǎn)不止于此,更多高級(jí)特性(如分布式爬取、信號(hào)機(jī)制)可參考Scrapy官方文檔。動(dòng)手實(shí)踐是掌握爬蟲(chóng)的最佳方式,趕緊嘗試爬取你感興趣的網(wǎng)站吧!
到此這篇關(guān)于Python3 Scrapy庫(kù)安裝使用教程的文章就介紹到這了,更多相關(guān)Python Scrapy庫(kù)安裝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pymysql.err.DataError:1366的報(bào)錯(cuò)解決
通過(guò)python把數(shù)據(jù)同步至mysql數(shù)據(jù)庫(kù)的過(guò)程中,遇到錯(cuò)誤,本文主要介紹了pymysql.err.DataError:1366的報(bào)錯(cuò)解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
詳解如何將Python可執(zhí)行文件(.exe)反編譯為Python腳本
將?Python?可執(zhí)行文件(.exe)反編譯為?Python?腳本是一項(xiàng)有趣的技術(shù)挑戰(zhàn),可以幫助我們理解程序的工作原理,下面我們就來(lái)看看具體實(shí)現(xiàn)步驟吧2024-03-03
在Django中實(shí)現(xiàn)添加user到group并查看
今天小編就為大家分享一篇在Django中實(shí)現(xiàn)添加user到group并查看,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
PyQt5 實(shí)現(xiàn)字體大小自適應(yīng)分辨率的方法
今天小編就為大家分享一篇PyQt5 實(shí)現(xiàn)字體大小自適應(yīng)分辨率的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Python中super函數(shù)用法實(shí)例分析
這篇文章主要介紹了Python中super函數(shù)用法,結(jié)合實(shí)例形式詳細(xì)分析了Python中super函數(shù)的功能、調(diào)用父類(lèi)相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-03-03

