scrapy 爬蟲利器初體驗(1)

目錄

  • 前言
  • scrapy 數據流
  • scrapy 組件
  • 爬取豆瓣電影 Top250
  • 後記
  • 送書後話

前言

爲何要學 scrapy 呢?看下圖,就清楚了。不少招聘要求都有 scrapy,主要是由於 scrapy 確實很強。那到底強在哪裏呢?請在文中找答案。 html

scrapy 數據流

首先咱們先來學習一下 scrapy 的工做流程。scrapy 文檔地址 數據庫

一、爬蟲引擎得到初始請求開始抓取。 二、爬蟲引擎開始請求調度程序,並準備對下一次的請求進行抓取。 三、爬蟲調度器返回下一個請求給爬蟲引擎。 四、引擎請求發送到下載器,經過下載中間件下載網絡數據。 五、一旦下載器完成頁面下載,將下載結果返回給爬蟲引擎。 六、引擎將下載器的響應經過中間件返回給爬蟲進行處理。 七、爬蟲處理響應,並經過中間件返回處理後的items,以及新的請求給引擎。 八、引擎發送處理後的items到項目管道,而後把處理結果返回給調度器,調度器計劃處理下一個請求抓取。 九、重複該過程(繼續步驟1),直到爬取完全部的 url 請求。bash

scrapy 組件

爬蟲引擎

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

調度器

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

下載器

經過engine請求下載網絡數據並將結果響應給engine。dom

Spider

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

item pipeline

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

download middleware

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

spider middleware

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

爬取豆瓣電影 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 經常使用於:

  • 檢查是否有某些字段
  • 將數據存進數據庫
  • 數據查重 因爲只是初步嘗試一下 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 的高級用法。

送書後話

因爲其中一位中獎者沒有及時領取相應的獎品,即視該中獎者放棄相應的獎品。通過查看後臺的數據,我決定將這個名額給【薯條】這位讀者

相關文章
相關標籤/搜索