Scrapy框架
Scrapy 是一個開源和協作的框架,其最初是為了頁面抓取 (更確切來說, 網絡抓取 )所設計的,使用它可以以快速、簡單、可擴展的方式從網站中提取所需的數據。但目前Scrapy的用途十分廣泛,可用於如數據挖掘、監測和自動化測試等領域,也可以應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。
Scrapy 是基於twisted框架開發而來,所以要使用 Scrapy 首先得安裝 twisted 。twisted 是一個流行的事件驅動的python網絡框架。因此 Scrapy 使用了一種非阻塞(又名異步)的代碼來實現並發。Scrapy 的官網地址為:https://docs.scrapy.org/en/latest/topics/architecture.html
根據官網,我們知道 Scrapy 整體架構大致由7部分組成:
- 引擎(EGINE):引擎負責控制系統所有組件之間的數據流,並在某些動作發生時觸發事件。有關詳細信息,之后會在數據流部分提到。
- 調度器(SCHEDULER):用來接受引擎發過來的請求, 壓入隊列中, 並在引擎再次請求的時候返回. 可以想像成一個URL的優先級隊列, 由它來決定下一個要抓取的網址是什么, 同時去除重復的網址。
- 爬蟲(SPIDERS):SPIDERS是開發人員自定義的類,用來解析responses,並且提取items,或者發送新的請求。
- 下載器(DOWLOADER):用於下載網頁內容, 並將網頁內容返回給EGINE,下載器是建立在twisted這個高效的異步模型上的。
- 項目管道(ITEM PIPLINES):在items被提取后負責處理它們,主要包括清理、驗證、持久化(比如存到數據庫)等操作。
- 下載器中間件(Downloader Middlewares):位於Scrapy引擎和下載器之間,主要用來處理從EGINE傳到DOWLOADER的請求request,已經從DOWNLOADER傳到EGINE的響應response,你可用該中間件做以下幾件事:
- 在將請求發送到下載器之前處理請求(即在Scrapy將請求發送到網站之前)。
- 在傳遞給蜘蛛之前改變接收到的響應;
- 發送新的請求,而不是將接收到的響應傳遞給蜘蛛;
- 向蜘蛛傳遞響應而不需要獲取網頁;
- 去除某些請求
- 爬蟲中間件(Spider Middlewares):位於EGINE和SPIDERS之間,主要工作是處理SPIDERS的輸入(即responses)和輸出(即requests)。
- 引擎(Engine)獲取最初的請求由爬蟲(Spider)抓取。
- 引擎(Engine)在調度程序(Scheduler)中調度請求,並要求抓取下一個請求。
- 調度程序(Scheduler)將下一個請求返回給引擎(Engine)。
- 引擎(Engine)將請求通過下載器中間件( Downloader Middlewares )發送到下載器( Downloader)(詳情請參閱process_request())。
- 一旦頁面完成下載,下載器( Downloader)會生成一個響應(使用該頁面)並通過下載器中間件( Downloader Middlewares )將其發送到引擎(Engine)。(詳情請參閱process_response())。
- 引擎(Engine)從下載器( Downloader)接收到響應后通過爬蟲中間件( Spider Middlewares )將其發送給爬蟲(Spider)進行處理。(詳情請參閱process_spider_input())。
- 爬蟲(Spider)處理響應,並通過爬蟲中間件( Spider Middlewares )將抓取的項目和新請求(后續)返回給引擎(Engine)。(詳情請參閱process_spider_output())
- 引擎(Engine)將已處理的項目發送到項目管道(ITEM PIPLINES),然后將已處理的請求發送到調度程序(Scheduler),然后詢問是否有下一個請求需要進行爬網。
- 若有請求則重復以上步驟,直到沒有更多的調度請求。
Scrapy 安裝
windows安裝:
1、pip3 install wheel #安裝后,便支持通過wheel文件安裝軟件,wheel文件官網:https://www.lfd.uci.edu/~gohlke/pythonlibs 3、pip3 install lxml 4、pip3 install pyopenssl 5、下載並安裝pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/ 6、下載twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 7、執行pip3 install 下載目錄\Twisted-17.9.0-cp36-cp36m-win_amd64.whl #以上步驟是因為scrapy是基於twisted實現的,所以要先安裝twisted 8、pip3 install scrapy
linux安裝:
pip3 install scrapy
命令行工具
安裝完scrapy后我們最關心的就是如何創建一個新的項目,然后展開爬蟲行動。這里就需要用到命令行工具,首先我們來說創建項目。
startproject #創建項目
命令行分為全局命令(Global commands)和項目命令(Project-only commands)。全局命令指在任何位置都可以調用,而項目命令只能在項目中使用。

#1 查看幫助 scrapy -h scrapy <command> -h #2 有兩種命令:其中Project-only必須切到項目文件夾下才能執行,而Global的命令則不需要 Global commands: startproject #創建項目 genspider #創建爬蟲程序 settings #如果是在項目目錄下,則得到的是該項目的配置 runspider #運行一個獨立的python文件,不必創建項目 shell #scrapy shell url地址 在交互式調試,如選擇器規則正確與否 fetch #獨立於程單純地爬取一個頁面,可以拿到請求頭 view #下載完畢后直接彈出瀏覽器,以此可以分辨出哪些數據是ajax請求 version #scrapy version 查看scrapy的版本,scrapy version -v查看scrapy依賴庫的版本 Project-only commands: crawl #運行爬蟲,必須創建項目才行,確保配置文件中ROBOTSTXT_OBEY = False check #檢測項目中有無語法錯誤 list #列出項目中所包含的爬蟲名 edit #編輯器,一般不用 parse #scrapy parse url地址 --callback 回調函數 #以此可以驗證我們的回調函數是否正確 bench #scrapy bentch壓力測試
剛才我們用到的創建項目的命令是一條全局命令,通常我們會在指定位置創建項目,所以我們先cd 文件路徑 切到指定位置后再執行“scrapy startproject 項目名”就能創建一個爬蟲項目。
創建項目示例:
#cd 項目所在路徑 scrapy startproject AMAZON#這里以爬取亞馬遜舉例 #這時候會有一出現AMAZON的文件夾和一個scrapy.cfg文件,scrapy.cfg里面寫的是項目的部署信息,爬蟲相關的配置信息在settings.py文件中 cd AMAZON#切到項目路徑下 scrapy genspider amazon www.amazon.cn#創建一只叫amazon的蜘蛛,爬取的網頁的域名為www.amazon.cn #這時候在AMAZON文件夾下的spiders文件夾下就會多一個amazon.py文件 #amazon.py中: # -*- coding: utf-8 -*- import scrapy #繼承了scrapy.Spider類的自定義類 class AmazonSpider(scrapy.Spider): name = 'amazon'#爬蟲名字,不可改 allowed_domains = ['www.amazon.cn']#域名 start_urls = ['http://www.amazon.cn/']#不設置url時默認爬這個網頁 def parse(self, response): #解析操作 pass """ 爬蟲是一項不違法但也容易違法的行為,有些公司會不想讓你爬,所以有一個ROBOTSTXT_OBEY協議,規定了如該公司的網站不允許你爬的話會另外開一個
專門接口放入不重要的信息用於給你爬取。在settings,py中有一條ROBOTSTXT_OBEY的配置,默認為True就是遵循該協議,我們處理爬取的數據的行為
不違法的情況下可以將其設置為False,以爬取所有數據 """
注意:Scrapy默認只能在CMD中執行爬蟲程序,若想在Pycharm中運行需在settings.py文件同級的目錄下新建entrypoint.py,里面寫入
#在項目目錄下新建:entrypoint.py from scrapy.cmdline import execute execute(['scrapy', 'crawl', 'amazon','--nolog'])#執行這條會打印默認的日志信息 # execute(['scrapy', 'crawl', 'amazon',])#執行這條為不打印日志信息

#1、執行全局命令:請確保不在某個項目的目錄下,排除受該項目配置的影響 scrapy startproject MyProject cd MyProject scrapy genspider baidu www.baidu.com scrapy settings --get XXX #如果切換到項目目錄下,看到的則是該項目的配置 scrapy runspider baidu.py scrapy shell https://www.baidu.com response response.status response.body view(response) scrapy view https://www.taobao.com #如果頁面顯示內容不全,不全的內容則是ajax請求實現的,以此快速定位問題 scrapy fetch --nolog --headers https://www.taobao.com scrapy version #scrapy的版本 scrapy version -v #依賴庫的版本 #2、執行項目命令:切到項目目錄下 scrapy crawl baidu scrapy check scrapy list scrapy parse http://quotes.toscrape.com/ --callback parse scrapy bench

import sys,os sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
項目文件的結構以及各文件的作用如下圖所示
spiders文件夾作用
spiders文件夾的內容是由程序員自定義的多個類組成,用於爬取一個或多個網址,具體包括如何執行爬取任務並且如何從頁面中提取結構化的數據。換句話說,Spiders是你為了一個特定的網址或一組網址自定義爬取和解析頁面行為的地方。
Spiders中的類封裝了發起請求的方法和回調函數的方法,回調函數可以是多個但每一個請求都必須一個綁定回調函數以處理抓取到的網頁的內容。
默認生成的“def start_requests(self):” 只執行一次默認從start_urls列表中獲得url地址來生成Request請求,默認的回調函數是parse方法。回調函數在下載完成返回response時自動觸發。
回調函數用於解析response並返回值,返回值可以使4種,通常Scrapy用自帶的Selectors解析內容,當然我們也可以使用Beutifulsoup,lxml或其他的。返回Item對象的話會通過項目管道(Item Pipeline)組件存到數據庫或以文件的形式導出。
四種返回值:
-
- 包含解析數據的字典
- Item對象
- 新的Request對象(新的Requests也需要指定一個回調函數)
- 可迭代對象(包含Items或Request)
Spiders給我們提供了5個類
scrapy.spiders.Spider #scrapy.Spider等同於scrapy.spiders.Spider,使我們用的最多的類 scrapy.spiders.CrawlSpider scrapy.spiders.XMLFeedSpider scrapy.spiders.CSVFeedSpider scrapy.spiders.SitemapSpider #可鏈式操作 from scrapy.spiders import Spider,CrawlSpider,XMLFeedSpider,CSVFeedSpider,SitemapSpider