小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

小白學(xué) Python 爬蟲(chóng)(33):爬蟲(chóng)框架 Scrapy 入門(mén)基礎(chǔ)(一)

 易禪浮屠 2022-03-04

人生苦短,我用 Python

前文傳送門(mén):

小白學(xué) Python 爬蟲(chóng)(1):開(kāi)篇

小白學(xué) Python 爬蟲(chóng)(2):前置準(zhǔn)備(一)基本類庫(kù)的安裝

小白學(xué) Python 爬蟲(chóng)(3):前置準(zhǔn)備(二)Linux基礎(chǔ)入門(mén)

小白學(xué) Python 爬蟲(chóng)(4):前置準(zhǔn)備(三)Docker基礎(chǔ)入門(mén)

小白學(xué) Python 爬蟲(chóng)(5):前置準(zhǔn)備(四)數(shù)據(jù)庫(kù)基礎(chǔ)

小白學(xué) Python 爬蟲(chóng)(6):前置準(zhǔn)備(五)爬蟲(chóng)框架的安裝

小白學(xué) Python 爬蟲(chóng)(7):HTTP 基礎(chǔ)

小白學(xué) Python 爬蟲(chóng)(8):網(wǎng)頁(yè)基礎(chǔ)

小白學(xué) Python 爬蟲(chóng)(9):爬蟲(chóng)基礎(chǔ)

小白學(xué) Python 爬蟲(chóng)(10):Session 和 Cookies

小白學(xué) Python 爬蟲(chóng)(11):urllib 基礎(chǔ)使用(一)

小白學(xué) Python 爬蟲(chóng)(12):urllib 基礎(chǔ)使用(二)

小白學(xué) Python 爬蟲(chóng)(13):urllib 基礎(chǔ)使用(三)

小白學(xué) Python 爬蟲(chóng)(14):urllib 基礎(chǔ)使用(四)

小白學(xué) Python 爬蟲(chóng)(15):urllib 基礎(chǔ)使用(五)

小白學(xué) Python 爬蟲(chóng)(16):urllib 實(shí)戰(zhàn)之爬取妹子圖

小白學(xué) Python 爬蟲(chóng)(17):Requests 基礎(chǔ)使用

小白學(xué) Python 爬蟲(chóng)(18):Requests 進(jìn)階操作

小白學(xué) Python 爬蟲(chóng)(19):Xpath 基操

小白學(xué) Python 爬蟲(chóng)(20):Xpath 進(jìn)階

小白學(xué) Python 爬蟲(chóng)(21):解析庫(kù) Beautiful Soup(上)

小白學(xué) Python 爬蟲(chóng)(22):解析庫(kù) Beautiful Soup(下)

小白學(xué) Python 爬蟲(chóng)(23):解析庫(kù) pyquery 入門(mén)

小白學(xué) Python 爬蟲(chóng)(24):2019 豆瓣電影排行

小白學(xué) Python 爬蟲(chóng)(25):爬取股票信息

小白學(xué) Python 爬蟲(chóng)(26):為啥買(mǎi)不起上海二手房你都買(mǎi)不起

小白學(xué) Python 爬蟲(chóng)(27):自動(dòng)化測(cè)試框架 Selenium 從入門(mén)到放棄(上)

小白學(xué) Python 爬蟲(chóng)(28):自動(dòng)化測(cè)試框架 Selenium 從入門(mén)到放棄(下)

小白學(xué) Python 爬蟲(chóng)(29):Selenium 獲取某大型電商網(wǎng)站商品信息

小白學(xué) Python 爬蟲(chóng)(30):代理基礎(chǔ)

小白學(xué) Python 爬蟲(chóng)(31):自己構(gòu)建一個(gè)簡(jiǎn)單的代理池

小白學(xué) Python 爬蟲(chóng)(32):異步請(qǐng)求庫(kù) AIOHTTP 基礎(chǔ)入門(mén)

引言

首先恭喜看到這篇文章的各位同學(xué),從這篇文章開(kāi)始,整個(gè)小白學(xué) Python 爬蟲(chóng)系列進(jìn)入最后一部分,小編計(jì)劃是介紹一些常用的爬蟲(chóng)框架。

說(shuō)到爬蟲(chóng)框架,首先繞不過(guò)去的必然是 Scrapy 。

Scrapy 是一個(gè)基于 Twisted 的異步處理框架,是純 Python 實(shí)現(xiàn)的爬蟲(chóng)框架,其架構(gòu)清晰,模塊之間的耦合程度低,可擴(kuò)展性極強(qiáng),可以靈活完成各種需求。

當(dāng)然第一件事兒還是各種官方地址:

Scrapy 官網(wǎng): https:///

Github:https://github.com/scrapy/scrapy

官方文檔:https:///doc/

架構(gòu)概述

首先看一下 Scrapy 框架的架構(gòu)體系圖:

從這張圖中,可以看到 Scrapy 分成了很多個(gè)組件,每個(gè)組件的含義如下:

  • Engine 引擎:引擎負(fù)責(zé)控制系統(tǒng)所有組件之間的數(shù)據(jù)流,并在發(fā)生某些操作時(shí)觸發(fā)事件。
  • Item 項(xiàng)目:它定義了爬取結(jié)果的數(shù)據(jù)結(jié)構(gòu),爬取的數(shù)據(jù)會(huì)被賦值成該對(duì)象。
  • Scheduler 調(diào)度器:用來(lái)接受引擎發(fā)過(guò)來(lái)的請(qǐng)求并加入隊(duì)列中,并在引擎再次請(qǐng)求的時(shí)候提供給引擎。
  • Downloader 下載器:下載器負(fù)責(zé)獲取網(wǎng)頁(yè)并將其饋送到引擎,引擎又將其饋給蜘蛛。
  • Spiders 蜘蛛:其內(nèi)定義了爬取的邏輯和網(wǎng)頁(yè)的解析規(guī)則,它主要負(fù)責(zé)解析響應(yīng)并生成提取結(jié)果和新的請(qǐng)求。
  • Item Pipeline 項(xiàng)目管道:負(fù)責(zé)處理由蜘蛛從網(wǎng)頁(yè)中抽取的項(xiàng)目,它的主要任務(wù)是清洗、驗(yàn)證和存儲(chǔ)數(shù)據(jù)。
  • Downloader Middlewares 下載器中間件:下載器中間件是位于引擎和Downloader之間的特定掛鉤,它們?cè)趶囊鎮(zhèn)鬟f到Downloader時(shí)處理請(qǐng)求,以及從Downloader傳遞到Engine的響應(yīng)。
  • Spider Middlewares 蜘蛛中間件:蜘蛛中間件是位于引擎和蜘蛛之間的特定掛鉤,并且能夠處理蜘蛛的輸入(響應(yīng))和輸出(項(xiàng)目和請(qǐng)求)。

上面這張圖的數(shù)據(jù)流程如下:

  1. 該引擎獲取從最初請(qǐng)求爬行 蜘蛛。
  2. 該引擎安排在請(qǐng)求 調(diào)度程序和要求下一個(gè)請(qǐng)求爬行。
  3. 該計(jì)劃返回下一請(qǐng)求的引擎。
  4. 該引擎發(fā)送請(qǐng)求到 下載器,通過(guò) 下載器中間件。
  5. 頁(yè)面下載完成后, Downloader會(huì)生成一個(gè)帶有該頁(yè)面的響應(yīng),并將其發(fā)送到Engine,并通過(guò) Downloader Middlewares。
  6. 該引擎接收來(lái)自響應(yīng) 下載器并將其發(fā)送到所述 蜘蛛進(jìn)行處理,通過(guò)蜘蛛中間件。
  7. 該蜘蛛處理響應(yīng)并返回刮下的項(xiàng)目和新的要求(跟隨)的 引擎,通過(guò) 蜘蛛中間件。
  8. 該引擎發(fā)送處理的項(xiàng)目,以 項(xiàng)目管道,然后把處理的請(qǐng)求的調(diào)度,并要求今后可能請(qǐng)求爬行。
  9. 重復(fù)該過(guò)程(從步驟1開(kāi)始),直到不再有Scheduler的請(qǐng)求為止 。

這張圖的名詞有些多,記不住實(shí)屬正常,不過(guò)沒(méi)關(guān)系,后續(xù)小編會(huì)配合著示例代碼,和各位同學(xué)一起慢慢的學(xué)習(xí)。

基礎(chǔ)示例

先來(lái)個(gè)最簡(jiǎn)單的示例項(xiàng)目,在創(chuàng)建項(xiàng)目之前,請(qǐng)確定自己的環(huán)境已經(jīng)正確安裝了 Scrapy ,如果沒(méi)有安裝的同學(xué)可以看下前面的文章,其中有介紹 Scrapy 的安裝配置。

首先需要?jiǎng)?chuàng)建一個(gè) Scrapy 的項(xiàng)目,創(chuàng)建項(xiàng)目需要使用命令行,在命令行中輸入以下命令:

scrapy startproject first_scrapy

然后一個(gè)名為 first_scrapy 的項(xiàng)目就創(chuàng)建成功了,項(xiàng)目文件結(jié)構(gòu)如下:

first_scrapy/
    scrapy.cfg            # deploy configuration file

    first_scrapy/             # project's Python module, you'll import your code from here
        __init__.py

        items.py          # project items definition file

        middlewares.py    # project middlewares file

        pipelines.py      # project pipelines file

        settings.py       # project settings file

        spiders/          # a directory where you'll later put your spiders
            __init__.py
  • scrapy.cfg:它是 Scrapy 項(xiàng)目的配置文件,其內(nèi)定義了項(xiàng)目的配置文件路徑、部署相關(guān)信息等內(nèi)容。
  • items.py:它定義 Item 數(shù)據(jù)結(jié)構(gòu),所有的 Item 的定義都可以放這里。
  • pipelines.py:它定義 Item Pipeline 的實(shí)現(xiàn),所有的 Item Pipeline 的實(shí)現(xiàn)都可以放這里。
  • settings.py:它定義項(xiàng)目的全局配置。
  • middlewares.py:它定義 Spider Middlewares 和 Downloader Middlewares 的實(shí)現(xiàn)。
  • spiders:其內(nèi)包含一個(gè)個(gè) Spider 的實(shí)現(xiàn),每個(gè) Spider 都有一個(gè)文件。

到此,我們已經(jīng)成功創(chuàng)建了一個(gè) Scrapy 項(xiàng)目,但是這個(gè)項(xiàng)目目前是空的,我們需要再手動(dòng)添加一只 Spider 。

Scrapy 用它來(lái)從網(wǎng)頁(yè)里抓取內(nèi)容,并解析抓取的結(jié)果。不過(guò)這個(gè)類必須繼承 Scrapy 提供的 Spider 類 scrapy.Spider,還要定義 Spider 的名稱和起始請(qǐng)求,以及怎樣處理爬取后的結(jié)果的方法。

創(chuàng)建 Spider 可以使用手動(dòng)創(chuàng)建,也可以使用命令創(chuàng)建,小編這里演示一下如何使用命令來(lái)創(chuàng)建,如下:

scrapy genspider quotes quotes.

將會(huì)看到在 spider 目錄下新增了一個(gè) QuotesSpider.py 的文件,里面的內(nèi)容如下:

# -*- coding: utf-8 -*-
import scrapy


class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    allowed_domains = ['quotes.']
    start_urls = ['http://quotes./']

    def parse(self, response):
        pass

可以看到,這個(gè)類里面有三個(gè)屬性 name 、 allowed_domains 、 start_urls 和一個(gè) parse() 方法。

  • name,它是每個(gè)項(xiàng)目唯一的名字,用來(lái)區(qū)分不同的 Spider。
  • allowed_domains,它是允許爬取的域名,如果初始或后續(xù)的請(qǐng)求鏈接不是這個(gè)域名下的,則請(qǐng)求鏈接會(huì)被過(guò)濾掉。
  • start_urls,它包含了 Spider 在啟動(dòng)時(shí)爬取的 url 列表,初始請(qǐng)求是由它來(lái)定義的。
  • parse,它是 Spider 的一個(gè)方法。默認(rèn)情況下,被調(diào)用時(shí) start_urls 里面的鏈接構(gòu)成的請(qǐng)求完成下載執(zhí)行后,返回的響應(yīng)就會(huì)作為唯一的參數(shù)傳遞給這個(gè)函數(shù)。該方法負(fù)責(zé)解析返回的響應(yīng)、提取數(shù)據(jù)或者進(jìn)一步生成要處理的請(qǐng)求。

到這里我們就清楚了, parse() 方法中的 response 是前面的 start_urls 中鏈接的爬取結(jié)果,所以在 parse() 方法中,我們可以直接對(duì)爬取的結(jié)果進(jìn)行解析。

先看下網(wǎng)頁(yè)的 DOM 結(jié)構(gòu):

接下來(lái)要做的事情就比較簡(jiǎn)單了,獲取其中的數(shù)據(jù),然后將其打印出來(lái)。

數(shù)據(jù)提取的方式可以是 CSS 選擇器也可以是 XPath 選擇器,小編這里使用的是 CSS 選擇器,將我們剛才的 parse() 方法進(jìn)行一些簡(jiǎn)單的改動(dòng),如下:

def parse(self, response):
    quotes = response.css('.quote')
    for quote in quotes:
        text = quote.css('.text::text').extract_first()
        author = quote.css('.author::text').extract_first()
        tags = quote.css('.tags .tag::text').extract()
        print("text:", text)
        print("author:", author)
        print("tags:", tags)

首先是獲取到所有的 class 為 quote 的元素,然后將所有元素進(jìn)行循環(huán)后取出其中的數(shù)據(jù),最后對(duì)這些數(shù)據(jù)進(jìn)行打印。

程序到這里就寫(xiě)完了,那么接下來(lái)的問(wèn)題是,我們?nèi)绾芜\(yùn)行這只爬蟲(chóng)?

Scrapy 的運(yùn)行方式同樣適用適用命令行的,首先要到這個(gè)項(xiàng)目的根目錄下,然后執(zhí)行以下代碼:

scrapy crawl quotes

結(jié)果如下:

可以看到,我們剛才 print() 的內(nèi)容正常的打印在了命令行中。

除了我們 print() 中的內(nèi)容的打印,還可以看到在 Scrapy 啟動(dòng)的過(guò)程中, Scrapy 輸出了當(dāng)前的版本號(hào)以及正在啟動(dòng)的項(xiàng)目名稱,并且在爬取網(wǎng)頁(yè)的過(guò)程中,首先訪問(wèn)了 http://quotes./robots.txt 機(jī)器人協(xié)議,雖然這個(gè)協(xié)議在當(dāng)前這個(gè)示例中響應(yīng)了 404的狀態(tài)碼,但是 Scrapy 會(huì)根據(jù)機(jī)器人協(xié)議中的內(nèi)容進(jìn)行爬取。

示例代碼

本系列的所有代碼小編都會(huì)放在代碼管理倉(cāng)庫(kù) Github 和 Gitee 上,方便大家取用。

示例代碼-Github

示例代碼-Gitee

參考

https://docs./en/latest/intro/tutorial.html

https://docs./en/latest/topics/architecture.html

https:///8337.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多