scrapy 爬蟲利器初體驗(1)

zone發表於2018-11-26

目錄

  • 前言
  • scrapy 資料流
  • scrapy 元件
  • 爬取豆瓣電影 Top250
  • 後記
  • 送書後話

前言

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

scrapy 爬蟲利器初體驗(1)

scrapy 爬蟲利器初體驗(1)

scrapy 資料流

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

scrapy 爬蟲利器初體驗(1)

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 爬蟲利器初體驗(1)

啟動爬蟲

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 常用於:

  • 檢查是否有某些欄位
  • 將資料存進資料庫
  • 資料查重 由於只是初步嘗試一下 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 的高階用法。

送書後話

由於其中一位中獎者沒有及時領取相應的獎品,即視該中獎者放棄相應的獎品。經過檢視後臺的資料,我決定將這個名額給【薯條】這位讀者

相關文章