Scrapy爬取數(shù)據(jù)存入MySQL數(shù)據(jù)庫

Scrapy抓取到網(wǎng)頁數(shù)據(jù)敏储,保存到數(shù)據(jù)庫,是通過pipelines來處理的丁侄」喏ǎ看一下官方文檔的說明。

當(dāng)Item在Spider中被收集之后鸿摇,它將會(huì)被傳遞到Item Pipeline石景,一些組件會(huì)按照一定的順序執(zhí)行對(duì)Item的處理。

以下是item pipeline的一些典型應(yīng)用:

  • 清理HTML數(shù)據(jù)
  • 驗(yàn)證爬取的數(shù)據(jù)(檢查item包含某些字段)
  • 查重(并丟棄)
  • 將爬取結(jié)果保存到數(shù)據(jù)庫中

一、解析頁面數(shù)據(jù) Spider類

本文以簡書《讀書》專題為例潮孽,抓取專題收錄的所有文章數(shù)據(jù)揪荣,http://www.reibang.com/collection/yD9GAd
把需要爬取的頁面數(shù)據(jù)解析出來,封裝成對(duì)象Item往史,提交(yield)变逃。


            item = JsArticleItem()

            author = info.xpath('p/a/text()').extract()
            pubday = info.xpath('p/span/@data-shared-at').extract()
            author_url = info.xpath('p/a/@href').extract()
            title = info.xpath('h4/a/text()').extract()
            url = info.xpath('h4/a/@href').extract()
            reads = info.xpath('div/a[1]/text()').extract()
            reads = filter(str.isdigit, str(reads[0]))

            comments = info.xpath('div/a[2]/text()').extract()
            comments = filter(str.isdigit, str(comments[0]))

            likes = info.xpath('div/span[1]/text()').extract()
            likes = filter(str.isdigit,str(likes[0]))

            rewards = info.xpath('div/span[2]/text()')
            ## 判斷文章有無打賞數(shù)據(jù)
            if len(rewards)==1 :
                rds = info.xpath('div/span[2]/text()').extract()
                rds = int(filter(str.isdigit,str(rds[0])))
            else:
                rds = 0

            item['author'] = author
            item['url'] = 'http://www.reibang.com'+url[0]
            item['reads'] = reads
            item['title'] = title
            item['comments'] = comments
            item['likes'] = likes
            item['rewards'] = rds
            item['pubday'] = pubday

            yield item

定義好的Item類,在items.py中

class JsArticleItem(Item):

    author = Field()
    url = Field()
    title = Field()
    reads = Field()
    comments = Field()
    likes = Field()
    rewards = Field()
    pubday = Field()

二怠堪、pipelines.py中定義一個(gè)類揽乱,操作數(shù)據(jù)庫

class WebcrawlerScrapyPipeline(object):
    '''保存到數(shù)據(jù)庫中對(duì)應(yīng)的class
       1、在settings.py文件中配置
       2粟矿、在自己實(shí)現(xiàn)的爬蟲類中yield item,會(huì)自動(dòng)執(zhí)行'''

    def __init__(self, dbpool):
        self.dbpool = dbpool

    @classmethod
    def from_settings(cls, settings):
        '''1凰棉、@classmethod聲明一個(gè)類方法,而對(duì)于平常我們見到的叫做實(shí)例方法陌粹。
           2撒犀、類方法的第一個(gè)參數(shù)cls(class的縮寫,指這個(gè)類本身)掏秩,而實(shí)例方法的第一個(gè)參數(shù)是self或舞,表示該類的一個(gè)實(shí)例
           3、可以通過類來調(diào)用蒙幻,就像C.f()映凳,相當(dāng)于java中的靜態(tài)方法'''
        #讀取settings中配置的數(shù)據(jù)庫參數(shù)
        dbparams = dict(
            host=settings['MYSQL_HOST'],  
            db=settings['MYSQL_DBNAME'],
            user=settings['MYSQL_USER'],
            passwd=settings['MYSQL_PASSWD'],
            charset='utf8',  # 編碼要加上,否則可能出現(xiàn)中文亂碼問題
            cursorclass=MySQLdb.cursors.DictCursor,
            use_unicode=False,
        )
        dbpool = adbapi.ConnectionPool('MySQLdb', **dbparams)  # **表示將字典擴(kuò)展為關(guān)鍵字參數(shù),相當(dāng)于host=xxx,db=yyy....
        return cls(dbpool)  # 相當(dāng)于dbpool付給了這個(gè)類邮破,self中可以得到

    # pipeline默認(rèn)調(diào)用
    def process_item(self, item, spider):
        query = self.dbpool.runInteraction(self._conditional_insert, item)  # 調(diào)用插入的方法
        query.addErrback(self._handle_error, item, spider)  # 調(diào)用異常處理方法
        return item

    # 寫入數(shù)據(jù)庫中
    # SQL語句在這里
    def _conditional_insert(self, tx, item):
        sql = "insert into jsbooks(author,title,url,pubday,comments,likes,rewards,views) values(%s,%s,%s,%s,%s,%s,%s,%s)"
        params = (item['author'], item['title'], item['url'], item['pubday'],item['comments'],item['likes'],item['rewards'],item['reads'])
        tx.execute(sql, params)

    # 錯(cuò)誤處理方法
    def _handle_error(self, failue, item, spider):
        print failue

三诈豌、在settings.py中指定數(shù)據(jù)庫操作的類,啟用pipelines組件

ITEM_PIPELINES = {
    'jsuser.pipelines.WebcrawlerScrapyPipeline': 300,#保存到mysql數(shù)據(jù)庫
}

#Mysql數(shù)據(jù)庫的配置信息
MYSQL_HOST = '127.0.0.1'
MYSQL_DBNAME = 'testdb'         #數(shù)據(jù)庫名字抒和,請(qǐng)修改
MYSQL_USER = 'root'             #數(shù)據(jù)庫賬號(hào)矫渔,請(qǐng)修改
MYSQL_PASSWD = '1234567'         #數(shù)據(jù)庫密碼,請(qǐng)修改

MYSQL_PORT = 3306               #數(shù)據(jù)庫端口摧莽,在dbhelper中使用

其他設(shè)置庙洼,偽裝瀏覽器請(qǐng)求,設(shè)置延遲抓取镊辕,防ban

USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5'
ROBOTSTXT_OBEY=False
DOWNLOAD_DELAY = 0.25 # 250 ms of delay

運(yùn)行爬蟲油够,cmdline.execute("scrapy crawl zhanti".split()) 開始,OK!

Scrapy爬取數(shù)據(jù)存入Mongdb貌似更方便丑蛤,代碼更少叠聋,看下面文章鏈接撕阎。


我的Scrapy爬蟲框架系列文章:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末受裹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棉饶,老刑警劉巖厦章,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異照藻,居然都是意外死亡袜啃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門幸缕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來群发,“玉大人,你說我怎么就攤上這事发乔∈旒耍” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵栏尚,是天一觀的道長起愈。 經(jīng)常有香客問我,道長译仗,這世上最難降的妖魔是什么抬虽? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮纵菌,結(jié)果婚禮上阐污,老公的妹妹穿的比我還像新娘。我一直安慰自己咱圆,他們只是感情好疤剑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著闷堡,像睡著了一般隘膘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杠览,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天弯菊,我揣著相機(jī)與錄音,去河邊找鬼踱阿。 笑死管钳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的软舌。 我是一名探鬼主播才漆,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼佛点!你這毒婦竟也來了醇滥?” 一聲冷哼從身側(cè)響起黎比,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸳玩,沒想到半個(gè)月后阅虫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡不跟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年颓帝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窝革。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡购城,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虐译,到底是詐尸還是另有隱情工猜,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布菱蔬,位于F島的核電站篷帅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拴泌。R本人自食惡果不足惜魏身,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚪腐。 院中可真熱鬧箭昵,春花似錦、人聲如沸回季。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泡一。三九已至颤殴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鼻忠,已是汗流浹背涵但。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帖蔓,地道東北人矮瘟。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像塑娇,于是被迫代替她去往敵國和親澈侠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • scrapy學(xué)習(xí)筆記(有示例版) 我的博客 scrapy學(xué)習(xí)筆記1.使用scrapy1.1創(chuàng)建工程1.2創(chuàng)建爬蟲模...
    陳思煜閱讀 12,664評(píng)論 4 46
  • 這兩天摸索了下scrapy埋酬,剛看文檔的時(shí)候覺得有點(diǎn)生無可戀哨啃,scrapy框架個(gè)人還是覺得比較難懂的烧栋,需要學(xué)習(xí)的地方...
    Treehl閱讀 5,627評(píng)論 7 10
  • scrapy是python最有名的爬蟲框架之一,可以很方便的進(jìn)行web抓取棘催,并且提供了很強(qiáng)的定制型劲弦,這里記錄簡單學(xué)...
    bomo閱讀 2,093評(píng)論 1 11
  • 鼾聲四起耳标,這午覺恐怕要泡湯了醇坝。 耳鳴這個(gè)時(shí)候似乎才明顯起來。 四個(gè)字出現(xiàn)在屏幕上次坡,已徹底無法入睡呼猪。平躺在椅子上,聽...
    劈柴捌哥閱讀 238評(píng)論 1 0
  • 1砸琅、Objective-C中的內(nèi)存分布 對(duì)象類型內(nèi)存分布在堆里面宋距,是直接管理內(nèi)存。 指針類型分布在棧里面系統(tǒng)幫我們...
    dispath_once閱讀 223評(píng)論 0 0