爬虫利器初体验 scrapy,爬取豆瓣电影
目錄
-
前言
-
scrapy 數(shù)據(jù)流
-
scrapy 組件
-
爬取豆瓣電影 Top250
-
后記
-
送書后話
前言
為什么要學 scrapy 呢?看下圖中的招聘要求,就清楚了。很多招聘要求都有 scrapy,主要是因為 scrapy 確實很強。那到底強在哪里呢?請在文中找答案。
?
?
?
?
scrapy 數(shù)據(jù)流
首先我們先來學習一下 scrapy 的工作流程。
?
?
1、爬蟲引擎獲得初始請求開始抓取。?
2、爬蟲引擎開始請求調度程序,并準備對下一次的請求進行抓取。?
3、爬蟲調度器返回下一個請求給爬蟲引擎。?
4、引擎請求發(fā)送到下載器,通過下載中間件下載網(wǎng)絡數(shù)據(jù)。?
5、一旦下載器完成頁面下載,將下載結果返回給爬蟲引擎。?
6、引擎將下載器的響應通過中間件返回給爬蟲進行處理。?
7、爬蟲處理響應,并通過中間件返回處理后的items,以及新的請求給引擎。?
8、引擎發(fā)送處理后的 items 到項目管道,然后把處理結果返回給調度器,調度器計劃處理下一個請求抓取。?
9、重復該過程(繼續(xù)步驟1),直到爬取完所有的 url 請求。
scrapy 組件
爬蟲引擎
爬蟲引擎負責控制各個組件之間的數(shù)據(jù)流,當某些操作觸發(fā)事件后都是通過 engine來處理。
調度器
調度接收來 engine 的請求并將請求放入隊列中,并通過事件返回給 engine。
下載器
通過engine請求下載網(wǎng)絡數(shù)據(jù)并將結果響應給engine。
Spider
Spider 發(fā)出請求,并處理 engine 返回給它下載器響應數(shù)據(jù),以 items 和規(guī)則內(nèi)的數(shù)據(jù)請求(urls)返回給 engine。
item pipeline
負責處理 engine 返回 spider 解析后的數(shù)據(jù),并且將數(shù)據(jù)持久化,例如將數(shù)據(jù)存入數(shù)據(jù)庫或者文件。
download middleware
下載中間件是engine和下載器交互組件,以鉤子(插件)的形式存在,可以代替接收請求、處理數(shù)據(jù)的下載以及將結果響應給engine。
spider middleware
spider中間件是engine和spider之間的交互組件,以鉤子(插件)的形式存在,可以代替處理response以及返回給engine items及新的請求集。
爬取豆瓣電影 Top250
安裝
pip?install?scrapy初始化爬蟲
scrapy?startproject?doubanTop250(項目名稱)目錄架構如下,其中 douban_spider.py 為手動創(chuàng)建。
?
?
啟動爬蟲
scrapy?crawl?douban(后面會解釋,這個?dougban?是從哪里來的,此處先留一個小坑)spider
以下代碼為 douban_spider.py ,里面都有相應的注釋,以方便理解
class?RecruitSpider(scrapy.spiders.Spider):#?此處為上面留下的小坑,即是設置爬蟲名稱name?=?"douban"#?設置允許爬取的域名allowed_domains?=?["douban.com"]#?設置起始?urlstart_urls?=?["https://movie.douban.com/top250"]#?每當網(wǎng)頁數(shù)據(jù)?download?下來,就會發(fā)送到這里進行解析#?然后返回一個新的鏈接,加入?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']?=?fullTitleitem['movieInfo']?=?';'.join(movieInfo)item['star']?=?staritem['quote']?=?quoteyield?itemnextLink?=?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便是返回的數(shù)據(jù)。
一般 pipelines 常用于:
-
檢查是否有某些字段
-
將數(shù)據(jù)存進數(shù)據(jù)庫
-
數(shù)據(jù)查重
由于只是初步嘗試一下 scrapy 爬蟲,所以這里我沒有進行修改?
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()??#?膾炙人口的一句話passsetting
settings.py 定義我們爬蟲的各種配置,由于這里是初步了解 scrapy 故相應的介紹會在后面。
啟動爬蟲
scrapy?crawl?douban?
?
這里沒有進行詳細的解析,只是展示大概數(shù)據(jù)
?
后記
關于豆瓣電影的小爬蟲就下完了,后面會深入解析一下 scrapy 的高級用法。
總結
以上是生活随笔為你收集整理的爬虫利器初体验 scrapy,爬取豆瓣电影的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WordPress企业站建站主题avad
- 下一篇: 视+AR为央视网络春晚助阵,打造央视影音