爬取豆瓣書籍

豆瓣讀書“編程”類目下顯示有16.1萬(wàn)本書祝辣,但是一頁(yè)一頁(yè)去翻,只能翻到第50頁(yè)瓦灶。再往后就沒有數(shù)據(jù)了....所以這里只爬了前50頁(yè)的數(shù)據(jù)奶陈。

下面的代碼在python3中執(zhí)行有效。

目的:獲取前50頁(yè)每本書的名字蔚舀,ID饵沧,封面圖內(nèi)容簡(jiǎn)介赌躺,并保存到數(shù)據(jù)庫(kù)中狼牺。

1. 思路

先打開圖書頁(yè)面,可以看到每頁(yè)展示20本書礼患。
然后再看一下頁(yè)面的URL是钥,https://book.douban.com/tag/編程?start=0&type=T
關(guān)注一下里面的兩個(gè)參數(shù)starttype缅叠。
當(dāng)頁(yè)面是第一頁(yè)的時(shí)候悄泥,start=0,在第二頁(yè)的時(shí)候肤粱,start=20弹囚。所以這個(gè)參數(shù)的規(guī)律就是20*第幾頁(yè)。
參數(shù)type领曼,表示的應(yīng)該就是當(dāng)前的圖書分類鸥鹉。

知道了URL的規(guī)律之后,一種比較簡(jiǎn)單的思路就是:先進(jìn)入第一頁(yè)悯森,獲取當(dāng)前頁(yè)面20本書的鏈接宋舷,之后循環(huán)獲取每本書的詳細(xì)信息绪撵。然后再跳轉(zhuǎn)到第二頁(yè)瓢姻,繼續(xù)上面的動(dòng)作。直到結(jié)束(第50頁(yè))音诈。

2. 實(shí)現(xiàn)過(guò)程

1) 項(xiàng)目依賴

pymysql: 用來(lái)操作數(shù)據(jù)庫(kù)
requests:發(fā)送請(qǐng)求幻碱,并獲取頁(yè)面源代碼
pyquery:操作dom绎狭,獲取dom的值。類似jquery

2)代碼

額褥傍,打字好累儡嘶,直接粘貼代碼吧。恍风。蹦狂。。朋贬。

# 抓取豆瓣讀書某個(gè)分類下的全部書籍簡(jiǎn)介
import pymysql
import requests
import time
from pyquery import PyQuery as pq


# 分類的第一頁(yè)凯楔,程序開始的起點(diǎn)
page = 1
type = 'T' # 用來(lái)標(biāo)識(shí)書籍類型
urlArr = [0 for i in range(20)] # 存放當(dāng)前頁(yè)面的20條書本鏈接
bookIDSql = []

# 鏈接數(shù)據(jù)庫(kù)
# 這里的urer/password/bd,需要對(duì)應(yīng)替換成你自己的锦募,prot默認(rèn)是3306就可以了
db = pymysql.connect(host="localhost", user="root", password="123456", port=3306, db="mydatabase") 
cursor = db.cursor()
cursor.execute("SELECT bookID FROM doubanBooksInfo")
data = cursor.fetchall()

# 獲取數(shù)據(jù)庫(kù)中現(xiàn)有的bookID
for item in data:
    bookIDSql.append(item[0])
print("已經(jīng)存在的bookID:", bookIDSql)


# 獲取當(dāng)前頁(yè)面的book鏈接摆屯,并放進(jìn)數(shù)組urlArr
def getPageUrls (page, type):
    offset = 20 * (page - 1)
    url = 'https://book.douban.com/tag/編程?start=' + str(offset) + '&type=' + str(type)
    listPageReq = requests.get(url)
    resTxt = pq(listPageReq.text)
    pageUrlList = resTxt('.subject-item')
    try:
        if (pageUrlList):
            index = 0
            for item in pageUrlList:
                itempq = pq(item)
                thisUrl = itempq('.pic').find('a').attr('href')
                urlArr[index] = thisUrl
                index = index + 1
    except:
        print('報(bào)錯(cuò)了...')

# 從urlArr中依次取出鏈接,訪問頁(yè)面糠亩,獲取該頁(yè)面書籍的信息
def getBookInfo (url):
    # 如果當(dāng)前id不存在于id列表虐骑,則進(jìn)行獲取書籍信息的操作
    if (checkBookID(getBookIDFromUrl(url), bookIDSql)):
        bookPageReq = requests.get(url)
        resTxt = pq(bookPageReq.text)
        contentWrapper = resTxt('#link-report .intro').find('p')
        # 書的ID
        bookID = url.split('/')[-2]
        # 書名
        bookName = resTxt('#mainpic a').attr('title')
        # 封面圖
        bookImg = resTxt('#mainpic a').attr('href')
        # 書的簡(jiǎn)介
        bookContent = ''
        # 把多段文字拼合在一起
        for tag in contentWrapper:
            if (tag.text):
                bookContent = bookContent + tag.text
        # 插入到數(shù)據(jù)庫(kù)中
        inertDataToSql(bookID, bookName, bookImg, bookContent)

# 把非重復(fù)的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)中
def inertDataToSql (bookID, bookName, bookImg, bookContent):
    sql = "INSERT INTO doubanBooksInfo(bookID, name, img, content) values (%s, %s, %s, %s)"
    try:
        cursor.execute(sql, (bookID, bookName, bookImg, bookContent))
        db.commit()
    except:
        db.rollback()

# 檢驗(yàn)當(dāng)前的id是否存在id列表中
def checkBookID (currentID, bookIDList):
    if (currentID not in bookIDList):
        bookIDList.append(currentID)
        print('該ID尚未存在,可以進(jìn)行抓取')
        print('已經(jīng)抓取數(shù)量:', bookIDList.__len__())
        return True

# 從url中獲取當(dāng)前的bookID
def getBookIDFromUrl (url):
    currentID = url.split('/')[-2]
    return currentID

# 讓程序不斷的執(zhí)行赎线,直到第50頁(yè)
endPage = 51
while (page < endPage):
    print('目前在第:', page, '頁(yè)')
    getPageUrls(page, 'T')
    for url in urlArr:
        getBookInfo(url)
        time.sleep(2)

    page = page + 1

數(shù)據(jù)庫(kù)截圖:


數(shù)據(jù)庫(kù)字段截圖.png

——————
程序很爛廷没,希望后面會(huì)有時(shí)間優(yōu)化。垂寥。腕柜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市矫废,隨后出現(xiàn)的幾起案子盏缤,更是在濱河造成了極大的恐慌,老刑警劉巖蓖扑,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唉铜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡律杠,警方通過(guò)查閱死者的電腦和手機(jī)潭流,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柜去,“玉大人灰嫉,你說(shuō)我怎么就攤上這事∩ど荩” “怎么了讼撒?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我根盒,道長(zhǎng)钳幅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任炎滞,我火速辦了婚禮敢艰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘册赛。我一直安慰自己钠导,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布森瘪。 她就那樣靜靜地躺著辈双,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柜砾。 梳的紋絲不亂的頭發(fā)上湃望,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音痰驱,去河邊找鬼证芭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛担映,可吹牛的內(nèi)容都是我干的废士。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蝇完,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼官硝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起短蜕,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤氢架,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后朋魔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岖研,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年警检,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孙援。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扇雕,死狀恐怖拓售,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情镶奉,我是刑警寧澤础淤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布崭放,位于F島的核電站,受9級(jí)特大地震影響值骇,放射性物質(zhì)發(fā)生泄漏莹菱。R本人自食惡果不足惜移国,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一吱瘩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迹缀,春花似錦使碾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至砚蓬,卻和暖如春矢门,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灰蛙。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工祟剔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摩梧。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓物延,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親仅父。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叛薯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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

  • Always,dominators define righteousness that they just wan...
    Albatross_Bit閱讀 155評(píng)論 0 0
  • 今天在得到上聽了一小段純干貨的語(yǔ)音笙纤,有關(guān)于營(yíng)銷策略的耗溜,其中一個(gè)最常見的是追逐熱點(diǎn)。 另外的一些經(jīng)典策略有 1.懷舊...
    魚子魚閱讀 134評(píng)論 0 0
  • 我對(duì)墓志銘的理解就是省容,那是后人為紀(jì)念先祖强霎,給先祖?zhèn)兞€(gè)碑什么的,既然碑體那么大蓉冈,那就寫點(diǎn)什么吧城舞。當(dāng)然了,要寫只能寫...
    楊金社閱讀 1,142評(píng)論 3 0
  • 所有的事情到最終寞酿,都不是一定有結(jié)果的家夺。 所謂沒有結(jié)果,也是一種結(jié)果伐弹。因果性一定存在么拉馋?如果存在,那么有果必有因,有...
    霓衣風(fēng)馬閱讀 292評(píng)論 0 0
  • 在反思后再次堅(jiān)定我是誰(shuí)煌茴? 記得3月份的美樂公益課上随闺,姬老師講述了關(guān)于年前美樂升級(jí)時(shí),她經(jīng)歷了一次次與自己內(nèi)心的對(duì)話...
    生命的本色閱讀 609評(píng)論 1 8