python爬蟲架構之scrapy重出江湖
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理
以下文章來源於騰訊雲 作者:資料森麟
( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料。 )
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 Requestclass 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執行的主要流程呢:
-
首先爬蟲將需要傳送請求的url(requests)經引擎交給排程器;
-
排序處理後,經ScrapyEngine
DownloaderMiddlewares(有User_Agent, Proxy代理)交給Downloader;
-
Downloader向網際網路傳送請求,並接收下載響應.將響應經ScrapyEngine,可選交給Spiders;
-
Spiders處理response,提取資料並將資料經ScrapyEngine交給ItemPipeline儲存;
-
提取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)爬蟲是一門位於資料價值底層的技能,還是想勸一下大家不要過於沉迷爬蟲,多利用技術探索資料本身的價值。