利用scrapy爬取簡(jiǎn)書文章并保存到數(shù)據(jù)庫(kù)

這篇文章主要是介紹利用scrapy爬取簡(jiǎn)書IT專欄的文章票渠,并把爬取結(jié)果保存到數(shù)據(jù)庫(kù)中。所以實(shí)現(xiàn)這些功能的前提電腦中安裝了scrapy芬迄,MySQL數(shù)據(jù)庫(kù)问顷,和一些爬蟲的基本知識(shí)。代碼我會(huì)詳細(xì)介紹禀梳。如果有問(wèn)題也可以給我留言杜窄。

簡(jiǎn)介

scrapy

官方文檔的介紹是“Scrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架算途。 可以應(yīng)用在包括數(shù)據(jù)挖掘塞耕,信息處理或存儲(chǔ)歷史數(shù)據(jù)等一系列的程序中∽烊浚”我現(xiàn)在對(duì)它了解還不是很多扫外,知道它的功能很強(qiáng)大,但還只會(huì)做一些簡(jiǎn)單的爬取廓脆。

MySQL數(shù)據(jù)庫(kù)

MySQL是一種開放源代碼的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)筛谚,MySQL數(shù)據(jù)庫(kù)系統(tǒng)使用最常用的數(shù)據(jù)庫(kù)管理語(yǔ)言–結(jié)構(gòu)化查詢語(yǔ)言(SQL)進(jìn)行數(shù)據(jù)庫(kù)管理。

安裝方法我在這里就贅述了狞贱,網(wǎng)上有很多方法刻获。因?yàn)槲野惭bscrapy的方法不是最簡(jiǎn)單的,所以我就不介紹我的方法了;至于MySQL蝎毡,這個(gè)比較容易厚柳。安裝好直接就可以使用了。

功能實(shí)現(xiàn)

scrapy部分

我們的目的是抓取簡(jiǎn)書@IT·互聯(lián)網(wǎng)專題沐兵,網(wǎng)址是:

http://www.reibang.com/c/V2CqjW

這個(gè)網(wǎng)址的確可以抓取到內(nèi)容别垮,但只是極少部分,在瀏覽的過(guò)程中還會(huì)繼續(xù)加載內(nèi)容扎谎,所以這個(gè)網(wǎng)址是不對(duì)的碳想。我們必須獲取它的真實(shí)網(wǎng)址才行。這就用到了抓包毁靶。

通過(guò)抓包我們獲取到的真實(shí)網(wǎng)址是:

http://www.reibang.com/c/V2CqjW?order_by=commented_at&page=1

應(yīng)該已經(jīng)注意到了胧奔,真正有用的是page,我們?cè)谧ト〉臅r(shí)候只要改變頁(yè)數(shù)就能實(shí)現(xiàn)多頁(yè)抓取预吆。

按下win+R龙填,輸入cmd運(yùn)行終端,輸入scrapy startproject jianshu等待scrapy自動(dòng)生成文件拐叉,在jianshu->jianshu->spiders文件夾下創(chuàng)建jianshuspider.py文件岩遗。

jianshuspider.py代碼部分:

from scrapy.spider import Spider
from jianshu.items import JianshuItem
class JianshuSpider(Spider):
    name = 'jianshu'
    box = []
    for num in range(120):
        pages = 'http://www.reibang.com/c/V2CqjW?order_by=commented_at&page={0}'.format(num)
        box.append(pages)
    start_urls = box
    def parse(self, response):
        item = JianshuItem()
        articles = response.xpath("http://ul[@class='note-list']/li")
        for article in articles:
            item['author'] = article.xpath('.//div[@class="name"]/a/text()').extract()[0]
            item['title'] = article.xpath('.//div[@class="content"]/a/text()').extract()[0]
            item['times'] = article.xpath('.//div[@class="name"]/span/@data-shared-at').extract()[0]
            url = article.xpath('.//div[@class="content"]/a/@href').extract()[0]
            item['url'] = 'http://www.reibang.com' + url
            admire = article.xpath('.//div/div[2]/span[2]/text()').extract()
            item['admire'] = ''.join(admire)
            likes = article.xpath('.//div/div[2]/span[1]/text()').extract()
            item['likes'] = ''.join(likes)
            yield item

我來(lái)介紹一下這段代碼。

name是以后運(yùn)行爬蟲的名字凤瘦,start_urls是爬取的網(wǎng)站宿礁,是一個(gè)列表,因?yàn)槲覀円ト『芏囗?yè)蔬芥,所以我定義了一個(gè)空列表用來(lái)存放不同頁(yè)數(shù)的網(wǎng)址梆靖。parse部分可以說(shuō)就是用來(lái)把爬取到的內(nèi)容傳遞給item。我們抓取了簡(jiǎn)書文章的作者坝茎、文章標(biāo)題涤姊、創(chuàng)建的時(shí)間、文章的網(wǎng)址嗤放、贊賞和喜歡思喊。

在篩選信息的過(guò)程中用到了xpath,其實(shí)只要多看看別人的代碼次酌,自己研究研究恨课,很好理解的。jianshuspider.py這部分代碼篩選出需要的結(jié)果后岳服,我們就開始寫items.py剂公。

items.py代碼部分:

import scrapy
class JianshuItem(scrapy.Item):
    title = scrapy.Field()
    author = scrapy.Field()
    times = scrapy.Field()
    url = scrapy.Field()
    admire = scrapy.Field()
    likes = scrapy.Field()

這部分代碼就是對(duì)應(yīng)的要抓取的內(nèi)容。很好理解吊宋。正常情況下纲辽,在jianshu的文件夾下運(yùn)行命令提示符,輸入scrapy crawl jianshu
就可以看到運(yùn)行結(jié)果了。因?yàn)槲覀円4娴綌?shù)據(jù)庫(kù)拖吼,所以還得繼續(xù)完成代碼鳞上。

MySQL部分

這部分用到了數(shù)據(jù)庫(kù)的知識(shí),安裝好數(shù)據(jù)庫(kù)以后吊档,在數(shù)據(jù)庫(kù)的終端登錄以后篙议,輸入CREATE DATABASE jianshu;,然后輸入U(xiǎn)SE jianshu;怠硼,在使用jianshu數(shù)據(jù)庫(kù)后鬼贱,所有的操作就都在這個(gè)數(shù)據(jù)庫(kù)里了。在結(jié)束命令的時(shí)候一定要記得輸入“;”分號(hào)香璃。然后就是創(chuàng)建新表这难。輸入:

CREATE TABLE articles (id BIGINT(5) NOT NULL AUTO_INCREMENT, title VARCHAR(100), author VARCHAR(100), times VARCHAR(100), url VARCHAR(100), admire VARCHAR(1000), likes VARCHAR(1000))

這樣就創(chuàng)建好了表,如果輸入無(wú)誤的話輸入DESCRIBE articles;就可以查看表的數(shù)據(jù)結(jié)構(gòu)了增显。如圖:

scrapy保存到數(shù)據(jù)庫(kù)

創(chuàng)建好新表雁佳,我們就可以寫pipelines.py的代碼了。

pipelines.py代碼部分:

import pymysql
def dbHandle():
    conn = pymysql.connect(
        host = "localhost",
        user = "root",
        passwd = "root",
        charset = "utf8",
        use_unicode = False
    )
    return conn
class JianshuPipline(object):
    def process_item(self,item,spider):
        dbObject = dbHandle()
        cursor = dbObject.cursor()
        cursor.execute("USE jianshu")
        sql = "INSERT INTO articals(author,title,times,url,admire,likes) VALUES(%s,%s,%s,%s,%s,%s)"
        try:
            cursor.execute(sql,(item['author'],item['title'],item['times'],item['url'],item['admire'],item['like']))
            cursor.connection.commit()
        except BaseException as e:
            print("錯(cuò)誤在這里>>>>>>>>>>>>>",e,"<<<<<<<<<<<<<錯(cuò)誤在這里")
            dbObject.rollback()
        return item

代碼分為兩部分同云,第一部分用來(lái)連接數(shù)據(jù)庫(kù),第二部分用來(lái)用來(lái)向數(shù)據(jù)庫(kù)傳入數(shù)據(jù)堵腹。

如果這段代碼不是太明白可以先看這部分代碼炸站,Python操作數(shù)據(jù)庫(kù)的代碼:

#導(dǎo)入pymysql模塊
import pymysql
#連接數(shù)據(jù)庫(kù)
conn = pymysql.connect(host='127.0.0.1', user='root', passwd='root', db='music')
cur = conn.cursor()
#輸入使用數(shù)據(jù)庫(kù)和查詢信息的命令,操作類似在cmd中的輸入
cur.execute("USE music")
#插入數(shù)據(jù)(pages是數(shù)據(jù)庫(kù)music下的表)
cur.execute("INSERT INTO pages(title,content) VALUES('449454051','http://m2.music.126.net/GvSlxgdwVCKelv3gFaw9pg==/18641120138988064.mp3')")
cur.connection.commit()
#更新數(shù)據(jù)
cur.execute("SELECT * FROM pages")
print("獲取全部信息\n",cur.fetchall())
#關(guān)閉數(shù)據(jù)庫(kù)
cur.close()
conn.close()

先導(dǎo)入pymysql庫(kù)疚顷,然后定義函數(shù)旱易,用來(lái)存放數(shù)據(jù)庫(kù)信息。下邊的JianshuPipline在創(chuàng)建文件時(shí)自動(dòng)生成腿堤。我們只要添加往數(shù)據(jù)庫(kù)導(dǎo)入信息的代碼就可以了阀坏。

我們還需要改一改settings.py中的代碼,把下邊的代碼添加和修改一下就行了笆檀。

settings.py代碼:

ROBOTSTXT_OBEY = False #True 修改為 False

#添加請(qǐng)求頭
DEFAULT_REQUEST_HEADERS = {
'accept': 'image/webp,*/*;q=0.8',
'accept-language': 'zh-CN,zh;q=0.8',
'referer': 'http://www.reibang.com/',
'user-agent': 'Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36',
}

#連接數(shù)據(jù)庫(kù)
ITEM_PIPELINES = {
'jianshu.pipelines.JianshuPipline': 300,
}

這樣就算大功告成了忌堂。查看數(shù)據(jù)庫(kù),如圖:

總結(jié)

在迷迷糊糊看完上邊的教程之后我們總結(jié)一下酗洒。

scrapy組件的作用

Item 對(duì)象是種簡(jiǎn)單的容器士修,保存了爬取到得數(shù)據(jù)。其提供了類似于詞典(dictionary-like)的API以及用于聲明可用字段的簡(jiǎn)單語(yǔ)法樱衷。

Spider 類定義了如何爬取某個(gè)(或某些)網(wǎng)站棋嘲。包括了爬取的動(dòng)作(例如:是否跟進(jìn)鏈接)以及如何從網(wǎng)頁(yè)的內(nèi)容中提取結(jié)構(gòu)化數(shù)據(jù)(爬取 item)。換句話說(shuō)矩桂,Spider 就是您定義爬取的動(dòng)作及分析某個(gè)網(wǎng)頁(yè)(或者是有些網(wǎng)頁(yè))的地方沸移。

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

詳情查看官方文檔:http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/install.html

數(shù)據(jù)庫(kù)

在創(chuàng)建數(shù)據(jù)庫(kù)和新表的過(guò)程中一定要仔細(xì)流妻,避免錯(cuò)輸和漏輸,在出現(xiàn)問(wèn)題的時(shí)候一定要認(rèn)真閱讀提示的錯(cuò)誤信息笆制。如果字太小的話可以這么設(shè)置绅这。我電腦的操作系統(tǒng)是Win10。如圖:

把字體調(diào)的大一點(diǎn)看起來(lái)就輕松許多在辆。數(shù)據(jù)庫(kù)命令如果不是很懂可以自行查閱資料证薇,因?yàn)槲乙苍趯W(xué)習(xí)中,先不介紹了太多匆篓。

與本文相關(guān)的鏈接

1.http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/install.html
2.https://www.mysql.com/
3.http://www.reibang.com/c/V2CqjW
4.格外感謝這篇教程浑度,受此啟發(fā):Scrapy入門教程之寫入數(shù)據(jù)庫(kù)

如果在操作過(guò)程中遇到問(wèn)題歡迎留言,也可查看:https://alpha87.github.io/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸦概,一起剝皮案震驚了整個(gè)濱河市箩张,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窗市,老刑警劉巖先慷,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異咨察,居然都是意外死亡论熙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門摄狱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)脓诡,“玉大人,你說(shuō)我怎么就攤上這事媒役∽Q瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵酣衷,是天一觀的道長(zhǎng)交惯。 經(jīng)常有香客問(wèn)我,道長(zhǎng)鸥诽,這世上最難降的妖魔是什么商玫? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮牡借,結(jié)果婚禮上拳昌,老公的妹妹穿的比我還像新娘。我一直安慰自己钠龙,他們只是感情好炬藤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布御铃。 她就那樣靜靜地躺著,像睡著了一般沈矿。 火紅的嫁衣襯著肌膚如雪上真。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天羹膳,我揣著相機(jī)與錄音睡互,去河邊找鬼。 笑死陵像,一個(gè)胖子當(dāng)著我的面吹牛就珠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播醒颖,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妻怎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了泞歉?” 一聲冷哼從身側(cè)響起逼侦,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腰耙,沒想到半個(gè)月后榛丢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沟优,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年涕滋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挠阁。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡账劲,死狀恐怖呻引,靈堂內(nèi)的尸體忽然破棺而出馆纳,到底是詐尸還是另有隱情唱捣,我是刑警寧澤较剃,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布上渴,位于F島的核電站蝉稳,受9級(jí)特大地震影響破婆,放射性物質(zhì)發(fā)生泄漏啄巧。R本人自食惡果不足惜寻歧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秩仆。 院中可真熱鬧码泛,春花似錦、人聲如沸澄耍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至痢站,卻和暖如春磷箕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阵难。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工岳枷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呜叫。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓空繁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親怀偷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子家厌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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