1. 程式人生 > 實用技巧 >python爬蟲架構之scrapy重出江湖

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 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;

  1. Downloader向網際網路傳送請求,並接收下載響應.將響應經ScrapyEngine,可選交給Spiders;

  2. Spiders處理response,提取資料並將資料經ScrapyEngine交給ItemPipeline儲存;

  3. 提取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)爬蟲是一門位於資料價值底層的技能,還是想勸一下大家不要過於沉迷爬蟲,多利用技術探索資料本身的價值。