<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          手把手帶你入門Python爬蟲(chóng)Scrapy

          共 3439字,需瀏覽 7分鐘

           ·

          2020-09-10 17:18


          導(dǎo)讀:Scrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架。可以應(yīng)用在包括數(shù)據(jù)挖掘,信息處理或存儲(chǔ)歷史數(shù)據(jù)等一系列的程序中。


          作者 / 來(lái)源:無(wú)量測(cè)試之道




          01?Scrapy工作流程是怎么樣的

          下圖是從網(wǎng)絡(luò)上找的一張Scrapy的工作流程圖,并且標(biāo)注了相應(yīng)的中文說(shuō)明信息:



          02?Scrapy框架的六大組件

          它們分別是:

          • 調(diào)度器(Scheduler)
          • 下載器(Downloader)
          • 爬蟲(chóng)(Spider)
          • 中間件(Middleware)
          • 實(shí)體管道(Item Pipeline)
          • Scrapy引擎(Scrapy Engine)


          03?工作流程如下

          Step1. 當(dāng)爬蟲(chóng)(Spider)要爬取某URL地址的頁(yè)面時(shí),使用該URL初始化Request對(duì)象提交給引擎(Scrapy Engine),并設(shè)置回調(diào)函數(shù),Spider中初始的Request是通過(guò)調(diào)用start_requests() 來(lái)獲取的。start_requests() 讀取start_urls 中的URL,并以parse為回調(diào)函數(shù)生成Request 。

          備注:你所創(chuàng)建的項(xiàng)目名.py 文件里面有一個(gè)列表:start_urls=[‘http://lab.scrapyd.cn/page/1/‘] (這是我的示例),這里的start_requests() 讀取的start_urls 就是來(lái)自于這里,這個(gè)文件在大家創(chuàng)建爬蟲(chóng)項(xiàng)目時(shí)會(huì)自動(dòng)新建。parse()這個(gè)回調(diào)函數(shù)也是自動(dòng)創(chuàng)建的。只是簡(jiǎn)單的定義了一下,如下所示:

          def?parse(self,?response):
          ????pass

          Step2.?Request對(duì)象進(jìn)入調(diào)度器(Scheduler) 按某種算法進(jìn)行排隊(duì),之后的每個(gè)時(shí)刻調(diào)度器將其出列,送往下載器。

          備注:Scheduler的作用就是對(duì)請(qǐng)求的調(diào)度,包括過(guò)濾,請(qǐng)求的入隊(duì)和出隊(duì)操作。

          Step3.?下載器(Downloader)根據(jù)Request對(duì)象中的URL地址發(fā)送一次HTTP請(qǐng)求到網(wǎng)絡(luò)服務(wù)器把資源下載下來(lái),并封裝成應(yīng)答包(Response)。

          備注:相當(dāng)于就是將獲取的頁(yè)面資源數(shù)據(jù)信息轉(zhuǎn)化為Response實(shí)例,以便傳遞給Spider 的Parse() 函數(shù)繼續(xù)處理。

          Step4.?應(yīng)答包Response對(duì)象最終會(huì)被遞送給爬蟲(chóng)(Spider)的頁(yè)面解析函數(shù)進(jìn)行處理。

          備注:這個(gè)頁(yè)面解析函數(shù)就是步驟一里面提到的parse() 函數(shù),它是創(chuàng)建項(xiàng)目時(shí)自動(dòng)生成的。

          Step5.?若是解析出實(shí)體(Item),則交給實(shí)體管道(Item Pipeline)進(jìn)行進(jìn)一步的處理。

          由Spider返回的Item將被存到數(shù)據(jù)庫(kù)(由某些Item Pipeline處理)或使用Feed exports存入到文件中。

          備注:實(shí)體(Item) 實(shí)際上就是指我們要獲取的數(shù)據(jù)

          Step6.?若是解析出的是鏈接(URL),則把URL交給調(diào)度器(Scheduler)等待抓取。

          備注:這里有一種循環(huán)調(diào)用的感覺(jué),解析的item如果是url就重復(fù)整個(gè)工作流程。


          04?如何安裝與簡(jiǎn)單使用

          1. 安裝就很簡(jiǎn)單了,一條命令搞定

          python3?-m?pip?install?scrapy?#這個(gè)可能需要花掉一段時(shí)間,如果你的網(wǎng)絡(luò)快可能就比較快,如果你出現(xiàn)超時(shí)導(dǎo)致沒(méi)有安裝成功可以繼續(xù)執(zhí)行這個(gè)命令

          檢驗(yàn)是否安裝成功:進(jìn)入python3 的命令行,輸入import scrapy 如果沒(méi)有報(bào)錯(cuò)就表示安裝成功了。

          2. 簡(jiǎn)單使用說(shuō)明

          Step1.?開(kāi)始創(chuàng)建一個(gè)Scrapy 項(xiàng)目,我這里以爬取lab為示例

          scrapy?startproject?lab?#創(chuàng)建新的Scrapy項(xiàng)目,注意一下,如果此命令沒(méi)有你就需要配置一下Scrapy?的環(huán)境變量

          cd?lab?#進(jìn)入創(chuàng)建的項(xiàng)目目錄

          scrapy?genspider?labs?http://lab.scrapyd.cn/page/1/?#?生成spider?代碼

          Step2.?定義提取的Item

          class?LabItem(scrapy.Item):?
          ????title?=?scrapy.Field()
          ????author?=?scrapy.Field()

          Step3.?編寫解析Parse函數(shù)

          def?parse(self,?response):
          ????items=LabItem()?#實(shí)例化一個(gè)數(shù)據(jù)對(duì)象,用于返回
          ????for?sel?in?response.xpath('//div[@class="col-mb-12?col-8"]'):
          ????????print(sel)
          ????????for?i?in?range(len(sel.xpath('//div[@class="quote?post"]//span[@class="text"]/text()'))):
          ????????????title?=?sel.xpath('//div[@class="quote?post"]//span[@class="text"]/text()')[i].get()
          ????????????author?=?sel.xpath('//div[@class="quote?post"]//small[@class="author"]/text()')[i].get()
          ????????????items["title"]=title
          ????????????items["author"]?=?author
          ????????????yield?items?#返回提出來(lái)的每一個(gè)數(shù)據(jù)對(duì)象

          Step4.?編寫Pipeline 來(lái)提取Item數(shù)據(jù)

          from?itemadapter?import?ItemAdapter
          import?json

          class?FilePipeline(object):

          ????def?open_spider(self,?spider):
          ????????print("當(dāng)爬蟲(chóng)執(zhí)行開(kāi)始的時(shí)候回調(diào):open_spider")

          ????def?__init__(self):
          ????????print("創(chuàng)建爬蟲(chóng)數(shù)據(jù)存儲(chǔ)文件")
          ????????self.file?=?open('test.json',"w",?encoding="utf-8")

          ????def?process_item(self,?item,?spider):
          ????????print("開(kāi)始處理每一條提取出來(lái)的數(shù)據(jù)")
          ????????content?=?json.dumps(dict(item),ensure_ascii=False)+"\n"
          ????????self.file.write(content)
          ????????return?item

          ????def?close_spider(self,?spider):
          ????????print("當(dāng)爬蟲(chóng)執(zhí)行結(jié)束的時(shí)候回調(diào):close_spider")
          ????????self.file.close()

          這里是自定義的一個(gè)pipeline,所以還需要在setting.py 文件里面把它配置上,如下:
          ITEM_PIPELINES?=?{
          ???'lab.pipelines.FilePipeline':?300,
          }

          最終提取到文件的結(jié)果如下圖所示:



          總結(jié)

          今天的分享主要是從整體上講了一下Scrapy 的工作流程,算是一個(gè)入門的學(xué)習(xí),如果把這個(gè)流程中的一些概念性的內(nèi)容能夠掌握好理解到位,那么接下來(lái)的學(xué)習(xí)會(huì)更容易一些,同時(shí)基于理解的學(xué)習(xí)會(huì)更深刻。


          劃重點(diǎn)?


          干貨直達(dá)?


          更多精彩?

          在公眾號(hào)對(duì)話框輸入以下關(guān)鍵詞
          查看更多優(yōu)質(zhì)內(nèi)容!

          PPT?|?讀書(shū)?|?書(shū)單?|?硬核?|?干貨?|?講明白?|?神操作
          大數(shù)據(jù)?|?云計(jì)算?|?數(shù)據(jù)庫(kù)?|?Python?|?可視化
          AI?|?人工智能?|?機(jī)器學(xué)習(xí)?|?深度學(xué)習(xí)?|?NLP
          5G?|?中臺(tái)?|?用戶畫(huà)像?|?1024?|?數(shù)學(xué)?|?算法?|?數(shù)字孿生

          據(jù)統(tǒng)計(jì),99%的大咖都完成了這個(gè)神操作
          ?


          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲 无码 在线 播放 | 日韩无码十八禁 | 国产女人18毛片水18精品变态 | 三级久久免费 | 亚洲综合免费观看高清完整版在线 |