爲何要學 scrapy 呢?看下圖,就清楚了。不少招聘要求都有 scrapy,主要是由於 scrapy 確實很強。那到底強在哪裏呢?請在文中找答案。 html
首先咱們先來學習一下 scrapy 的工做流程。scrapy 文檔地址 數據庫
一、爬蟲引擎得到初始請求開始抓取。 二、爬蟲引擎開始請求調度程序,並準備對下一次的請求進行抓取。 三、爬蟲調度器返回下一個請求給爬蟲引擎。 四、引擎請求發送到下載器,經過下載中間件下載網絡數據。 五、一旦下載器完成頁面下載,將下載結果返回給爬蟲引擎。 六、引擎將下載器的響應經過中間件返回給爬蟲進行處理。 七、爬蟲處理響應,並經過中間件返回處理後的items,以及新的請求給引擎。 八、引擎發送處理後的items到項目管道,而後把處理結果返回給調度器,調度器計劃處理下一個請求抓取。 九、重複該過程(繼續步驟1),直到爬取完全部的 url 請求。bash
爬蟲引擎負責控制各個組件之間的數據流,當某些操做觸發事件後都是經過engine來處理。網絡
調度接收來engine的請求並將請求放入隊列中,並經過事件返回給engine。架構
經過engine請求下載網絡數據並將結果響應給engine。dom
Spider發出請求,並處理engine返回給它下載器響應數據,以items和規則內的數據請求(urls)返回給engine。scrapy
負責處理engine返回spider解析後的數據,而且將數據持久化,例如將數據存入數據庫或者文件。ide
下載中間件是engine和下載器交互組件,以鉤子(插件)的形式存在,能夠代替接收請求、處理數據的下載以及將結果響應給engine。學習
spider中間件是engine和spider之間的交互組件,以鉤子(插件)的形式存在,能夠代替處理response以及返回給engine items及新的請求集。ui
pip install scrapy
複製代碼
scrapy startproject doubanTop250(項目名稱)
複製代碼
目錄架構以下,其中 douban_spider.py 爲手動建立。
scrapy crawl douban(後面會解釋,這個 dougban 是從哪裏來的,此處先留一個小坑)
複製代碼
如下代碼爲 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)
複製代碼
每當 spider 分析完 HTML 以後,變會返回 item,傳遞給 item pipelines。上面代碼中:
yield item
複製代碼
即是返回的數據。 通常 pipelines 經常使用於:
class Doubantop250Pipeline(object):
def process_item(self, item, spider):
return item
複製代碼
定義咱們須要獲取的字段
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
複製代碼
settings.py 定義咱們爬蟲的各類配置,因爲這裏是初步瞭解 scrapy 故相應的介紹會在後面。
scrapy crawl douban
複製代碼
關於豆瓣電影的小爬蟲就下完了,後面會深刻解析一下 scrapy 的高級用法。
因爲其中一位中獎者沒有及時領取相應的獎品,即視該中獎者放棄相應的獎品。通過查看後臺的數據,我決定將這個名額給【薯條】這位讀者