python爬蟲架構之scrapy重現江湖

  • 2019 年 11 月 5 日
  • 筆記

livandata

數據EDTA創始人,沒有之一

現擔任數據EDTA個人公眾號董事長兼CEO兼財務兼創作人

口號是:讓大數據賦能每一個人。

前 言

自從上次出了兩篇爬蟲的文章後,很多人私信我說爬蟲技術還是比較系統的,如果只用上文的一些技能很難爬取大規模的網站,是否會有一些架構之類的東東,java都有spring,為什麼爬蟲就沒有,別著急,爬蟲也是有的,只是我們平時沒有深入探索,下面我們就了解一下爬蟲的常規架構——scrapy。

scrapy是一個python爬蟲架構,非常適合做一些大型爬蟲項目,並且開發者利用這個架構,可以用不關注一些細節問題,現在爬蟲的架構還是很多的,作為元老級別的scrapy依然是一個受到多方關注的技術。

scrapy的安裝是一個比較繁瑣的過程,大家可以百度一下最新的安裝手冊,此處筆者將當時用的一個安裝方式跟大家分享一下,有問題不要噴我,主要是電腦已經安裝過一次了,再搞一次怕環境卸載不幹凈,好在百度非常強大,足夠解決安裝問題:

在操作完上面的步驟後,再在 cmd 中輸入:

scrapy startproject my_crawler

一個全新的scrapy框架即可創建成功。

是不是很簡單?

此處你也可以體會python的優勢,其他語言是很難想像會有如此效率的。

了解過django的大佬們估計也會有同樣的感慨,太方便了~

我們先創建一個普通的爬蟲

創建項目的命令為:

Scrapy genspider -t basic qsbk qiushibaike.com

項目創建完成後,我們會在指定的文件夾下看到一個全新的項目:

我們該怎麼使用scrapy呢?

最直接的方式就是上代碼,下面請欣賞案例《糗事百科》的爬取:

1)test文件:

#!/usr/bin/env python  # _*_ UTF-8 _*_  # author:livan  import scrapy  from my_crawler.items import MyCrawlerItem  from scrapy.http import Request  class TestSpider(scrapy.Spider):      name = "test"      allowed_domains = ["qiushibaike.com"]      # start_urls = ['http://qiushibaike.com/']      #對 request 內容進行設置      def start_requests(self):          ua = {"User_Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64;rv:53.0) Gecko/20100101 Firefox/53.0"}          yield Request('http://www.qiushibaike.com/', headers=ua)      def parse(self, response):          it = MyCrawlerItem()          it["content"]=response.xpath("//div[@class='content']/span/text()").extract()          it["link"] = response.xpath("//a[@class='contentHerf']").extract()          yield it

2)item文件:

import scrapy  class MyCrawlerItem(scrapy.Item):      # define the fields for your item here like:      # name = scrapy.Field()      pass

3)pipeline文件:

class MyCrawlerPipeline(object):      def process_item(self, item, spider):          for i in range(0, len(item["content"])):              print(item["content"][i])              print(item["link"][i])          return item

面對這個項目,不知大家有沒有什麼啟發呢?

scrapy中存在較多的文件,這些文件之間有固定的執行順序,而且文件之間會相互調用,清晰了這一點,我們就可以看scrapy的原理了。

scrapy原理

先上一個圖吧:

這個圖是被廣為流傳的圖,成為學習scrapy的基本架構圖,我們可以做一些簡單的介紹:

(1)、調度器(Scheduler):

調度器,說白了把它假設成為一個URL(抓取網頁的網址或者說是鏈接)的優先隊列,由它來決定下一個要抓取的網址是 什麼,同時去除重複的網址(不做無用功)。用戶可以自己的需求定製調度器。

(2)、下載器(Downloader):

下載器,是所有組件中負擔最大的,它用於高速地下載網絡上的資源。Scrapy的下載器代碼不會太複雜,但效率高,主 要的原因是Scrapy下載器是建立在twisted這個高效的異步模型上的(其實整個框架都在建立在這個模型上的)。

(3)、 爬蟲(Spider):

爬蟲,是用戶最關心的部分。用戶定製自己的爬蟲,用於從特定的網頁中提取自己需要的信息,即所謂的實體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續抓取下一個頁面。

(4)、 實體管道(Item Pipeline):

實體管道,用於處理爬蟲提取的實體。主要的功能是持久化實體、驗證實體的有效性、清除不需要的信息。

(5)、Scrapy引擎(Scrapy Engine):

Scrapy引擎是整個框架的核心.它用來控制調試器、下載器、爬蟲。實際上,引擎相當於計算機的CPU,它控制着整個流程。

那麼,scrapy運行的主要流程呢:

1) 首先爬蟲將需要發送請求的url(requests)經引擎交給調度器;

2) 排序處理後,經ScrapyEngine

DownloaderMiddlewares(有User_Agent, Proxy代理)交給Downloader;

3) Downloader向互聯網發送請求,並接收下載響應.將響應經ScrapyEngine,可選交給Spiders;

4) Spiders處理response,提取數據並將數據經ScrapyEngine交給ItemPipeline保存;

5) 提取url重新經ScrapyEngine交給Scheduler進行下一個循環。直到無Url請求程序停止結束。

scrapy 的常用命令

Scrapy 框架中有兩個命令:

其一:為全局命令:

Fetch 命令:

功能是爬一個網頁,主要參數為:-h;–nolog;

1)Scrapy fetch http://www.baidu.com :  爬取一個網頁,包含爬取的過程。  2)Scrapy fetch https://www.baidu.com -–nolog  3)Runspider可以不依託 scrapy 項目獨立運行爬蟲文件。  Scrapy runspider test.py:  運行單獨的一個不依託項目的爬蟲文件。  4)Scrapy shell http://www.baidu.com –nolog :  爬取百度,並進入 shell 的交互終端。

其二為項目命令:

進入到項目中:Scrapy Bench:測試本地硬件的性能。

1)Scrapy -t basic weisun baidu.com  -l:用來展示當前項目中有多少爬蟲模板;  -t:創建一個爬蟲項目;  Basic:創建基礎模板,  2)Scrapy check weisun  檢查這個爬蟲 weisun 是否可以運行;  3)Scrapy crawl weisun  運行 weisun 爬蟲。  4)Scrapy list  展示當前目錄下可以使用的爬蟲文件。  5)Scrapy edit weisun  在 Linux 下修改 weisun 爬蟲。

後續雜言

scrapy的架構還是很精深的,幾乎涵蓋了爬蟲的所有內容,本文只做一個簡單的介紹,有興趣的同學,可以找到scrapy的官方文檔,做深入了解

近期關於爬蟲的新聞挺多的,筆者借這篇文章也表達一下自己對爬蟲的看法,希望大家不喜勿噴:

1)爬蟲是門技術,只是用來收集公開的數據,就像是之前商店裡陳列的商品價格,爬蟲只是替代了大家線下拿着筆去抄錄的過程,對於網站上沒有展示的內容或者網站名言說是不能獲取的內容,爬蟲是不能獲取的,這是學習技術的一個基本線的問題。

2)爬蟲是一門位於數據價值底層的技能,還是想勸一下大家不要過於沉迷爬蟲,多利用技術探索數據本身的價值。