scrapy筆記(2) - 小試牛刀 (抓取豆瓣推理小說(shuō)信息)

1. 事前準(zhǔn)備:

  • 閱讀[scrapy官方文檔] [scrapy doc]至少一次
  • 了解scrapy的基本命令及弄懂scrapy文檔中例子的項(xiàng)目結(jié)構(gòu)等基本信息
    下文將假設(shè)大家已經(jīng)有了以上準(zhǔn)備墩划, 對(duì)一些細(xì)節(jié)不會(huì)詳細(xì)闡述拇厢, 如有不懂可以先翻翻文檔或留言詢問(wèn)
  • 下載本例子源碼(文章末尾)

2. 豆瓣頁(yè)面分析

我們準(zhǔn)備'下手'的是豆瓣推理小說(shuō)的數(shù)據(jù)德挣,截圖如下


小說(shuō)數(shù)據(jù)

目前(2015-4-16)豆瓣共有629頁(yè)的推理小說(shuō)悄晃, 每頁(yè)有15本書锈至,一共9000多本書
我們來(lái)用chrome審查元素功能看看


審查元素

scrapy爬取的是html網(wǎng)頁(yè)源代碼隧膏,審查元素看的是經(jīng)過(guò)js處理后的頁(yè)面斗幼,有些html頁(yè)是由js輸出的愚战,有些會(huì)與html網(wǎng)頁(yè)源代碼不一樣盯串,這里豆瓣的書籍信息不是經(jīng)過(guò)js輸出的氯檐,所以可以放心這樣干

稍加分析,并可以知道這些書都放在一個(gè)class='mod book-list'的div內(nèi)体捏,在這個(gè)div內(nèi)分別用dl, dt這樣的標(biāo)簽裝載書籍的信息冠摄, 在寫爬蟲的時(shí)候我們可以直接用xpath,或css取出這些信息的標(biāo)簽.

3.開始寫爬蟲

首先執(zhí)行兩個(gè)命令
scrapy startproject db_spider
在創(chuàng)建的目錄下,即xxx/db_pisder/下執(zhí)行
scrapy genspider -t crawl douban douban.com
現(xiàn)在的項(xiàng)目目錄結(jié)構(gòu)如下圖所示

項(xiàng)目目錄

關(guān)于scrapy的這幾個(gè)文件是什么意思我就不詳細(xì)介紹了,相信看過(guò)文檔的人應(yīng)該也有所了解译打。
接下來(lái)我們?cè)趇tems.py里定義我們的數(shù)據(jù)對(duì)象
items項(xiàng)

要抓取的東西如圖所示耗拓,按照從上到下,從左到右分別在items.py里定義為如下字段
items.png

接下來(lái)奏司, 我們要在spiders/douban.py寫關(guān)于爬蟲的東西

DoubanSpider

這些配置的意思是乔询,從http://www.douban.com/tag/推理/book?start=0 這個(gè)頁(yè)面開始, 遇到域名為douban.com且符合'start=\d+$'的鏈接則調(diào)用parse_item解析頁(yè)面并跟進(jìn)這個(gè)鏈接查找是否有符合規(guī)則的鏈接韵洋。
接下來(lái)我們要寫parse_item函數(shù),在分析頁(yè)面的時(shí)候竿刁,我們已經(jīng)確定要爬取哪些信息』拼福現(xiàn)在在parse_item里寫的就是從頁(yè)面里獲取這些信息, 并存在items中食拜。
我們可以先在db_spider目錄下執(zhí)行scrapy shell http://www.douban.com/tag/推理/book?start=0
會(huì)得到一個(gè)用于調(diào)試的命令行鸵熟, 如下所示:

scrapy shell url

我們可以用view(response)在瀏覽器中打開這個(gè)鏈接,這個(gè)鏈接看到的頁(yè)面就是爬蟲看到的頁(yè)面了负甸,之前說(shuō)過(guò)了流强,用js輸出的頁(yè)面跟爬蟲看到的頁(yè)面有時(shí)會(huì)不一樣,在爬取時(shí)可能看不到我們要的信息呻待,在爬復(fù)雜的網(wǎng)站時(shí)要注意打月。
然后我們可以在這個(gè)命令行內(nèi),對(duì)response進(jìn)行xpath,css操作得到標(biāo)簽蚕捉,比如說(shuō)我們要得到小說(shuō)數(shù)據(jù)圖中的白夜叉這個(gè)書名,我們可以根據(jù)chrome的審查元素右鍵的copy xpath或copy css path功能得到標(biāo)簽的路徑
copy xpath.png

我們得到的路徑可能是這樣的:

XPath

構(gòu)造了一個(gè)之后奏篙,其它就簡(jiǎn)單了, 這里直接給出所有項(xiàng)的代碼迫淹, 如果覺(jué)得xpath和css有困難的話秘通,建議再看一下scrapy文檔里的例子及xpath和css的文檔。

def parse_item(self, response):
    items = []
    book_list = response.css('div.mod.book-list dl')
    for book in book_list:
        item = DbSpiderItem()
        try:
            item['book_name'] = book.xpath('dd/a/text()').extract()[0]
            item['book_star'] = book.xpath('dd/div[1]/span[1]/@class').extract()[0][7:]
            item['book_rating'] = book.xpath('dd/div[1]/span[2]/text()').extract()[0]
            item['book_eval'] = book.xpath('dd/div[1]/span[3]/text()').extract()[0]
            desc = book.xpath('dd/div[2]/text()').extract()[0].strip().split('/')
            item['book_price'] = desc.pop()
            item['book_publish_date'] = desc.pop()
            item['book_publish'] = desc.pop()
            item['book_author'] = '/'.join(desc)
        except:
            pass
        items.append(item)
    return items

這里注意一下代碼里的try,except塊, 這是為了豆瓣的書數(shù)據(jù)的特殊處理敛熬,因?yàn)槎拱陼臄?shù)據(jù)格式并不是全部都一致肺稀,有那么幾本沒(méi)有出版社或者沒(méi)有出版日期,甚至沒(méi)有評(píng)分荸型。如下圖盹靴,我們忽略這些個(gè)例就行了炸茧。

個(gè)例

到此,我們的爬蟲就寫完了瑞妇,我們還需要設(shè)置一下settings里的DOWNLOAD_DELAY=2,這很重要,因?yàn)槿绻麩o(wú)間隔的去爬梭冠,很快會(huì)被豆瓣ban掉的辕狰。
一切準(zhǔn)備完畢,我們可以試一下scrapy crawl douban -o book_data.json來(lái)爬取數(shù)據(jù)并轉(zhuǎn)化成json格式控漠。
爬蟲孜孜不倦地開始爬數(shù)據(jù)了, 但我們要爬取的只有629頁(yè)蔓倍, 630頁(yè)之后的書都沒(méi)有了,爬蟲卻停不下來(lái)盐捷。怎么辦偶翅?除了用ctrl+c(兩次)強(qiáng)制停止外,我們可以在Rule里面把正則式改成這樣

rule

最多匹配到999頁(yè)了碉渡,如果還是覺(jué)得不爽聚谁,可以查查scrapy的CloseSpider異常,拋出該異持团担可以暫停/停止爬蟲形导。

最終我們爬取的部分?jǐn)?shù)據(jù)如下环疼,

book_data.json

把json改成{'Record': [{book_data1,book_data2}]}的形式,可以用導(dǎo)入工具(Navicat Premium)導(dǎo)入數(shù)據(jù)庫(kù)中朵耕,當(dāng)然炫隶,你也可以自己寫個(gè)插入語(yǔ)句放入數(shù)據(jù)庫(kù)。


4.總結(jié)

本篇文章到此結(jié)束阎曹, 其實(shí)也就相當(dāng)于scrapy官方文檔的例子的擴(kuò)展伪阶,只是比那個(gè)例子更結(jié)合實(shí)際一點(diǎn),沒(méi)有講什么特別的東西处嫌,我們可以發(fā)現(xiàn)望门,用scrapy定制這個(gè)簡(jiǎn)易爬蟲,其實(shí)不過(guò)100行的代碼锰霜,還是十分的簡(jiǎn)單易用的筹误。


例子源碼請(qǐng)戳:git源碼
[scrapy doc]: http://scrapy-chs.readthedocs.org/zh_CN/latest/index.html "scrapy官方中文文檔"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市癣缅,隨后出現(xiàn)的幾起案子厨剪,更是在濱河造成了極大的恐慌,老刑警劉巖友存,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祷膳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屡立,警方通過(guò)查閱死者的電腦和手機(jī)直晨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)膨俐,“玉大人勇皇,你說(shuō)我怎么就攤上這事》俅蹋” “怎么了敛摘?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵枚抵,是天一觀的道長(zhǎng)略贮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)苫昌,這世上最難降的妖魔是什么蔓姚? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任捕虽,我火速辦了婚禮,結(jié)果婚禮上坡脐,老公的妹妹穿的比我還像新娘泄私。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布挖滤。 她就那樣靜靜地躺著崩溪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斩松。 梳的紋絲不亂的頭發(fā)上伶唯,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音惧盹,去河邊找鬼乳幸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钧椰,可吹牛的內(nèi)容都是我干的粹断。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼嫡霞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瓶埋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起诊沪,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤养筒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后端姚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晕粪,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年渐裸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巫湘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昏鹃,死狀恐怖尚氛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盆顾,我是刑警寧澤怠褐,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布畏梆,位于F島的核電站您宪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奠涌。R本人自食惡果不足惜宪巨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溜畅。 院中可真熱鬧捏卓,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蒜田,卻和暖如春稿械,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冲粤。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工美莫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梯捕。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓厢呵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親傀顾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子襟铭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 序言第1章 Scrapy介紹第2章 理解HTML和XPath第3章 爬蟲基礎(chǔ)第4章 從Scrapy到移動(dòng)應(yīng)用第5章...
    SeanCheney閱讀 15,078評(píng)論 13 61
  • 本文分享的大體框架包含以下三部分 (1)首先介紹html網(wǎng)頁(yè),用來(lái)解析html網(wǎng)頁(yè)的工具xpath(2)介紹pyt...
    不忘初心c閱讀 2,555評(píng)論 0 14
  • 這兩天摸索了下scrapy短曾,剛看文檔的時(shí)候覺(jué)得有點(diǎn)生無(wú)可戀蝌矛,scrapy框架個(gè)人還是覺(jué)得比較難懂的,需要學(xué)習(xí)的地方...
    Treehl閱讀 5,635評(píng)論 7 10
  • 古詩(shī):現(xiàn)在的模式是——媽媽每日5-10分鐘的念誦错英,寶寶邊玩邊聽入撒,然后有一天她就叨叨叨順下來(lái)了。 閱讀:屎尿屁兩本《...
    星空_4508閱讀 183評(píng)論 0 0
  • 你在盆里養(yǎng)了一條魚, 有一天判哥,你對(duì)我說(shuō):魚長(zhǎng)大了献雅,我就回來(lái)了。 我信以為真塌计,瞪大眼睛一直望著它挺身。 一天,一月锌仅,一年...
    距離產(chǎn)生美閱讀 213評(píng)論 0 1