眉山政府網(wǎng)站建設(shè)seo網(wǎng)站推廣優(yōu)化
前言
在大數(shù)據(jù)和網(wǎng)絡(luò)爬蟲領(lǐng)域,Scrapy 是一個功能強大且廣泛使用的開源爬蟲框架。它能夠幫助我們快速地構(gòu)建爬蟲項目,并高效地從各種網(wǎng)站中提取數(shù)據(jù)。在本篇文章中,我將帶大家從零開始使用 Scrapy 框架,構(gòu)建一個簡單的爬蟲項目,爬取 豆瓣電影 Top 250 的電影信息。
Scrapy 官方文檔:Scrapy Documentation
豆瓣電影 Top 250 :豆瓣電影 Top 250
本文的爬蟲項目配置如下:
- 系統(tǒng):Windows
- Python 版本:3.8.6
- 開發(fā)環(huán)境:PyCharm
如果你使用的是其他系統(tǒng)或 IDE,也可以按照本文的步驟進(jìn)行操作,只需根據(jù)自己的環(huán)境做出相應(yīng)調(diào)整即可。
環(huán)境準(zhǔn)備
1. 安裝 Python
在使用 Scrapy 之前,確保你已經(jīng)安裝了 Python。如果沒有,請先安裝 Python 3.6+ 版本。你可以訪問 Python 官方網(wǎng)站 下載并安裝最新版的 Python。
安裝完成后,打開命令行窗口,輸入以下命令檢查是否安裝成功:
python --version
2. 安裝 Scrapy
確認(rèn)安裝了 Python 后,你可以使用 pip
安裝 Scrapy。pip
是 Python 的包管理工具,它能夠幫助我們安裝各種第三方庫。
在命令行窗口輸入以下命令:
pip install scrapy
安裝完成后,可以通過以下命令檢查 Scrapy 是否安裝成功:
scrapy version
3. 安裝 Anaconda(可選)
如果你更喜歡使用虛擬環(huán)境管理工具,可以選擇安裝 Anaconda,它能夠幫助你更方便地管理項目中的 Python 依賴。你可以從 Anaconda 官方網(wǎng)站 下載并安裝 Anaconda。
使用 Anaconda 創(chuàng)建一個虛擬環(huán)境,并激活環(huán)境后再安裝 Scrapy:
conda create -n scrapy_env python=3.8
conda activate scrapy_env
pip install scrapy
4. 創(chuàng)建 Scrapy 項目
安裝 Scrapy 完成后,我們可以開始創(chuàng)建一個新的 Scrapy 項目。在終端中,進(jìn)入你希望存放項目的目錄,然后運行以下命令:
scrapy startproject DoubanProject
這將創(chuàng)建一個名為 DoubanProject
的 Scrapy 項目,其中包含 Scrapy 默認(rèn)的文件夾和文件結(jié)構(gòu):
DoubanProject/
├── DoubanProject/
│ ├── __init__.py
│ ├── items.py
│ ├── middlewares.py
│ ├── pipelines.py
│ ├── settings.py
└── spiders/├── __init__.py└── douban.py
爬蟲的編寫
1. 編寫 items.py
在 items.py
文件中定義我們要爬取的數(shù)據(jù)字段。豆瓣 Top 250 頁面包含電影的排名、名稱、簡介、評分、評價人數(shù)和電影海報鏈接等信息,因此我們需要定義相應(yīng)的數(shù)據(jù)字段。
import scrapyclass DoubanprojectItem(scrapy.Item):rank = scrapy.Field() # 電影排名movie_name = scrapy.Field() # 電影名稱movie_introduction = scrapy.Field() # 電影簡介picture = scrapy.Field() # 電影海報鏈接movie_rating = scrapy.Field() # 電影評分evaluators = scrapy.Field() # 評價人數(shù)
2. 編寫爬蟲文件 douban.py
在 spiders
目錄下,我們需要創(chuàng)建一個爬蟲文件 douban.py
來定義具體的爬蟲邏輯。Scrapy 通過 Spider
類來定義爬蟲,它包含了爬蟲的名稱、允許訪問的域名、起始 URL,以及如何解析和處理抓取到的數(shù)據(jù)。
2.1 定義爬蟲文件
首先,在 spiders
目錄下創(chuàng)建 douban.py
文件,編寫代碼如下:
import scrapy
from scrapy import Selector, Request
from ..items import DoubanprojectItem # 導(dǎo)入之前定義的 item 數(shù)據(jù)結(jié)構(gòu)
2.2 創(chuàng)建 DoubanSpider
類
在 douban.py
文件中定義一個爬蟲類 DoubanSpider
,繼承自 scrapy.Spider
。name
是爬蟲的名字,用于在命令行中啟動爬蟲,allowed_domains
是允許爬蟲訪問的域名,start_urls
是爬蟲開始爬取的頁面 URL 列表。
class DoubanSpider(scrapy.Spider):name = "douban" # 爬蟲的唯一名稱allowed_domains = ["movie.douban.com"] # 允許的域名范圍start_urls = ["https://movie.douban.com/top250"] # 爬蟲從這個 URL 開始抓取
2.3 編寫 parse
方法
parse
是 Scrapy 中的默認(rèn)解析方法,爬蟲啟動后,Scrapy 會自動下載 start_urls
中的頁面,并將響應(yīng)傳遞給這個方法。在這里,我們會使用 XPath 來提取電影信息。
-
首先使用
Selector
對頁面進(jìn)行解析。 -
然后使用 XPath 提取頁面中所有電影的列表,遍歷每部電影并提取需要的字段信息,如電影的排名、名稱、簡介、評分等。
-
最后通過
yield
返回提取到的數(shù)據(jù)。def parse(self, response):sel = Selector(response) # 使用 Selector 解析 HTML 響應(yīng)movie_items = sel.xpath('//div[@class="article"]//ol[@class="grid_view"]/li') # 提取所有電影條目
2.4 提取電影信息
接下來,我們需要提取每部電影的具體信息。我們定義了 DoubanprojectItem
來存儲每部電影的字段信息,并通過 XPath 提取頁面中的對應(yīng)字段。
for movie in movie_items:item = DoubanprojectItem() # 創(chuàng)建 DoubanprojectItem 實例# 提取電影的各個字段item['rank'] = movie.xpath('.//div[@class="pic"]/em/text()').extract_first() # 電影排名item['movie_name'] = movie.xpath('.//div[@class="hd"]//span[1]/text()').extract_first() # 電影名稱item['movie_introduction'] = movie.xpath('.//div[@class="bd"]//span[@class="inq"]/text()').extract_first(default='無') # 電影簡介item['picture'] = movie.xpath('.//div[@class="pic"]/a/img/@src').extract_first() # 電影海報鏈接item['movie_rating'] = movie.xpath('.//div[@class="star"]/span[2]/text()').extract_first() # 電影評分item['evaluators'] = movie.xpath('.//div[@class="star"]/span[4]/text()').extract_first() # 評價人數(shù)# 返回提取到的 itemyield item
2.5 處理分頁
豆瓣電影的 Top 250 列表分成了 10 頁,每頁顯示 25 部電影。在爬取完第一頁后,我們需要繼續(xù)爬取剩下的頁面。通過提取頁面底部的“下一頁”鏈接,來實現(xiàn)分頁抓取。
# 獲取下一頁的鏈接next_link = sel.xpath('//span[@class="next"]/link/@href').extract_first()if next_link:# 如果存在下一頁鏈接,構(gòu)造請求并遞歸調(diào)用 parse 方法yield Request(url=response.urljoin(next_link), callback=self.parse)
2.6 完整的 douban.py
文件
完整的爬蟲文件 douban.py
如下:
import scrapy
from scrapy import Selector, Request
from ..items import DoubanprojectItem # 導(dǎo)入 item 數(shù)據(jù)結(jié)構(gòu)class DoubanSpider(scrapy.Spider):name = "douban" # 爬蟲的名稱allowed_domains = ["movie.douban.com"] # 允許的域名start_urls = ["https://movie.douban.com/top250"] # 爬蟲起始頁面def parse(self, response):sel = Selector(response) # 解析頁面movie_items = sel.xpath('//div[@class="article"]//ol[@class="grid_view"]/li') # 獲取電影條目列表for movie in movie_items:item = DoubanprojectItem() # 創(chuàng)建 item 實例# 提取電影信息item['rank'] = movie.xpath('.//div[@class="pic"]/em/text()').extract_first()item['movie_name'] = movie.xpath('.//div[@class="hd"]//span[1]/text()').extract_first()item['movie_introduction'] = movie.xpath('.//div[@class="bd"]//span[@class="inq"]/text()').extract_first(default='無')item['picture'] = movie.xpath('.//div[@class="pic"]/a/img/@src').extract_first()item['movie_rating'] = movie.xpath('.//div[@class="star"]/span[2]/text()').extract_first()item['evaluators'] = movie.xpath('.//div[@class="star"]/span[4]/text()').extract_first()yield item # 返回 item# 處理分頁next_link = sel.xpath('//span[@class="next"]/link/@href').extract_first()if next_link:yield Request(url=response.urljoin(next_link), callback=self.parse)
詳細(xì)解釋:
- Spider 類定義:
name
確定了爬蟲的名字,allowed_domains
確定了允許的域名,start_urls
列出了爬蟲的起始頁面。 - parse 方法:通過
Selector
解析頁面,使用 XPath 提取電影的詳細(xì)信息并存儲到DoubanprojectItem
對象中。 - 分頁處理:通過檢查是否有下一頁鏈接,使用
Request
對象進(jìn)行遞歸抓取,直到所有頁面的數(shù)據(jù)都被抓取。
3. 編寫 pipelines.py
在 Scrapy 中,pipelines.py
文件用于處理爬取到的數(shù)據(jù)。這里,我們要將抓取到的豆瓣電影數(shù)據(jù)保存到 Excel 文件中。為了實現(xiàn)這一點,我們會使用 Python 的 openpyxl
庫,它是一個專門用于處理 Excel 文件的庫。
3.1 安裝 openpyxl
首先,確保你已經(jīng)安裝了 openpyxl
,如果沒有安裝,可以通過 pip
進(jìn)行安裝:
pip install openpyxl
3.2 創(chuàng)建 DoubanprojectPipeline
類
DoubanprojectPipeline
類將處理從爬蟲傳遞過來的數(shù)據(jù),并將這些數(shù)據(jù)寫入 Excel 文件。Scrapy
中的 Pipeline
類通常有三個方法:open_spider
、process_item
和 close_spider
。
open_spider
:當(dāng)爬蟲啟動時調(diào)用,一般用于初始化一些資源。process_item
:每當(dāng)爬蟲抓取到一個數(shù)據(jù)項(item)時,都會調(diào)用此方法來處理該項數(shù)據(jù)。close_spider
:當(dāng)爬蟲結(jié)束時調(diào)用,用于保存文件或釋放資源。
以下是詳細(xì)的代碼解釋:
import openpyxl # 導(dǎo)入處理 Excel 文件的庫
from .items import DoubanprojectItem # 導(dǎo)入定義好的 Item 數(shù)據(jù)結(jié)構(gòu)class DoubanprojectPipeline:def __init__(self):"""初始化方法,在爬蟲開始時被調(diào)用,初始化 Excel 工作簿和表格。"""self.wb = openpyxl.Workbook() # 創(chuàng)建一個新的 Excel 工作簿self.sheet = self.wb.active # 獲取工作簿的活動表格self.sheet.title = '豆瓣電影Top250' # 設(shè)置表格的標(biāo)題# 在第一行寫入表頭,表示每列的意義self.sheet.append(('電影排名', '電影名稱', '電影簡介', '電影海報', '電影評分', '觀影人數(shù)'))def open_spider(self, spider):"""當(dāng)爬蟲被啟動時調(diào)用該方法。:param spider: 當(dāng)前運行的爬蟲對象"""print('開始爬蟲...') # 可以選擇在控制臺輸出提示信息,表示爬蟲開始運行def process_item(self, item: DoubanprojectItem, spider):"""處理每個爬取到的數(shù)據(jù)項(item),將其保存到 Excel 文件中。:param item: 爬取到的電影數(shù)據(jù):param spider: 當(dāng)前運行的爬蟲對象:return: 返回處理后的 item"""# 將每部電影的信息以一行的形式寫入 Excelself.sheet.append((item['rank'], # 電影排名item['movie_name'], # 電影名稱item['movie_introduction'], # 電影簡介item['picture'], # 電影海報鏈接item['movie_rating'], # 電影評分item['evaluators'] # 觀影人數(shù)))# 返回 item 是 Scrapy Pipeline 的標(biāo)準(zhǔn)流程,方便后續(xù)可能有其他 pipeline 處理return itemdef close_spider(self, spider):"""當(dāng)爬蟲關(guān)閉時調(diào)用,保存 Excel 文件。:param spider: 當(dāng)前運行的爬蟲對象"""print("爬蟲結(jié)束....") # 輸出爬蟲結(jié)束的提示# 保存 Excel 文件到指定路徑self.wb.save('豆瓣電影數(shù)據(jù).xlsx')
3.3 詳細(xì)解釋代碼
-
__init__ 方法
:- 該方法在爬蟲啟動時初始化,創(chuàng)建一個 Excel 工作簿 (
self.wb
),并獲取活動表 (self.sheet
)。 - 使用
self.sheet.title
為表格設(shè)置一個標(biāo)題,在這里我們將其命名為 “豆瓣電影Top250”。 - 使用
self.sheet.append()
將表頭寫入 Excel 文件,表頭包括 “電影排名”、“電影名稱”、“電影簡介”、“電影海報”、“電影評分” 和 “觀影人數(shù)”。
- 該方法在爬蟲啟動時初始化,創(chuàng)建一個 Excel 工作簿 (
-
open_spider 方法
:- 在爬蟲啟動時執(zhí)行,可以在這里做一些初始化操作,比如在控制臺輸出一個提示信息“開始爬蟲…”。
-
process_item 方法
:- 每次爬蟲抓取到一個新的電影數(shù)據(jù)項(
item
)時,Scrapy
會自動調(diào)用此方法來處理數(shù)據(jù)。 self.sheet.append()
將數(shù)據(jù)項中的字段值(如排名、名稱、簡介等)寫入 Excel 文件中的一行。- 返回
item
是 ScrapyPipeline
的標(biāo)準(zhǔn)流程,以便數(shù)據(jù)繼續(xù)傳遞給其他可能的 pipeline。
- 每次爬蟲抓取到一個新的電影數(shù)據(jù)項(
-
close_spider 方法
:- 當(dāng)爬蟲結(jié)束時,
Scrapy
會調(diào)用此方法來進(jìn)行收尾工作。 - 這里使用
self.wb.save('豆瓣電影數(shù)據(jù).xlsx')
將數(shù)據(jù)保存到豆瓣電影數(shù)據(jù).xlsx
文件中,并在控制臺輸出“爬蟲結(jié)束…”提示。
- 當(dāng)爬蟲結(jié)束時,
3.4 設(shè)置 pipelines
為了讓 Scrapy 使用我們的 DoubanprojectPipeline
,我們需要在 settings.py
中啟用該 Pipeline。
打開 settings.py
文件,并添加以下代碼:
# 啟用我們定義的 Pipeline
ITEM_PIPELINES = {"DoubanProject.pipelines.DoubanprojectPipeline": 300,
}
300
是該 Pipeline 的優(yōu)先級,數(shù)字越小優(yōu)先級越高。這里我們設(shè)置為 300
,表示優(yōu)先處理該 Pipeline。
通過這個 pipelines.py
文件,爬取到的豆瓣電影數(shù)據(jù)將會被逐條寫入 Excel 文件。當(dāng)爬蟲結(jié)束時,完整的 Excel 文件就已經(jīng)生成好了,里面包含了所有抓取到的電影信息。
4. 配置 settings.py
為了確保爬蟲能夠順利地抓取豆瓣的電影數(shù)據(jù)并避免觸發(fā)反爬機制,我們需要對 settings.py
文件進(jìn)行配置。settings.py
文件是 Scrapy 項目的全局配置文件,所有的爬蟲行為(如請求頻率、請求頭信息、爬蟲管道等)都在這里進(jìn)行設(shè)置。下面我們詳細(xì)解釋如何配置 settings.py
。
4.1 配置 BOT_NAME
BOT_NAME
定義了 Scrapy 項目的名稱,Scrapy 會根據(jù)這個名稱來識別項目。你可以將其保持默認(rèn)或根據(jù)你的項目需求進(jìn)行修改:
BOT_NAME = "DoubanProject"
4.2 配置 SPIDER_MODULES
和 NEWSPIDER_MODULE
SPIDER_MODULES
和 NEWSPIDER_MODULE
定義了爬蟲的存放路徑和默認(rèn)新爬蟲生成位置。
-
SPIDER_MODULES
: 該配置定義了存放所有爬蟲的模塊。在這里,所有爬蟲都存放在DoubanProject.spiders
目錄下。 -
NEWSPIDER_MODULE
: 該配置定義了新生成的爬蟲的默認(rèn)存放位置。SPIDER_MODULES = [“DoubanProject.spiders”]
NEWSPIDER_MODULE = “DoubanProject.spiders”
4.3 設(shè)置 User-Agent
User-Agent
是 HTTP 請求頭中的一個重要字段,它告訴目標(biāo)服務(wù)器你的請求來自哪個瀏覽器或客戶端。很多網(wǎng)站會通過檢測 User-Agent
來區(qū)分正常用戶和爬蟲。為了避免被識別為爬蟲,我們可以將 User-Agent
字段偽裝成常見的瀏覽器。
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'
在上面的配置中,我們將 User-Agent
偽裝成了 Google Chrome 瀏覽器。這有助于提高爬蟲的隱蔽性,避免被目標(biāo)網(wǎng)站的反爬蟲機制識別和封禁。
4.4 禁用 robots.txt
規(guī)則
許多網(wǎng)站使用 robots.txt
文件來限制爬蟲訪問某些頁面。為了能夠抓取豆瓣的內(nèi)容,我們需要將 Scrapy 的 ROBOTSTXT_OBEY
設(shè)置為 False
,忽略 robots.txt
規(guī)則。
ROBOTSTXT_OBEY = False
注意:盡管我們在這里禁用了
robots.txt
,實際開發(fā)時應(yīng)盡量遵循網(wǎng)站的爬蟲規(guī)則,避免給網(wǎng)站帶來過多負(fù)擔(dān)。
4.5 設(shè)置下載延遲 DOWNLOAD_DELAY
為了避免觸發(fā)網(wǎng)站的反爬蟲機制,建議設(shè)置一個下載延遲。DOWNLOAD_DELAY
定義了每個請求之間的時間間隔,防止爬蟲請求頻率過高,給服務(wù)器帶來過大壓力。通常,1-3 秒的延遲是合理的選擇。
DOWNLOAD_DELAY = 2 # 設(shè)置每個請求之間的時間間隔為 2 秒
你還可以設(shè)置 RANDOMIZE_DOWNLOAD_DELAY
為 True
,讓每次請求之間的延遲時間隨機變化,這樣可以進(jìn)一步避免被反爬蟲機制發(fā)現(xiàn)。
RANDOMIZE_DOWNLOAD_DELAY = True
4.6 啟用 Cookies
有些網(wǎng)站會使用 Cookies 來跟蹤用戶的行為和狀態(tài)。如果不啟用 Cookies,有時會導(dǎo)致爬取數(shù)據(jù)不完整或被限制訪問。我們在這里啟用 Scrapy 的 COOKIES_ENABLED
設(shè)置:
COOKIES_ENABLED = True
這將允許爬蟲在請求過程中自動處理 Cookies。
4.7 啟用 Item Pipelines
Item Pipelines
負(fù)責(zé)處理爬蟲提取到的數(shù)據(jù),并將其保存到不同的輸出格式中。在這里,我們已經(jīng)在 pipelines.py
中編寫了一個 Pipeline 來將電影數(shù)據(jù)保存到 Excel 文件中。接下來需要在 settings.py
中啟用這個 Pipeline。
ITEM_PIPELINES = {"DoubanProject.pipelines.DoubanprojectPipeline": 300,
}
數(shù)字 300
代表優(yōu)先級,Scrapy 會根據(jù)優(yōu)先級的數(shù)字大小依次執(zhí)行不同的 Pipelines。數(shù)字越小,優(yōu)先級越高。
4.8 配置其他默認(rèn)設(shè)置
最后,確保 Scrapy 的其他設(shè)置與最新版本兼容。這里我們設(shè)置了 REQUEST_FINGERPRINTER_IMPLEMENTATION
和 TWISTED_REACTOR
,它們是 Scrapy 的內(nèi)部配置,用于確保兼容性和性能優(yōu)化。
# 設(shè)置未來兼容性
REQUEST_FINGERPRINTER_IMPLEMENTATION = "2.7"
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
FEED_EXPORT_ENCODING = "utf-8" # 確保導(dǎo)出文件的編碼為 UTF-8
修改后的 settings.py
文件完整代碼:
BOT_NAME = "DoubanProject"SPIDER_MODULES = ["DoubanProject.spiders"]
NEWSPIDER_MODULE = "DoubanProject.spiders"# 偽裝成正常的瀏覽器
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'# 不遵守 robots.txt 規(guī)則
ROBOTSTXT_OBEY = False# 啟用 Cookies
COOKIES_ENABLED = True# 配置下載延遲,避免被封禁
DOWNLOAD_DELAY = 2 # 每次請求間隔2秒
RANDOMIZE_DOWNLOAD_DELAY = True # 隨機化下載延遲# 配置默認(rèn)請求頭,模擬真實用戶
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.9','Referer': 'https://www.douban.com/',
}# 啟用下載中間件
DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
}# 啟用 Item Pipelines
ITEM_PIPELINES = {"DoubanProject.pipelines.DoubanprojectPipeline": 300,
}# 啟用 AutoThrottle 擴展,控制并發(fā)請求速度
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 5 # 初始延遲
AUTOTHROTTLE_MAX_DELAY = 60 # 最大延遲
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 # 每個服務(wù)器的并發(fā)請求數(shù)量
AUTOTHROTTLE_DEBUG = False # 禁用調(diào)試信息顯示# HTTP緩存設(shè)置(可選)
HTTPCACHE_ENABLED = False# 設(shè)置未來兼容性
REQUEST_FINGERPRINTER_IMPLEMENTATION = "2.7"
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
FEED_EXPORT_ENCODING = "utf-8"
終端運行爬蟲 douban
:
scrapy crawl douban
運行后,爬蟲將抓取豆瓣電影 Top 250 的數(shù)據(jù)并保存到 豆瓣電影數(shù)據(jù).xlsx
文件中。
導(dǎo)入 MySQL 數(shù)據(jù)庫
在本節(jié)中,我們將介紹如何將抓取的豆瓣電影數(shù)據(jù)保存到 MySQL 數(shù)據(jù)庫中。Scrapy 提供了靈活的管道機制,可以將抓取的數(shù)據(jù)導(dǎo)入到多種存儲平臺。通過下面的步驟,我們將爬取的數(shù)據(jù)存儲到 MySQL 數(shù)據(jù)庫中。
1. 在 MySQL 中創(chuàng)建數(shù)據(jù)庫
首先,確保你已經(jīng)安裝并啟動了 MySQL 數(shù)據(jù)庫。在 MySQL 中,我們需要創(chuàng)建一個數(shù)據(jù)庫和對應(yīng)的數(shù)據(jù)表來存儲抓取到的電影信息。
創(chuàng)建數(shù)據(jù)庫:
-- MySQL 8.0 及以上版本
create database douban_movie;-- 如果你使用的是 MySQL 8.0 以下版本,請使用以下命令指定編碼為 utf8mb4
create database douban_movie default charset=utf8mb4;
切換到你創(chuàng)建的數(shù)據(jù)庫:
use douban_movie;
2. 在數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表
在剛剛創(chuàng)建的 douban_movie
數(shù)據(jù)庫中,我們需要創(chuàng)建一個表 movie_data
來存儲爬取到的電影信息。表結(jié)構(gòu)如下:
CREATE TABLE movie_data(rank varchar(20), -- 電影排名movie_name varchar(30), -- 電影名稱movie_introduction varchar(100), -- 電影簡介picture varchar(100), -- 電影海報鏈接movie_rating varchar(100), -- 電影評分evaluators varchar(100) -- 評價人數(shù)
) character set=utf8;
3. 修改 pipelines.py
,將數(shù)據(jù)保存到 MySQL
接下來,我們需要在 pipelines.py
文件中編寫代碼,將爬取到的數(shù)據(jù)保存到 MySQL 數(shù)據(jù)庫中。我們會使用 pymysql
庫來操作 MySQL。
安裝 pymysql
:
pip install pymysql
然后,在 pipelines.py
文件中添加如下代碼:
import pymysql
from .items import DoubanprojectItem # 導(dǎo)入定義好的 item 數(shù)據(jù)結(jié)構(gòu)class MysqlPipeline:def __init__(self, host, database, user, password, port):"""初始化 MySQL 數(shù)據(jù)庫連接配置"""self.host = hostself.database = databaseself.user = userself.password = passwordself.port = port@classmethoddef from_crawler(cls, crawler):"""從 Scrapy 項目的 settings.py 文件中讀取 MySQL 的連接信息"""return cls(host=crawler.settings.get('MYSQL_HOST'),database=crawler.settings.get('MYSQL_DATABASE'),user=crawler.settings.get('MYSQL_USER'),password=crawler.settings.get('MYSQL_PASSWORD'),port=crawler.settings.get('MYSQL_PORT'))def open_spider(self, spider):"""爬蟲啟動時打開數(shù)據(jù)庫連接"""print('打開數(shù)據(jù)庫連接....')self.db = pymysql.connect(host=self.host, user=self.user, password=self.password, database=self.database,port=self.port, charset='utf8')self.cursor = self.db.cursor()def close_spider(self, spider):"""爬蟲結(jié)束時關(guān)閉數(shù)據(jù)庫連接"""print('關(guān)閉數(shù)據(jù)庫連接...')self.db.close()def process_item(self, item, spider):"""將爬取到的 item 存儲到 MySQL 數(shù)據(jù)庫"""data = dict(item)keys = ', '.join(data.keys()) # 獲取字段名values = ', '.join(['%s'] * len(data)) # 構(gòu)建 SQL 中的值部分sql = "insert into movie_data (%s) values (%s)" % (keys, values)self.cursor.execute(sql, tuple(data.values())) # 執(zhí)行 SQL 插入語句self.db.commit() # 提交事務(wù)return item # 繼續(xù)傳遞給下一個 pipeline(如果有的話)
4. 配置 settings.py
文件
為了讓 Scrapy 能夠?qū)?shù)據(jù)寫入 MySQL,我們需要在 settings.py
文件中進(jìn)行一些配置。首先,啟用 MysqlPipeline
,然后配置 MySQL 數(shù)據(jù)庫的連接信息。
在 settings.py
中添加如下內(nèi)容:
# 啟用 MysqlPipeline 管道,將數(shù)據(jù)存入 MySQL
ITEM_PIPELINES = {"DoubanProject.pipelines.MysqlPipeline": 301,
}# 配置 MySQL 數(shù)據(jù)庫的連接信息
MYSQL_HOST = 'localhost' # MySQL 服務(wù)器的地址
MYSQL_DATABASE = 'douban_movie' # 使用的數(shù)據(jù)庫名
MYSQL_PORT = 3306 # MySQL 端口號,默認(rèn)是3306
MYSQL_USER = 'root' # 你的 MySQL 用戶名
MYSQL_PASSWORD = 'your password' # 你的 MySQL 密碼
5. 運行爬蟲并將數(shù)據(jù)導(dǎo)入 MySQL
現(xiàn)在你可以通過以下命令運行爬蟲:
scrapy crawl douban
等待爬蟲運行完畢后,打開你的 MySQL 數(shù)據(jù)庫,使用以下 SQL 查詢命令查看爬取到的數(shù)據(jù):
SELECT * FROM movie_data;
你也可以使用 MySQL Workbench 或 Navicat 等圖形化工具查看數(shù)據(jù)。
終端運行爬蟲 douban
在所有的代碼編寫和配置完成后,我們就可以運行爬蟲來抓取數(shù)據(jù)并保存到 Excel 文件和 MySQL 數(shù)據(jù)庫中。以下是運行爬蟲的步驟:
1. 進(jìn)入項目目錄
首先,確保你的終端已經(jīng)定位到項目的根目錄,也就是包含 scrapy.cfg
文件的目錄??梢酝ㄟ^命令行進(jìn)入項目根目錄:
cd path/to/your/DoubanProject
將 path/to/your/DoubanProject
替換為你實際的項目路徑。
2. 運行爬蟲
在項目目錄下,通過以下命令啟動爬蟲:
scrapy crawl douban
此時,爬蟲將開始訪問豆瓣電影的 Top 250 頁面,逐頁抓取電影信息。抓取到的數(shù)據(jù)將被同時保存到 Excel 文件 (豆瓣電影數(shù)據(jù).xlsx
) 中,以及 MySQL 數(shù)據(jù)庫(如果配置了 MySQL 管道)。
3. 查看生成的 Excel 文件
在爬蟲運行完成后,Excel 文件將會保存在項目目錄下,文件名為 豆瓣電影數(shù)據(jù).xlsx
。
你可以使用 WPS Office、Microsoft Excel 或任何支持 Excel 文件的軟件來打開這個文件。
- 使用 WPS 打開 Excel 文件:
- 在文件資源管理器中,找到
豆瓣電影數(shù)據(jù).xlsx
文件。 - 右鍵單擊文件,選擇 “打開方式”,然后選擇 WPS 表格。
- 你將看到抓取的豆瓣電影排名、名稱、簡介、評分、觀影人數(shù)等數(shù)據(jù)都已經(jīng)填充在表格中。
- 在文件資源管理器中,找到
Excel 文件的內(nèi)容應(yīng)該類似如下:
電影排名
電影名稱
電影簡介
電影海報
電影評分
觀影人數(shù)
1
肖申克的救贖
自由萬歲!
圖片鏈接
9.7
5000000+
2
霸王別姬
風(fēng)華絕代
圖片鏈接
9.6
4000000+
…
…
…
…
…
…
4. 檢查數(shù)據(jù)庫中的數(shù)據(jù)
如果你配置了 MySQL 管道,數(shù)據(jù)也會被存入 MySQL 數(shù)據(jù)庫。你可以通過以下命令在 MySQL 中檢查數(shù)據(jù):
USE douban_movie;
SELECT * FROM movie_data;
此時,終端將展示爬蟲保存到數(shù)據(jù)庫中的數(shù)據(jù)內(nèi)容。
5. 爬蟲運行提示信息
當(dāng)你在終端運行爬蟲時,你還會在終端中看到相關(guān)的運行日志,這些日志會提示爬蟲的當(dāng)前狀態(tài),比如:
- 正在抓取的頁面 URL。
- 每一頁抓取的數(shù)量。
- 數(shù)據(jù)是否成功保存。
- 爬蟲完成時的提示信息。
注意:使用爬蟲工具時,請務(wù)必遵守目標(biāo)網(wǎng)站的 robots.txt
文件以及相關(guān)法律法規(guī),避免對網(wǎng)站造成過度負(fù)載。