天天看點

用python爬取豆瓣讀書網中所有圖書的基本資訊,全部都一目了然!

本文圖檔以及文本僅供學習、交流使用,不做商業用途,如有問題請及時聯系我們以作處理。

前言

網際網路給了我們很多的友善,而網絡小說、電子書等也應潮流而發展,友善了人随時檢視想要看的圖書,友善攜帶。

在上一期python爬蟲中,我們講解了python如何爬取整本小說:用python爬取全站小說,你想看的都爬下來!

今天教大家爬取豆瓣讀書網,擷取圖書的書名、價格等資料,儲存為csv檔案。

分析網頁

目标網址:

https://book.douban.com/tag/%E7%BC%96%E7%A8%8B?start=0&type=T
           

複制

我們需要爬取他的書名、作者、編譯、出版社、出版時間、定價、紙質版價格、評分、簡介。

用python爬取豆瓣讀書網中所有圖書的基本資訊,全部都一目了然!

我們需要的内容都在源代碼中,可以确定該網頁是靜态網頁。

用python爬取豆瓣讀書網中所有圖書的基本資訊,全部都一目了然!

拉到網頁底部,點選下一頁檢視url變化:

https://book.douban.com/tag/%E7%BC%96%E7%A8%8B?start=0&type=T
https://book.douban.com/tag/%E7%BC%96%E7%A8%8B?start=20&type=T
https://book.douban.com/tag/%E7%BC%96%E7%A8%8B?start=40&type=T
           

複制

發現url中的start參數會發生遞增變化,每次增加20,後期我們隻需要更改url後面的offse參數即可進行翻頁爬取。

用python爬取豆瓣讀書網中所有圖書的基本資訊,全部都一目了然!
導入子產品

今天需要用到time子產品進行減速,防止爬取的太快對網頁造成負擔;requests子產品進行資料的請求;lxml子產品中xpath進行資料的提取;pandas子產品用來儲存資料。

import time
import requests
from lxml import etree
import pandas as pd
           

複制

請求資料

建立資料請求函數,傳入page頁數參數,用來進行翻頁操作;建構headers,僞裝請求頭,防止被伺服器識别;用resposn進行接收請求的資料,然後return 進行回調。

def resposn(page):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11'}
    url = 'https://book.douban.com/tag/%E7%BC%96%E7%A8%8B?start={}&type=T'.format(page)
    resposn = requests.get(url=url, headers=headers).text
    return resposn
           

複制

提取資料和儲存資料

我們需要的資料全部都在li标簽裡面,是以先用xpath擷取li标簽,然後在用循環提取裡面的内容。

用python爬取豆瓣讀書網中所有圖書的基本資訊,全部都一目了然!

書名等内容在li标簽下的多級标簽中,是以我們需要向下層層提取:

用python爬取豆瓣讀書網中所有圖書的基本資訊,全部都一目了然!

建立資料提取和資料儲存函數,傳入resposn參數,然後建立DataFrame,以便後面儲存:

def lists(resposn):
    df = pd.DataFrame()
           

複制

轉換HTML格式,然後先提取li标簽:

etree_html = etree.HTML(resposn)
subject_item = etree_html.xpath('.//ul/li[@class="subject-item"]')
           

複制

循環取出li标簽裡面的内容,然後用xpath文法提取我們需要的内容;其中,爬取的書名等資料内容比較雜亂,有很多的空行,這裡用清單推導式進行strip去除空行,然後join一下取出資料。

for li in subject_item:
    # 書名
    title = li.xpath('.//div[@class="info"]/h2/a//text()')
    we_title = ''.join([x.strip() for x in title])  
    # 作者/編譯/出版社/出版時間/定價
    cbs_pub = li.xpath('.//div[@class="pub"]/text()')[0].strip()  
    # 紙質版價格
    ft = li.xpath('.//div[@class="ft"]/div/span/a/text()')

    ft = ''.join([x.strip() for x in ft]) 
    # 評分
    star = li.xpath('.//div[@class="star clearfix"]//text()')  
    we_star = ''.join([x.strip() for x in star])
    # 簡介
    jj_p = li.xpath('.//div[@class="info"]//p/text()')
           

複制

轉換成DataFrame格式,限制爬取速度,防止爬取的太快對網頁造成負擔,然後以csv的格式進行儲存。

data = pd.DataFrame({'書名': [we_title], '紙質版價格': [ft], '作者/編譯/出版社/出版時間/定價': [cbs_pub], '評分': [we_star], '簡介': [jj_p]})
df = pd.concat([df, data])
time.sleep(2)
#儲存資料
df.to_csv('圖書.csv', encoding='utf-8', index=False, mode='a')
           

複制

建立主函數,放入請求函數、提取資料和儲存資料函數。

def main(page):
    resposn_ = resposn(page)
    lists(resposn_)
           

複制

啟動主函數,循環放入數值進行翻頁操作。

if __name__ == '__main__':
    for page in range(0, 60, 20):
        main(page)
           

複制

小結

1、本文基于Python,利用python爬蟲子產品,實作爬取圖書基本資訊資料并儲存下來。

2、本文隻要講解如何去掉爬取的内容中一些雜亂字元。

3、有不足之處還請多多指教。