本文圖檔以及文本僅供學習、交流使用,不做商業用途,如有問題請及時聯系我們以作處理。
前言
網際網路給了我們很多的友善,而網絡小說、電子書等也應潮流而發展,友善了人随時檢視想要看的圖書,友善攜帶。
在上一期python爬蟲中,我們講解了python如何爬取整本小說:用python爬取全站小說,你想看的都爬下來!
今天教大家爬取豆瓣讀書網,擷取圖書的書名、價格等資料,儲存為csv檔案。
分析網頁
目标網址:
https://book.douban.com/tag/%E7%BC%96%E7%A8%8B?start=0&type=T
複制
我們需要爬取他的書名、作者、編譯、出版社、出版時間、定價、紙質版價格、評分、簡介。

我們需要的内容都在源代碼中,可以确定該網頁是靜态網頁。
拉到網頁底部,點選下一頁檢視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參數即可進行翻頁爬取。
導入子產品
今天需要用到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标簽,然後在用循環提取裡面的内容。
書名等内容在li标簽下的多級标簽中,是以我們需要向下層層提取:
建立資料提取和資料儲存函數,傳入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、有不足之處還請多多指教。