放養的小爬蟲--豆瓣電影入門級爬蟲(mongodb使用教程~)
筆者聲明:只用於學習交流,不用於其他途徑。源代碼已上傳github。githu地址:https://github.com/Erma-Wang/Spider
筆者聲明:只用於學習交流,不用於其他途徑。源代碼已上傳github。githu地址:https://github.com/Erma-Wang/Spider
筆者聲明:只用於學習交流,不用於其他途徑。源代碼已上傳github。githu地址:https://github.com/Erma-Wang/Spider
重要的事情說三遍~~~!!!只用於學習交流,私自用於其他途徑,后果自負!!!
github源代碼地址https://github.com/Erma-Wang/Spider(注意,本倉庫還有其他的小爬蟲,本文章講解的是DouBanSpider···),別忘了給個star哦 ! @、@
開篇之前~閑聊幾句~
筆者是iOS開發從業者,但是我相信很多小伙伴也和我一樣,並不是Python開發者,卻對爬蟲技術(scrapy)頗感興趣兒~之前寫過一些iOS的博客,最近在寫爬蟲技術分享的博客的時候,發現很多小伙伴對爬蟲技術比對iOS興趣點來的大~這時候,我就在想,為什么叻?
我認為爬蟲技術基本原理就三點~下載數據~匹配數據~保存數據~
,本來一件很簡單的事兒,卻有這么多的爬蟲愛好者去研究~去探索~並且還誕生了偉大的框架scrapy
、pyspider
,但是個人認為其是一種工具
。這么多的非python開發者對爬蟲技術(scrapy、pyspider)感興趣,我想是因為爬蟲技術屬於逆向工程
吧~人們一直以來對正向的思維,正向的發展,正向的軟件開發等等一切事物運籌帷幄,卻很少有人對一件事物,一件物品,一個軟件,甚至一個網站開發出來后反向對到其制作過程,制作工序,制作原料作其推導~古文說以古為鏡,可以知興替
,我想,對一件已經制作出來的物品,推導其制作過程,比制作這件物品更來得有興趣吧~
總結幾點~
之前在上一篇博客中有些小伙伴給我了一些不錯的idea~
- 有讀者建議我在之前的爬蟲上加上代理,這點兒,筆者還是以不加代理的風格繼續寫爬蟲,因為畢竟加上代理我會擔心一些不好的小伙伴拿筆者寫好的爬蟲去做了不好的事兒,請諒解~如有個人特殊需求,上github上自行fork修改~
- 之前的JDSpider具有時效性~因為畢竟京東也不是傻子,規則會經常變更~
- 之前有效換提出能不能抓取AJAX的url,額~對於這樣高深的技術,超出筆者能力范圍~目前為止,唯一的辦法就是抓包工具抓包,人工手動分析~
- 有一些idea還在研究中,比如說爬取淘寶數據~這個有難度,是真心有難度~
- 最后,筆者所寫爬蟲技術含量並不高,只是入門級別的爬蟲,只用於爬蟲愛好者交流分享擺了~適合於爬蟲初學者,大多為scrapy。。。
開篇
筆者在之前的博客里寫過京東的Spider,首先非常感謝小伙伴對我的支持~在此,筆者寫了一個入門級別的小爬蟲,給一些想學scrapy但是還沒有開始學習scrapy的小伙伴講解一些scrapy的一些基礎知識吧~本文雖然對於scrapy來說完全算是入門級別,但是您應該具有一定的網頁編程基礎和網絡基礎知識。本文中主要講解mongodb的基本使用,附帶一個實戰小爬蟲~
還是一樣,scrapy不做詳細解釋~有疑問,找度娘~
抓取目標url和目標數據item
目標url:https://movie.douban.com/top250
目標數據 item
標題:title = Field()
電影信息:movieInfo = Field()
評分:star = Field()
經典名言:quote = Field()
目標網站分析與思路分析(爬蟲常規思路~)
先看看目標網站吧~是的,網上很多用豆瓣做爬蟲教程,因為比較好爬取吧~筆者在這也用豆瓣爬蟲來作為演示~
一、抓取li標簽構建數組~
是的,和常規網站一樣一個li標簽代表一個小模塊的整合~思路先把每個li抓取出來放入一個數組中,這也是常規思路,先看關鍵代碼吧~
實例化選擇器
selector = Selector(response)
抓取li標簽構建Movies數組
Movies = selector.xpath('//div[@class="info"]')
二、遍歷數組取出each~
for in循環取出~沒啥說的
三、選擇器匹配數據~
抓取數據~
title = eachMovie.xpath('div[@class="hd"]/a/span[@class="title"]/text()').extract()
movieInfo = eachMovie.xpath('div[@class="bd"]/p/text()').extract()
star = eachMovie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract()
quote = eachMovie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()').extract()
四、傳值給item~
熟悉MVC的小伙伴在學習scrapy的時候都應該知道~item在這里就相當於MVC里面的Model。
item['title'] = title
item['movieInfo'] = ';'.join(movieInfo)
item['star'] = star
item['quote'] = quote
五、翻頁~
抓取下一頁href的url,遞歸調用Request
nextLink = selector.xpath('//span[@class="next"]/link/@href').extract()
if nextLink:
nextLink = nextLink[0]
print(nextLink)
yield Request(self.url + nextLink,callback=self.parse)
Ok~數據抓取下來了,現在考慮一個問題~保存~
本博客主要講解的是mongodb和scrapy配合使用~下面看看代碼怎么寫的吧~
首先在setting里面作配置~
設置傳輸的管道~為什么是管道叻~筆者英語不咋滴~喜歡這么翻譯pipeline~
ITEM_PIPELINES = ['DouBanSpider.pipelines.DoubanspiderPipeline']
設置mongodb地址~
MONGODB_HOST = '127.0.0.1'
設置端口號~也就是port~默認為27017~
MONGODB_PORT = 27017
設置數據庫名字~
MONGODB_DBNAME = 'DouBan'
設置存放本次數據的表名~
MONGODB_DOCNAME = 'DouBanDy'
OK~配置好setting后再配置Pipeline吧~
我們借助pymongo這個模塊來配置Pipeline吧~導入pymongo模塊后~
只做關鍵兩步講解~
鏈接數據庫~
client = pymongo.MongoClient(host=host,port=port)
指向數據庫里面要存放數據的表名~
tdb = client[dbName]
向指定的表里添加數據~兩句關鍵代碼~
self.post = tdb[settings['MONGODB_DOCNAME']]
self.post.insert(dyInfo)
好吧~看看效果吧~
爬蟲啟動~
開始爬取~
再看看數據庫~
最后對mongodb的使用做個簡單的介紹~
mongodb屬於非關系型數據庫~是一個基於分布式文件存儲的數據庫。由C++語言編寫。。。好吧~這些廢話我不在這里說了~自己百度百科吧~我寫博客寫你能在其他地方都能找到的理論性的知識~簡單的說說使用mongodb的安裝和使用吧~
mongodb的安裝~
網上有一大把一大把mongodb的安裝教程~自己搜索去吧~筆者是通過brew安裝的mongodb,因為筆者使用的Mac,嘗試過很多種安裝mongodb的方法都未成功~最后,嘗試了brew安裝成功~如果讀者使用的是Mac,請嘗試嘗試brew安裝吧~
啟動mongodb服務~
在控制台輸入 mongod
,這個指令是啟動mongod的服務,當出現下圖,表示成功~
啟動mongodb數據庫~
啟動mongodb服務后重新打開一個新的控制台窗口~啟動mongodb數據庫~在新的控制台窗口輸入mongo
,這時候會出現下面的界面~表示成功~
使用Robmongo管理數據庫~
在Mac上最好用的就是Robmongo把~界面還行~基本的功能也有~
創建mongodb的鏈接~
創建成功后就可以用上文中的小爬蟲對mongodb添加數據了~
小爬蟲使用小提示~
- scrapy crawl YourSpiderName,,最后加的是爬蟲name,而不是項目名字~
- 需要的環境自己配置,跑不起來報錯,請百度,爬蟲筆者已經親測,可以跑~
- 本爬蟲沒有設置代理,因為用於學習交流吧~
- 本爬蟲已經更改請求頭里的USER_AGENT,請改為自己的吧
- 最后項目已經上傳到github,github源代碼地址https://github.com/Erma-Wang/Spider(注意,本倉庫還有其他的小爬蟲,本文章講解的是JDSpider···),別忘了給個star哦@、@
- 還要了解更多的小爬蟲的朋友們可以關注本博,並在本博的spider中找到其他的小爬蟲,筆者會定時更新小爬蟲的~