Scrapy安裝,詳細指令參數講解及實戰案例
手動反爬蟲:原博地址
知識梳理不易,請尊重勞動成果,文章僅發佈在CSDN網站上,在其他網站看到該博文均屬於未經作者授權的惡意爬取信息
如若轉載,請標明出處,謝謝!
1. Scrapy安裝
1.1 安裝模塊
安裝的過程,會和自己python版本有關係,建議使用python3.7.3/3.7.4(自己使用的3.7.4這個版本),直接通過下面的指令在命令行中安裝成功了,並沒有出現報錯信息
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy
1.2 安裝驗證
安裝完成後,可以在python中導入檢測一下,執行代碼如下,如果沒有報錯則證明安裝成功
2. Scrapy指令
2.1 如何查詢指令
Scrapy框架是通過命令行來執行了,要想了解Scrapy相關的指令可以打開命令行,然後輸入scrapy -h
進行指令查詢(注意要退出之前用來驗證安裝成功的python環境,直接在系統默認路徑下輸入),如下,其中Scrapy指令又分爲全局指令和項目指令
2.2 全局指令
通過scrapy -h
查詢到的命令,也就是上圖的Available commands下面的幾個指令均屬於全局指令(在創建的項目外也可以使用的指令)
2.2.1 fetch指令
用於爬取網頁,不依賴於項目,也就是不用創建一個項目,就可以直接爬取網頁,並且可以顯示爬取的過程,就類似我們正常寫的爬蟲
-h
就是查看幫助的意思,那麼也同樣可以使用它查看fetch的使用方式(但注意基本的格式是scrapy fetch -h
,對應上圖的倒數二三行的內容),如下
注意Usage下面核心的三行提示,介紹了fetch指令的使用,還有一個常用的參數,就是--nolog
,不顯示日誌信息,其餘的options和global options都是可選的參數
比如使用fetch指令爬取百度首頁,運行如下,下面帶有時間和之後的輸出都是屬於爬取過程中的日誌信息
在日誌信息最下面會出現請求爬取的網頁信息,如下
那麼就有一個問題,這麼長長的爬取日誌的信息,不想讓它顯示出來,就可以設置前面提到的--nolog
參數,這裏有個方便之處,不需要重新輸入剛剛的指令,只需要在命令行按一下“up”鍵(就是上下左右的上鍵)就可以出現剛剛輸入的指令,然後在後面輸入--nolog
即可
如果是爬取笑話大全,是會有問題的,需要設置具體的爬取參數纔可以進行網頁信息的獲取
綜上:可以看出直接通過fetch是可以查看一個網頁的狀態以及返回的結果,但是要實現url網頁中提取內容,就需要下面有關的指令了
2.2.2 shell指令
描述爲: Interactive scraping console(交互式的爬取過程控制檯),主要是調試和開發時候使用,這裏還是以爬取百度網頁爲例
比如查看返回內容,在交互式的環境下直接輸入response.text
就可以獲得請求的網頁的信息
那麼就可以直接進行數據的獲取了,如下。
2.2.3 runspider指令
其對應的描述就是Run a self-contained spider (without creating a project),翻譯過來就是:可以獨立的運行一個爬蟲的文件,而不需要創建一個項目(項目中可以包含一個或者多個爬蟲文件)
具體操作:首先是要創建一個py文件,比如創建在桌面,命名爲demo.py,然後書寫代碼如下(這裏可以先按照下面的敲,至於爲什麼,之後介紹項目的時候就自然明白了)
from scrapy.spiders import Spider #需要導入這個爬蟲基類
class DemoSpider(Spider): #繼承基類
name = 'Demo' #定一個名稱
allowed_domains = ['baidu.com'] #這裏寫域名
start_urls = ['http://www.baidu.com'] #這裏寫網址
def parse(self,response): #定義處理函數
print('測試......')
print('成功運行單個文件')
print('恭喜!!!')
代碼寫完之後保存,然後在命令行中執行如下。注意:這裏易錯的地方在於沒有把路徑指引到py文件所在的路徑下,因此會導致運行出錯(比如這裏創建的demo.py文件是在桌面的,運行的時候就需要把路徑指引到桌面,再運行指令)
2.2.4 version和view指令
version指令:就是參看當前scrapy的版本信息,如下
view指令:使用Scrapy獲取URL下載頁面並在瀏覽器中顯示其內容,比如輸入如下指令系統會調用默認瀏覽器,然後打開目標網址(這裏還是以百度爲例)
2.2.5 startproject指令
用來創建爬蟲項目的,如何使用也可以通過-h
來查詢,先介紹一下scrapy的工作基本流程總共有五部分組成的,具體的流程可看圖示
1) 項目包含
引擎、調度器、下載器、蜘蛛和項目管道
2)爬取流程
針對於每個URL,
Scheduler -> Downloader -> Spider ->
① 如果返回的是新的URL,就會返回Scheduler
② 如果是需要保存的數據,則會被放到item pipeline裏面
接下來就進行實際操作
3) 操作實例
① 首先進入要存放代碼的目錄(命令行窗口下)
② 然後輸入scrapy startproject tutorial
③ 查看目錄結構
在指定目錄下創建了一個文件夾(比如自己的桌面路徑C:\Users\86177\demo),查看一下文件目錄的結構,可以看到該文件夾下一共兩個文件(一個是tutorial文件夾,一個是scrapy.cfg配置文件),該文件夾的具體文件如下
scrapy.cfg配置文件是將我們的項目發佈到網上去時要進行的設置內容,一般情況下是使用不到的,我們大多情況下接觸到的還是tutorial下的文件
spiders文件夾是剛剛命令行窗口下的第二個選項對應的文件存儲路徑,也就是在運行’scrapy genspider example examplam.com’時,會在spiders文件夾裏面創建一個爬蟲模板
–init–.py文件是一個聲明文件,說明當前創建的這個文件夾是一個包(關於Python的包、庫、模塊,這裏不進行介紹,可自行了解)
items.py文件是要存儲要爬取的東西
middlewares.py文件是在下載完東西后需要通過的一個過程(中轉站)
pipelines.py文件就是items下載完畢之後的通道
settings.py文件使用來寫scrapy項目的配置
2.2.6 genspider指令
其描述爲: Generate new spider using pre-defined templates (使用預定義的模板來進行爬蟲),也就是需要通過項目指令來指定具體的可用模板,後面結合這項目指令進行講解,這裏就不加贅述了
2.3 項目指令
去除掉以上介紹的指令,還有兩個指令(bench和settings),放在項目指令中講解。以剛剛創建的tutorial項目爲例,進入項目文件路徑後,再次調用scrapy -h指令,可以看到項目指令如下
其中多了check、crawl、edit、list、parse五個項目指令,再配合剛剛的兩個指令,下面詳細講解這7個指令
2.3.1 bench指令
bench指令可以測試本地計算機硬件的性能,在使用scrapy bench
指令後,系統就會創建一個本地的服務器,並且會以最大的速度進行爬取,不進行網頁具體的爬取,只是進行網頁的跟進,測試的速度是每分鐘可以爬取多少網頁
比如自己的計算機,最大的爬取速度爲每分鐘5160頁,由此可以查看一下自己計算機爬取的網頁的速度,每分鐘可以爬取的頁數越多,計算機的性能也就越優異
2.3.2 爬蟲模板
爬蟲項目文件創建之後,會發現在spiders文件夾中除了一個初始化執行文件以外並沒有其他的文件了,因此需要創建爬蟲的文件,也就要使用到genspider指令,首先查看一下可用的模板信息,如下
查看爬蟲模板的指令:scrapy genspider -l
(l就是list的意思)
第一個basic就是最基本的爬蟲模板,第二個crawl是自動化爬蟲模板,第三和第四是針對csv和xml文件
1) basic模板
執行代碼如下,其中quotes是爬蟲模板的文件名,後面的quotes.toscrape.com是網址的域名不是網址(關於網址和域名的關係)
這時候在spiders文件夾下就多了一個quotes.py文件,如下
打開文件後,就會有中熟悉的感覺,是不是和之前運行單個爬蟲文件幾乎一致,就是類的名稱不同
2) crawl自動化模板
就是在創建的時候,將-t後面的basic修改爲crawl即可,然後打開創建的爬蟲文件,如下(多了自動化爬取的規則)
3) csvfeed模板
將對應指令修改爲csvfeed,生成的爬蟲模板文件爲
4) xmlfeed自動化模板
和上面的操作類似,生成的模板文件如下
2.3.3 check指令
用來檢測爬蟲文件是否能正常運行,後面輸入要測試的爬蟲文件的名稱即可(去掉.py)
比如拿剛剛創建的四個模板舉例,其中第四個爬蟲模板文件,有意的把第一行導入模塊的代碼刪除,可以發現最後程序檢測失敗,並給出報錯的詳細信息
2.3.4 list指令
顯示當前項目中可執行的爬蟲模板文件(可執行表示存在,但是不保證能正常運行),如下
2.3.5 crawl指令
和runspider指令的功能一樣,也是運行代碼文件,但是這裏執行的是項目中的爬蟲模板文件。具體的操作如下
爲了可視化輸出,來驗證程序可以正常運行,這裏直接在parse函數下面添加輸出語句即可(四個模板裏面都寫),最後的輸出結果如下
由結果可知,在沒有進行任何爬取信息的設置下,只進行單純的print的語句輸出,可以正常運行出結果的文件是quotes.py,而其對應的模板爲basic,所以最基本的模板保證了爬蟲文件的可執行性,而其他的三個模板都需要進行相關參數的設置纔可以進行最終數據的輸出
2.3.6 edit指令
該指令是在linux系統下可運行,功能是打開某個爬蟲文件,然後使用編輯器進行編輯,在windows系統中是無法運行的,功能說明和執行代碼結果如下
2.3.7 parse指令
使用該指令可以指定一個爬蟲文件進行某個網址的爬取,一般就是這個爬蟲文件的網址,如下
具體其他的參數可以通過scrapy parse -h
參看,如下
2.3.8 settings指令
用於查看設置的相關參數,可以打開項目的settings.py文件,獲取其中的值對應的數據,沒有註釋的都可以獲取,註釋的內容有部分獲取爲None(即便是取消註釋了)
其他的參數使用可以通過scrapy settings -h
指令查詢,如下
3. 爬取quotes網站
名言網站,界面如下
3.1 創建一個spider爬蟲模板
在項目根目錄運行如下代碼,這裏就是創建最簡單的basic,不輸入的話就是默認
scrapy genspider quotes quotes.toscrape.com
回車確定後輸出如下內容
這時候就會在spider文件夾裏自動生成如下文件
其中name 就對應命令行窗口創建時候網站前面的那個單詞的名稱,start_urls裏面就是要爬取的網站(網址),allowed_domains要求是在主域名下進行爬取信息
3.2 對創建的文件進行操作
比如這裏對前兩頁的信息進行爬取
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/']
def parse(self, response):
page = response.url.split("/")[-2]
file_name = "quote-{}.html".format(page)
with open(file_name, "wb") as f:
f.write(response.body)
self.log("Saved file {}".format(file_name))
3.3 開始運行Scrapy
一定是要在根目錄下面輸入如下代碼(在上面的示例中就是tutorials/),否則系統就會報錯
scrapy crawl quotes
試着運行一下,運行之前記得保存一下qutoes.py文件,也就是剛剛編輯代碼的那個窗口文件(如果有錯誤一般會在中間進行提示,會有各種Error提醒),沒有錯誤時就順利完成創建
這時候本地就會多出來兩個文件夾,裏面就包含了我們要爬取網站的源代碼(也就是在start_urls包含的網址),如下
其中的quote-1.html的開頭源代碼如下
3.4 代碼分析
列表倒數元素的獲取方法
page = response.url.split("/")[-2]
列表中的負數表示倒數,比如下面的列子
s = 'hello world!'
print(s[-2])
–> 輸出結果爲:d
所以對於有規律的網站(網址)要提取裏面的信息就很簡單
s = 'http://quotes.toscrape.com/page/1/'
print(s.split('/')[-2])
–> 輸出結果爲:1
因此可以使用這種方式獲取頁碼page
3.5 Python中的文件存儲
with open(file_name, "wb") as f:
f.write(response.body)
使用的方式就如下:
with open(文件名, "wb") as f:
f.write(文件內容)
舉個栗子:
with open('hello.txt', "w") as f:
f.write('hello world!')
–> 輸出結果爲:
或者使用如下:注意和上面的區別
with open('hello.txt', "wb") as f:
f.write('hello world!'.encode())
–> 輸出結果爲:和上方的輸出是一樣的
注意事項: 不同的spider的name不能相同(容易理解,因爲創建的時候會在spider文件夾裏創建文件,一山不容二虎),裏面的函數名稱不能自己隨意命名
3.6 提取數據方法
打開cmd窗口,切換到下載文件的目錄裏面(這裏推薦使用powershell,在目標文件所在目錄空白位置同時按住shift和鼠標右鍵就可以打開,這樣不用再切換路徑了,powershell和cmd的區別),輸入
scrapy shell 'http://quotes.toscrape.com/page/2/'
就會進入交互模式,如下
比如我們想獲取網頁裏面的title,就可以使用CSS選擇器,通過response.css(‘title’),進行輸出,如果要輸出標籤信息的話,後哦面還需要加上.extract()方法,返回的是一個列表
獲取標籤裏面的內容,注意不是和原來一樣將.text放在最後面,而是在中間了
Scrapy也支持xpath進行文本提取(關於xpath會在爬蟲專項裏面進行講解),代碼執行結果如下
3.7 分析網頁,明確目標
打來目標頁面,進行檢查,找到對應的標籤信息
3.8 實戰解析
這時候已經確定標籤對應目標信息的位置,接下來打開quotes.py文件,進行代碼編寫
首先 獲取該頁面的全部的正文內容(就是quote,裏面的名言)
quotes = response.css(".quote")
–> 輸出結果,可以看出一個頁面是有10條數據,如下
其次 再獲取每一個正文裏面的文本內容、作者和對應的標籤
for quote in quotes:
title = quote.css('.text::text').extract()[0]
author = quote.css('.author::text').extract()[0]
tags = quote.css('.tag::text').extract()
print('title:\n',title)
print('author:\n',author)
print('tags:\n',tags)
然後 保存文件,quotes.py文件裏面最終的代碼如下
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/']
def parse(self, response):
quotes = response.css(".quote")
for quote in quotes:
title = quote.css('.text::text').extract()[0]
author = quote.css('.author::text').extract()[0]
tags = quote.css('.tag::text').extract()
print('title:\n',title)
print('author:\n',author)
print('tags:\n',tags)
最後 打開命令行窗口(powershell或者cmd),在根目錄下也就時tutarial文件夾路徑,運行scrapy項目,輸入之前的命令代碼,如下
scrapy crawl quotes
在命令行下面輸入指令
–> 輸出結果:(在全部輸出內容的中間部分,和報錯產生的位置是一樣的)
最後的最後 把獲取的數據存儲到本地
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/']
def parse(self, response):
page = response.url.split("/")[-2]
file_name = "quotes-{}.txt".format(page)
with open(file_name,'w') as f:
quotes = response.css(".quote")
for quote in quotes:
title = quote.css('.text::text').extract()[0]
author = quote.css('.author::text').extract()[0]
tags = quote.css('.tag::text').extract()
print('title:\n',title)
print('author:\n',author)
print('tags:\n',tags)
f.write('title:{}\n author:{}\n tags:{}\n'.format(title,author,tags))
保存一下,然後在命令行窗口下運行指令scrapy crawl quotes,最後在根目錄下會生成兩個.txt文件,如下
quote1.txt裏面的內容就對應着網站第一頁的內容,如下
至此,第一個Scrapy項目完結了