Python爬蟲入門 | 4 爬取豆瓣TOP250圖書信息

先來看看頁面長(zhǎng)啥樣的:https://book.douban.com/top250

我們將要爬取哪些信息:書名漱挚、鏈接笙纤、評(píng)分岸军、一句話評(píng)價(jià)……

1. 爬取單個(gè)信息

我們先來嘗試爬取書名脆粥,利用之前的套路喝滞,還是先復(fù)制書名的xpath:

得到第一本書《追風(fēng)箏的人》的書名xpath如下:

//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a

得到xpath猴誊,我們就可以按照之前的方法來嘗試一下:

返回的竟然是空值潦刃,這就很尷尬了。

這里需要注意懈叹,瀏覽器復(fù)制的 xpath 信息并不是完全可靠的乖杠,瀏覽器經(jīng)常會(huì)自己在里面增加多余的 tbody 標(biāo)簽,我們需要手動(dòng)把這些標(biāo)簽刪掉澄成。

修改 xpath 后再來嘗試胧洒,結(jié)果如下:

切記:瀏覽器復(fù)制 xpath 不是完全可靠畏吓,看到 tbody 標(biāo)簽特別要注意。

分別復(fù)制《追風(fēng)箏的人》卫漫、《小王子》菲饼、《圍城》、《解憂雜貨店》的 xpath 信息進(jìn)行對(duì)比:

//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a//*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div[1]/a//*[@id="content"]/div/div[1]/div/table[3]/tbody/tr/td[2]/div[1]/a//*[@id="content"]/div/div[1]/div/table[4]/tbody/tr/td[2]/div[1]/a

比較可以發(fā)現(xiàn)書名的 xpath 信息僅僅 table 后的序號(hào)不一樣列赎,并且跟書的序號(hào)一致宏悦,于是去掉序號(hào)(去掉 tbody),我們可以得到通用的 xpath 信息:

//*[@id=“content”]/div/div[1]/div/table/tr/td[2]/div[1]/a

好了包吝,我們?cè)囋嚢堰@一頁全部書名爬下來:

2.爬取多個(gè)信息

分別復(fù)制《追風(fēng)箏的人》肛根、《小王子》、《圍城》漏策、《解憂雜貨店》評(píng)分的 xpath 信息進(jìn)行對(duì)比:

//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[2]/span[2]//*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div[2]/span[2]//*[@id="content"]/div/div[1]/div/table[3]/tbody/tr/td[2]/div[2]/span[2]//*[@id="content"]/div/div[1]/div/table[4]/tbody/tr/td[2]/div[2]/span[2]

相信你已經(jīng)可以秒寫出爬取全部評(píng)分的xpath了:

//*[@id=“content”]/div/div[1]/div/table/tr/td[2]/div[2]/span[2]

把評(píng)分的xpath放入之前的代碼,運(yùn)行:

現(xiàn)在我們?cè)侔褧驮u(píng)分同時(shí)爬取下來:

這里我們默認(rèn)書名和評(píng)分爬到的都是完全的臼氨、正確的信息掺喻,這種默認(rèn)一般情況沒問題,但其實(shí)是有缺陷的储矩,如果我們某一項(xiàng)少爬或多爬了信息感耙,那么兩種數(shù)據(jù)的量就不一樣了,從而匹配錯(cuò)誤持隧。比如下面的例子:

書名xpath 后的@title 改為 text()即硼,獲取的文本數(shù)量與評(píng)分?jǐn)?shù)量不一致,出現(xiàn)匹配錯(cuò)位屡拨。

如果我們以每本書為單位只酥,分別取獲取對(duì)應(yīng)的信息,那肯定完全匹配呀狼。

書名的標(biāo)簽肯定在這本書的框架內(nèi)裂允,于是我們從書名的標(biāo)簽向上找,發(fā)現(xiàn)覆蓋整本書的標(biāo)簽(左邊網(wǎng)頁會(huì)有代碼包含內(nèi)容的信息)哥艇,把xpath 信息復(fù)制下來:

//*[@id="content"]/div/div[1]/div/table[1]

我們將整本書和書名的xpath進(jìn)行對(duì)比

//*[@id=“content”]/div/div[1]/div/table[1]? #整本書//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a? #書名//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[2]/span[2]? #評(píng)分

不難發(fā)現(xiàn)绝编,書名和評(píng)分 xpath 的前半部分和整本書的 xpath 一致的,

那我們可以通過這樣寫 xpath 的方式來定位信息:

file=s.xpath(“//*[@id=“content”]/div/div[1]/div/table[1]”)title =div.xpath(“./tr/td[2]/div[1]/a/@title”)score=div.xpath(“./tr/td[2]/div[2]/span[2]/text()”)

在實(shí)際的代碼中來看一下:

剛剛我們爬了一本書的信息貌踏,那如何爬這個(gè)頁面所有書呢十饥?很簡(jiǎn)單啊,把 xpath 中后面定位的序號(hào)去掉就ok祖乳。

終于看到廬山真面目了逗堵,不過,等等~

title = div.xpath("./tr/td[2]/div[1]/a/@title")[0]score=div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0]

為什么這兩行后面多了個(gè) [0] 呢眷昆?我們之前爬出來的數(shù)據(jù)是列表,外面帶個(gè)方框砸捏,看著非常難受,列表只有一個(gè)值谬运,對(duì)其取第一個(gè)值就OK。如果不熟悉列表的知識(shí)垦藏,可以回去補(bǔ)補(bǔ)梆暖。

接下來就是按照這樣的方式多爬幾個(gè)元素啦!

有一個(gè)點(diǎn)需要注意的是:

num=div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")")

這行代碼用了幾個(gè) strip() 方法掂骏,()里面表示要?jiǎng)h除的內(nèi)容轰驳,strip(“(”) 表示刪除括號(hào), strip() 表示刪除空白符弟灼。

嗯级解,已經(jīng)把一個(gè)頁面搞定了,接下來需要田绑,把所有頁面的信息都爬下來勤哗。

3.翻頁,爬取所有頁面信息

先來看一下翻頁后url是如何變化的:

https://book.douban.com/top250?start=0? ? #第一頁https://book.douban.com/top250?start=25? #第二頁https://book.douban.com/top250?start=50? #第三頁

url 變化的規(guī)律很簡(jiǎn)單掩驱,只是 start=() 的數(shù)字不一樣而已芒划,而且是以每頁25為單位,遞增25欧穴,這不正是每頁的書籍的數(shù)量嗎民逼?于是,我們只需要寫一個(gè)循環(huán)就可以了啊涮帘。

for a in range(10):? url = 'https://book.douban.com/top250?start={}'.format(a*25)? #總共10個(gè)頁面拼苍,用 a*25 保證以25為單位遞增

這里要強(qiáng)調(diào)一下 Python range() 函數(shù)

基本語法:range(start, stop, step)

start:計(jì)數(shù)從 start 開始。默認(rèn)是從 0 開始调缨。例如 range(5) 等價(jià)于range(0,5);

end:計(jì)數(shù)到 end 結(jié)束疮鲫,但不包括 end。例如:range(0,5)是 [0,1,2,3,4] 沒有5

step:步長(zhǎng)弦叶,默認(rèn)為1棚点。例如:range(0,5) 等價(jià)于 range(0,5,1)

>>>range(10)? ? #從 0 開始到 10 (不包含)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(1, 11)? ? #從 1 開始到 11 (不包含)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> range(0, 30, 5)? ? #從0到30(不包含),步長(zhǎng)為5 [0, 5, 10, 15, 20, 25]

加上循環(huán)之后湾蔓,完整代碼如下:

from lxml import etreeimport requestsimport timefor a in range(10):? ? url = 'https://book.douban.com/top250?start={}'.format(a*25)? ? data = requests.get(url).text? ? s=etree.HTML(data)? ? file=s.xpath('//*[@id="content"]/div/div[1]/div/table')? ? time.sleep(3)? ? for div in file:? ? ? ? title = div.xpath("./tr/td[2]/div[1]/a/@title")[0]? ? ? ? href = div.xpath("./tr/td[2]/div[1]/a/@href")[0]? ? ? ? score=div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0]? ? ? ? num=div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")").strip()? ? ? ? scrible=div.xpath("./tr/td[2]/p[2]/span/text()")? ? ? ? if len(scrible) > 0:? ? ? ? ? ? print("{},{},{},{},{}\n".format(title,href,score,num,scrible[0]))? ? ? ? else:? ? ? ? ? ? print("{},{},{},{}\n".format(title,href,score,num))

來運(yùn)行一下:

請(qǐng)務(wù)必要自己練習(xí)幾遍瘫析,你覺得自己看懂了,還是會(huì)出錯(cuò)默责,不信我們賭五毛錢贬循。

Python 的基礎(chǔ)語法很重要,沒事的時(shí)候多去看看:字符串桃序、列表杖虾、字典、元組媒熊、條件語句奇适、循環(huán)語句……

編程最重要的是實(shí)戰(zhàn)坟比,比如你已經(jīng)能夠爬TOP250的圖書了,去試試TOP250電影呢嚷往。

好了葛账,這節(jié)課就到這里!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皮仁,一起剝皮案震驚了整個(gè)濱河市籍琳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贷祈,老刑警劉巖趋急,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異势誊,居然都是意外死亡呜达,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門粟耻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來查近,“玉大人,你說我怎么就攤上這事勋颖。” “怎么了勋锤?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵饭玲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我叁执,道長(zhǎng)茄厘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任谈宛,我火速辦了婚禮次哈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吆录。我一直安慰自己窑滞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布恢筝。 她就那樣靜靜地躺著哀卫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撬槽。 梳的紋絲不亂的頭發(fā)上此改,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音侄柔,去河邊找鬼共啃。 笑死占调,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的移剪。 我是一名探鬼主播究珊,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼挂滓!你這毒婦竟也來了苦银?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赶站,失蹤者是張志新(化名)和其女友劉穎幔虏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贝椿,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡想括,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烙博。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瑟蜈。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖渣窜,靈堂內(nèi)的尸體忽然破棺而出铺根,到底是詐尸還是另有隱情,我是刑警寧澤乔宿,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布位迂,位于F島的核電站,受9級(jí)特大地震影響详瑞,放射性物質(zhì)發(fā)生泄漏掂林。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一坝橡、第九天 我趴在偏房一處隱蔽的房頂上張望泻帮。 院中可真熱鬧,春花似錦计寇、人聲如沸锣杂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹲堂。三九已至,卻和暖如春贝淤,著一層夾襖步出監(jiān)牢的瞬間柒竞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工播聪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朽基,地道東北人布隔。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像稼虎,于是被迫代替她去往敵國(guó)和親衅檀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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