Scrapy框架安裝
操作環境介紹
作業系統: Ubuntu19.10
Python版本: Python3.7.4
編譯器: pycharm社群版
安裝scrapy框架(linux系統下)
安裝scrapy框架最繁瑣的地方在於要安裝很多的依賴包,若缺少依賴包,則scrapy框架的安裝就會報錯。
不過anaconda環境中會自帶lxml模組,可以免去一些步驟
在終端輸入命令安裝依賴包
sudo apt-get install python-dev
sudo apt-get install libevent-dev
根據提示輸入y確認安裝,耐心等待安裝完成即可
安裝完所需要的依賴包之後,就可以直接用pip安裝scrapy框架了
pip install scrapy
在終端輸入命令後,可能會出現網路響應超時等報錯
經過幾次的嘗試之後,我認為這是軟體源的問題導致下載過慢,建議更換清華的映象源來安裝
pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
在命令的末尾加上-i來暫時使用指定的映象源來安裝scrapy框架
在排除其他問題的影響後,若安裝速度依舊不理想,可多嘗試幾個源來安裝
阿里雲 http://mirrors.aliyun.com/pypi/simple/
中國科技大學 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清華大學 https://pypi.tuna.tsinghua.edu.cn/simple/
中國科學技術大學 http://pypi.mirrors.ustc.edu.cn/simple/
ok,我們可以看到更換源之後的下載速度有了顯著的提升,只需要等待幾秒鐘就可以看到安裝成功的標誌
檢測安裝是否成功
開啟終端,輸入命令檢視scrapy版本
scrapy --version
看到類似下圖所示的版本資訊:
再輸入命令
scrapy bench
這條命令是呼叫scrapy去爬取一個空網址的內容,再輸入命令之後,看到scrapy正在執行去爬取空網址的內容即安裝成功了這個框架
Scrapy框架爬取原理
Scrapy框架的主體結構分為五個部分:
Scrapy Engine(引擎): 負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,訊號、資料傳遞等。
Scheduler(排程器): 它負責接受引擎傳送過來的Request請求,並按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。
Downloader(下載器): 負責下載Scrapy Engine(引擎)傳送的所有Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理。
Spider(爬蟲): 它負責處理所有Responses,從中分析提取資料,獲取Item欄位需要的資料,並將需要跟進的URL提交給引擎,再次進入Scheduler(排程器)。
Item Pipeline(管道): 它負責處理Spider中獲取到的Item,並進行進行後期處理(詳細分析、過濾、儲存等)的地方。
它還有兩個可以自定義下載功能的中介軟體:
Downloader Middlewares(下載中介軟體): 一個可以自定義擴充套件下載功能的元件。
Spider Middlewares(Spider中介軟體): 一個可以自定擴充套件和操作引擎和Spider中間通訊的功能元件。
Scrapy框架執行方式
由上圖可以看出,引擎就相當於框架中的大腦,調配著其他部分的運作。
首先爬蟲檔案向引擎傳送網址請求,在經由引擎將網址傳送給排程器,排程器通過內部的函式將發來的網址進行佇列操作,將排好隊的網址重新傳送回引擎。引擎接收到了傳送回來的佇列之後,便將請求交給下載器,由下載器從外部網頁獲取網頁原始碼,將獲取到的響應資料再傳送回引擎。引擎接收到下載器發回的網頁原始碼之後,再將資料傳回爬蟲檔案,由爬蟲檔案負責對html資料的提取,等到資料提取完畢,再把資料傳送給引擎。引擎對爬蟲檔案傳送來的內容進行檢測,若判斷傳過來的內容為資料,則引擎將資料傳送給專門儲存檔案的管道資料,管道檔案接收到發來的資料之後,就可以有選擇的儲存在資料庫或檔案中。
至此,一次完整的爬蟲專案執行完成。
Scrapy框架例項
使用Scrapy爬取阿里文學
使用scrapy框架爬取的一般步驟
1.建立爬蟲專案
2.建立爬蟲檔案
3.編寫爬蟲檔案
4.編寫items
5.編寫pipelines
6.配置settings
7.執行scrapy框架
注:上面的步驟是使用scrapy的一般步驟,實際操作時可以根據爬取頁面的難易度來調整這些步驟
1.建立爬蟲專案
首先找到一個資料夾,用於儲存專案的內容
開啟終端,在該目錄下輸入:
scrapy startproject [專案名稱]
成功建立
這時可以發現資料夾下多了一個以專案名稱命名的資料夾
進入資料夾,發現裡面已經有了框架的模板檔案
init.py //初始檔案
items.py //定義目標,想要爬什麼資訊
pipelines.py //爬後處理
middlewares.py //中間鍵
settings.py //檔案的設定資訊
2.建立爬蟲檔案
scrapy genspider [爬蟲名] [想要爬取網址的域名]
注意:爬蟲名一定不能與專案名一樣,否則會建立失敗
3.分析檔案,編寫爬蟲檔案
我們在上一步建立了爬蟲檔案之後會發現多出來一個py檔案在專案名目錄下
開啟aliwx.py檔案,開始分析網頁,提取想要爬取的資訊
開啟阿里文學的官網首頁,先設定我們想要爬取的內容為最近更新的書名及章節,使用xpath語法進行提取
開啟專案資料夾下的spider資料夾,再開啟我們剛剛所建立的爬蟲檔案
開啟後可以看到一個基礎的爬蟲框架,我們要根據實際的需要來修改這個框架的內容
上面有紅色箭頭的地方就是我們主要修改的地方
首先將第一個指向的地址換成我們想要爬取的地址,即阿里文學的官網首頁《https://www.aliwx.com.cn/》
第二個地方就是我們設定爬取內容的定製項
import scrapy
class AliwxSpider(scrapy.Spider):
name = 'aliwx'
allowed_domains = ['aliwx.com.cn']
start_urls = ['https://www.aliwx.com.cn/']
def parse(self, response):
#選擇所有a標籤下的內容
selectors = response.xpath("//ul[@class='list']/li[@class='tr']/a")
# 迴圈遍歷每一個a標籤,使書名和最新章節可以一對一匹配
for selector in selectors:
#提取a標籤下的書名 . 表示在當前標籤下繼續選擇
book_name = selector.xpath("./span[2]/text()").get()
#提取a標籤下的最新章節名
book_new = selector.xpath("./span[3]/text()").get()
#列印書名和章節名
print(book_name,book_new)
4.設定settings
開啟settings檔案,在檔案中找到程式碼
這一行的意思是詢問是否遵循爬蟲協議,大致來講就是協議規範了我們只能提取網站允許我們提取的內容,所以此處應該將True提換成False,否則我們很有可能提取不到想要的內容
5.執行scrapy框架
開啟終端,將目錄切換至專案資料夾下,輸入命令列來執行專案
scrapy crawl [爬蟲名]
等待專案執行完畢,即可看到爬取到的內容:
6.將爬取下來的內容儲存到檔案
如果想要將內容儲存到檔案中,就需要設定一個返回值來儲存
將print(book_name,book_new)語句替換
items = {
'name': book_name,
'new': book_new,
}
yield items
再開啟終端,輸入執行並儲存命令:
scrapy crawl aliwx -o book.csv
等待程式執行完成,就可以看到出現了一個book.csv檔案在專案目錄下,開啟就是我們所儲存的內容
到此為止一個最基本的爬蟲專案就製作完成了,如果有哪裡寫的不好請大佬多多批評指正!