當前位置:
首頁 > 知識 > 爬蟲利器 Scrapy 初體驗(1)

爬蟲利器 Scrapy 初體驗(1)

(給

Python開發者

加星標,提升Python技能


作者:Zone (本文來自作者投稿)

前言


為什麼要學 scrapy 呢?看下圖中的招聘要求,就清楚了。很多招聘要求都有 scrapy,主要是因為 scrapy 確實很強。那到底強在哪裡呢?請在文中找答案。




scrapy 數據流


首先我們先來學習一下 scrapy 的工作流程。


1、爬蟲引擎獲得初始請求開始抓取。 
2、爬蟲引擎開始請求調度程序,並準備對下一次的請求進行抓取。 
3、爬蟲調度器返回下一個請求給爬蟲引擎。 
4、引擎請求發送到下載器,通過下載中間件下載網路數據。 
5、一旦下載器完成頁面下載,將下載結果返回給爬蟲引擎。 
6、引擎將下載器的響應通過中間件返回給爬蟲進行處理。 
7、爬蟲處理響應,並通過中間件返回處理後的items,以及新的請求給引擎。 
8、引擎發送處理後的 items 到項目管道,然後把處理結果返回給調度器,調度器計劃處理下一個請求抓取。 
9、重複該過程(繼續步驟1),直到爬取完所有的 url 請求。

scrapy 組件


爬蟲引擎


爬蟲引擎負責控制各個組件之間的數據流,當某些操作觸發事件後都是通過 engine來處理。


調度器


調度接收來 engine 的請求並將請求放入隊列中,並通過事件返回給 engine。

下載器


通過engine請求下載網路數據並將結果響應給engine。


Spider


Spider 發出請求,並處理 engine 返回給它下載器響應數據,以 items 和規則內的數據請求(urls)返回給 engine。


item pipeline

負責處理 engine 返回 spider 解析後的數據,並且將數據持久化,例如將數據存入資料庫或者文件。


download middleware


下載中間件是engine和下載器交互組件,以鉤子(插件)的形式存在,可以代替接收請求、處理數據的下載以及將結果響應給engine。


spider middleware


spider中間件是engine和spider之間的交互組件,以鉤子(插件)的形式存在,可以代替處理response以及返回給engine items及新的請求集。

爬取豆瓣電影 Top250


安裝

pip

 install scrapy


初始化爬蟲

scrapy

 startproject doubanTop250(項目名稱)


目錄架構如下,其中 douban_spider.py 為手動創建。


啟動爬蟲

scrapy

 crawl douban(後面會解釋,這個 dougban 是從哪裡來的,此處先留一個小坑)


spider


以下代碼為 douban_spider.py ,裡面都有相應的注釋,以方便理解

class

 

RecruitSpider

(scrapy.spiders.Spider)

:


    

# 此處為上面留下的小坑,即是設置爬蟲名稱


    name = 

"douban"


    

# 設置允許爬取的域名


    allowed_domains = [

"douban.com"

]
    

# 設置起始 url


    start_urls = [

"https://movie.douban.com/top250"

]

    

# 每當網頁數據 download 下來,就會發送到這裡進行解析


    

# 然後返回一個新的鏈接,加入 request 隊列


    

def

 

parse

(self, response)

:


        item = Doubantop250Item()
        selector = Selector(response)
        Movies = selector.xpath(

"//div[@class="info"]"

)
        

for

 eachMovie 

in

 Movies:
            title = eachMovie.xpath(

"div[@class="hd"]/a/span/text()"

).extract()  

# 多個span標籤


            fullTitle = 

""

.join(title)
            movieInfo = eachMovie.xpath(

"div[@class="bd"]/p/text()"

).extract()
            star = eachMovie.xpath(

"div[@class="bd"]/div[@class="star"]/span/text()"

).extract()[

0

]
            quote = eachMovie.xpath(

"div[@class="bd"]/p[@class="quote"]/span/text()"

).extract()
            

# quote 可能為空,這裡進行判斷一下


            

if

 quote:
                quote = quote[

0

]
            

else

:
                quote = 

""


            item[

"title"

] = fullTitle
            item[

"movieInfo"

] = 

";"

.join(movieInfo)
            item[

"star"

] = star
            item[

"quote"

] = quote
            

yield

 item
        nextLink = selector.xpath(

"//span[@class="next"]/link/@href"

).extract()
        

# 第10頁是最後一頁,沒有下一頁的鏈接


        

if

 nextLink:
            nextLink = nextLink[

0

]
            

yield

 Request(urljoin(response.url, nextLink), callback=self.parse)


pipelines


每當 spider 分析完 HTML 之後,變會返回 item,傳遞給 item pipelines。上面代碼中:

yield

 item


便是返回的數據。
一般 pipelines 常用於:




  1. 檢查是否有某些欄位



  2. 將數據存進資料庫



  3. 數據查重
    由於只是初步嘗試一下 scrapy 爬蟲,所以這裡我沒有進行修改


class

 

Doubantop250Pipeline

(object)

:


    

def

 

process_item

(self, item, spider)

:


        

return

 item


items


定義我們需要獲取的欄位

class

 

Doubantop250Item

(scrapy.Item)

:


    

# define the fields for your item here like:


    

# name = scrapy.Field()


    title = scrapy.Field()  

# 電影名字


    movieInfo = scrapy.Field()  

# 電影的描述信息,包括導演、主演、電影類型等等


    star = scrapy.Field()  

# 電影評分


    quote = scrapy.Field()  

# 膾炙人口的一句話


    

pass



setting


settings.py 定義我們爬蟲的各種配置,由於這裡是初步了解 scrapy 故相應的介紹會在後面。


啟動爬蟲

scrapy

 crawl douban


這裡沒有進行詳細的解析,只是展示大概數據


後記


關於豆瓣電影的小爬蟲就下完了,後面會深入解析一下 scrapy 的高級用法。



【本文作者】


Zone:一隻愛折騰的後端攻城獅,喜歡寫文分享。個人公眾號:zone7



推薦閱讀


(點擊標題可跳轉閱讀)


用 Python 全自動下載抖音小姐姐視頻


爬取虎嗅 5 萬篇文章告訴你怎麼樣取標題


Python 爬蟲實踐:淺談數據分析崗位

覺得本文對你有幫助?請分享給更多人


關注「Python開發者」加星標,提升Python技能



喜歡就點一下「好看」唄~

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發者 的精彩文章:

TAG:Python開發者 |