Scrapy 是一個開源和協做的框架,其最初是爲了頁面抓取 (更確切來講, 網絡抓取 )所設計的,使用它能夠以快速、簡單、可擴展的方式從網站中提取所需的數據。但目前Scrapy的用途十分普遍,可用於如數據挖掘、監測和自動化測試等領域,也能夠應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。html
Scrapy 是基於twisted框架開發而來,因此要使用 Scrapy 首先得安裝 twisted 。twisted 是一個流行的事件驅動的python網絡框架。所以 Scrapy 使用了一種非阻塞(又名異步)的代碼來實現併發。Scrapy 的官網地址爲:https://docs.scrapy.org/en/latest/topics/architecture.htmlpython
根據官網,咱們知道 Scrapy 總體架構大體由7部分組成:linux
windows安裝:程序員
一、pip3 install wheel #安裝後,便支持經過wheel文件安裝軟件,wheel文件官網:https://www.lfd.uci.edu/~gohlke/pythonlibs 3、pip3 install lxml 4、pip3 install pyopenssl 五、下載並安裝pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/ 六、下載twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 七、執行pip3 install 下載目錄\Twisted-17.9.0-cp36-cp36m-win_amd64.whl #以上步驟是由於scrapy是基於twisted實現的,因此要先安裝twisted 八、pip3 install scrapy
linux安裝:ajax
pip3 install scrapy
安裝完scrapy後咱們最關心的就是如何建立一個新的項目,而後展開爬蟲行動。這裏就須要用到命令行工具,首先咱們來講建立項目。shell
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 項目名」就能建立一個爬蟲項目。windows
建立項目示例:瀏覽器
#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',])#執行這條爲不打印日誌信息
#一、執行全局命令:請確保不在某個項目的目錄下,排除受該項目配置的影響 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 #依賴庫的版本 #二、執行項目命令:切到項目目錄下 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中的類封裝了發起請求的方法和回調函數的方法,回調函數能夠是多個但每個請求都必須一個綁定回調函數以處理抓取到的網頁的內容。
默認生成的「def start_requests(self):」 只執行一次默認從start_urls列表中得到url地址來生成Request請求,默認的回調函數是parse方法。回調函數在下載完成返回response時自動觸發。
回調函數用於解析response並返回值,返回值可使4種,一般Scrapy用自帶的Selectors解析內容,固然咱們也可使用Beutifulsoup,lxml或其餘的。返回Item對象的話會經過項目管道(Item Pipeline)組件存到數據庫或以文件的形式導出。
四種返回值:
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