爬虫利器初体验 scrapy,爬取豆瓣电影
目錄
-
前言
-
scrapy 數(shù)據(jù)流
-
scrapy 組件
-
爬取豆瓣電影 Top250
-
后記
-
送書后話
前言
為什么要學(xué) scrapy 呢?看下圖中的招聘要求,就清楚了。很多招聘要求都有 scrapy,主要是因?yàn)?scrapy 確實(shí)很強(qiáng)。那到底強(qiáng)在哪里呢?請(qǐng)?jiān)谖闹姓掖鸢浮?/p>
?
?
?
?
scrapy 數(shù)據(jù)流
首先我們先來學(xué)習(xí)一下 scrapy 的工作流程。
?
?
1、爬蟲引擎獲得初始請(qǐng)求開始抓取。?
2、爬蟲引擎開始請(qǐng)求調(diào)度程序,并準(zhǔn)備對(duì)下一次的請(qǐng)求進(jìn)行抓取。?
3、爬蟲調(diào)度器返回下一個(gè)請(qǐng)求給爬蟲引擎。?
4、引擎請(qǐng)求發(fā)送到下載器,通過下載中間件下載網(wǎng)絡(luò)數(shù)據(jù)。?
5、一旦下載器完成頁面下載,將下載結(jié)果返回給爬蟲引擎。?
6、引擎將下載器的響應(yīng)通過中間件返回給爬蟲進(jìn)行處理。?
7、爬蟲處理響應(yīng),并通過中間件返回處理后的items,以及新的請(qǐng)求給引擎。?
8、引擎發(fā)送處理后的 items 到項(xiàng)目管道,然后把處理結(jié)果返回給調(diào)度器,調(diào)度器計(jì)劃處理下一個(gè)請(qǐng)求抓取。?
9、重復(fù)該過程(繼續(xù)步驟1),直到爬取完所有的 url 請(qǐng)求。
scrapy 組件
爬蟲引擎
爬蟲引擎負(fù)責(zé)控制各個(gè)組件之間的數(shù)據(jù)流,當(dāng)某些操作觸發(fā)事件后都是通過 engine來處理。
調(diào)度器
調(diào)度接收來 engine 的請(qǐng)求并將請(qǐng)求放入隊(duì)列中,并通過事件返回給 engine。
下載器
通過engine請(qǐng)求下載網(wǎng)絡(luò)數(shù)據(jù)并將結(jié)果響應(yīng)給engine。
Spider
Spider 發(fā)出請(qǐng)求,并處理 engine 返回給它下載器響應(yīng)數(shù)據(jù),以 items 和規(guī)則內(nèi)的數(shù)據(jù)請(qǐng)求(urls)返回給 engine。
item pipeline
負(fù)責(zé)處理 engine 返回 spider 解析后的數(shù)據(jù),并且將數(shù)據(jù)持久化,例如將數(shù)據(jù)存入數(shù)據(jù)庫(kù)或者文件。
download middleware
下載中間件是engine和下載器交互組件,以鉤子(插件)的形式存在,可以代替接收請(qǐng)求、處理數(shù)據(jù)的下載以及將結(jié)果響應(yīng)給engine。
spider middleware
spider中間件是engine和spider之間的交互組件,以鉤子(插件)的形式存在,可以代替處理response以及返回給engine items及新的請(qǐng)求集。
爬取豆瓣電影 Top250
安裝
pip?install?scrapy初始化爬蟲
scrapy?startproject?doubanTop250(項(xiàng)目名稱)目錄架構(gòu)如下,其中 douban_spider.py 為手動(dòng)創(chuàng)建。
?
?
啟動(dòng)爬蟲
scrapy?crawl?douban(后面會(huì)解釋,這個(gè)?dougban?是從哪里來的,此處先留一個(gè)小坑)spider
以下代碼為 douban_spider.py ,里面都有相應(yīng)的注釋,以方便理解
class?RecruitSpider(scrapy.spiders.Spider):#?此處為上面留下的小坑,即是設(shè)置爬蟲名稱name?=?"douban"#?設(shè)置允許爬取的域名allowed_domains?=?["douban.com"]#?設(shè)置起始?urlstart_urls?=?["https://movie.douban.com/top250"]#?每當(dāng)網(wǎng)頁數(shù)據(jù)?download?下來,就會(huì)發(fā)送到這里進(jìn)行解析#?然后返回一個(gè)新的鏈接,加入?request?隊(duì)列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()??#?多個(gè)span標(biāo)簽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?可能為空,這里進(jìn)行判斷一下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
每當(dāng) spider 分析完 HTML 之后,變會(huì)返回 item,傳遞給 item pipelines。上面代碼中:
yield?item便是返回的數(shù)據(jù)。
一般 pipelines 常用于:
-
檢查是否有某些字段
-
將數(shù)據(jù)存進(jìn)數(shù)據(jù)庫(kù)
-
數(shù)據(jù)查重
由于只是初步嘗試一下 scrapy 爬蟲,所以這里我沒有進(jìn)行修改?
items
定義我們需要獲取的字段
class?Doubantop250Item(scrapy.Item):#?define?the?fields?for?your?item?here?like:#?name?=?scrapy.Field()title?=?scrapy.Field()??#?電影名字movieInfo?=?scrapy.Field()??#?電影的描述信息,包括導(dǎo)演、主演、電影類型等等star?=?scrapy.Field()??#?電影評(píng)分quote?=?scrapy.Field()??#?膾炙人口的一句話passsetting
settings.py 定義我們爬蟲的各種配置,由于這里是初步了解 scrapy 故相應(yīng)的介紹會(huì)在后面。
啟動(dòng)爬蟲
scrapy?crawl?douban?
?
這里沒有進(jìn)行詳細(xì)的解析,只是展示大概數(shù)據(jù)
?
后記
關(guān)于豆瓣電影的小爬蟲就下完了,后面會(huì)深入解析一下 scrapy 的高級(jí)用法。
總結(jié)
以上是生活随笔為你收集整理的爬虫利器初体验 scrapy,爬取豆瓣电影的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WordPress企业站建站主题avad
- 下一篇: JavaWeb学习笔记:JavaScri