豆瓣算是一個文藝者的棲息地了坛芽,也是程序員們的蟲子喜歡光顧的地方留储。對豆瓣的書籍和電影比較感興趣,下面是一個小爬蟲抓取圖書的然后自動寫入Excel咙轩,后續(xù)可能會加大光顧豆瓣的力度获讳。_
這個爬蟲有參考網(wǎng)絡上的資料,也有參考如下鏈接的文檔活喊。
Request官方文檔
Openpyxl官方文檔
BeautifulSoup4官方文檔
XML 系列教程
# -*- coding=utf-8 -*-
import requests
from bs4 import BeautifulSoup
#import os
from openpyxl import Workbook
import time
num0 = 1 # 用來計數(shù)丐膝,計算爬取的書一共有多少本
num1 = 1
num2 = 1 #設(shè)置三個計數(shù)的變量是為了將書籍、類別和作者對應起來
start_time = time.time() # 計算爬蟲爬取過程時間
# 第一頁網(wǎng)頁網(wǎng)址https://read.douban.com/columns/category/all?sort=hot&start=0
# 第二頁網(wǎng)頁網(wǎng)址https://read.douban.com/columns/category/all?sort=hot&start=10
# 第三頁網(wǎng)頁網(wǎng)址https://read.douban.com/columns/category/all?sort=hot&start=20
# ......發(fā)現(xiàn)規(guī)律了嗎
url = 'https://read.douban.com/columns/category/all?sort=hot&start='
wb = Workbook()
ws = wb.active
ws.title = "豆瓣閱讀全部專欄"
ws.cell(row=1, column=1).value = '全部專欄'
ws.cell(row=1, column=2).value = '作者'
ws.cell(row=1, column=3).value = '類別'
for i in range(0, 1760, 10): # 這里的 range(初始钾菊,結(jié)束帅矗,間隔)
# requests庫用來向該網(wǎng)服務器發(fā)送請求,請求打開該網(wǎng)址鏈接煞烫。requests.get().content表示什么意思浑此?
html = requests.get('https://read.douban.com/columns/category/all?sort=hot&start=%d' % i).content
# BeautifulSoup庫解析獲得的網(wǎng)頁,第二個參數(shù)一定記住要寫上‘lxml’滞详,記住就行
bsObj = BeautifulSoup(html, 'lxml')
print('==============' + '第%d頁' % (i / 10 + 1) + '==============')
# 分析網(wǎng)頁發(fā)現(xiàn)凛俱,每頁有10本書,而<h4>標簽正好只有10個料饥。
# 下面的for循環(huán)是爬取書籍名稱
h4_node_list = bsObj.find_all('h4') # 這里返回的是h4標簽的list列表蒲犬。
#對于為什么是find_all('h4'),以及下面的類似。都是查看頁面源代碼岸啡,然后找規(guī)律原叮,參考BS4文檔。
for h4_node in h4_node_list:
# 因為是列表巡蘸,要用list[0]取出來<a>標簽奋隶,在用<a>的string將文本取出來
title = h4_node.contents[0].string
title = '<<' + title + '>>'
#title_all = title_all.append(title)
print('第%d本書' % num0, title)
num0 = num0 + 1
ws.cell(row=num0, column=1).value = title
# 下面的for循環(huán)是爬取對應書籍的類別
category_node_list = bsObj.find_all("div","category")
for category_node in category_node_list:
category = category_node.contents[1].string
print('第%d本書的類別' % num1, category)
num1 = num1 + 1
ws.cell(row=num1, column=3).value = category
# 下面的for循環(huán)是爬取對應書籍的作者
author_node_list = bsObj.find_all("div","author")
#category_node_list = bsObj.find_all("div","category")
for author_node in author_node_list:
author = author_node.contents[1].string
print('第%d本書的作者' % num2, author)
num2 = num2 + 1
ws.cell(row=num2, column=2).value = author
wb.save('豆瓣閱讀全部專欄' + '.xlsx') #將書籍寫入Excel表格
time.sleep(2)
#設(shè)置抓數(shù)據(jù)停頓時間為1秒,防止過于頻繁訪問該網(wǎng)站悦荒,被封
#下面用來統(tǒng)計爬蟲用時及抓取書籍總數(shù)达布。
end_time = time.time()
duration_time = end_time - start_time
print('運行時間共:%.2f' %duration_time + '秒')
print('共抓到%d本書名' % (num1-1))
代碼如上,請大家多多指教逾冬。
另外黍聂,比較喜歡廖雪峰的Python教程,以及書籍《Python Cookbook》身腻、《Learn Python the Hard Way》和爬蟲書《Web Scraping with Python》产还,這本書中文名叫Python網(wǎng)絡數(shù)據(jù)采集。其他的網(wǎng)路上的Python視頻也很不錯嘀趟。有一個體會就是學一種技能的效果不在于你看多少本有關(guān)的書籍脐区,而是一本書你是否完成看完了,吃透了多少她按。Python的資料就是太多了牛隅。