1. 程式人生 > 實用技巧 >豆瓣讀書top250資料爬取與視覺化

豆瓣讀書top250資料爬取與視覺化

爬蟲–scrapy

題目:根據豆瓣讀書top250,根據出版社對書籍數量分類,繪製餅圖

搭建環境

import scrapy
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

載入scrapy框架


#terminal 終端實現
cd .. # 跳轉到上一層目錄
scrapy startproject booktop # 和專案同名的scrapy框架專案

setting配置

ROBOTSTXT_OBEY = False # 君子協議 false 不遵守
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
DOWNLOAD_DELAY = 0.5 # 下載延遲## 如何改變文字的樣式

spider編寫


#spiders資料夾下建立python檔案 bookspider.py
import scrapy
from booktop.items import BookItem
class BookSpider(scrapy.Spider):
		name="bookspider"
		allowed_domains=['book.douban.com']
		start_urls=['https://book.douban.com/top250']
		def parse(self, response, **kwargs):
				print(response.text) # 測試頁面

測試:

#在terminal終端進行
cd booktop # 進入專案資料夾
scrapy crawl bookspider # 執行專案下的爬蟲(和name的值保持一致)
# 測試成功,看到頁面程式碼

獲取資料(書名+出版社)

 需要匯入BookItem類 檔案開頭匯入 from booktop.items import BookItem
def parse(self, response, **kwargs):
		 #print(response.text)
		# table 一個table一本書
		tables=response.xpath('//table') # css也可以
		# print('書籍個數',len(tables))
		# print(tables)
		for t in tables:
				#提取 extract()[0]
				tit=t.css('div.pl2 a::attr(title)').extract()[0]
				# print(title) 書名
				pu=t.css('p.pl::text').extract()[0]
				pu=pu.split('/')[-3].strip()
 				#print(pub) 出版社
				yield BookItem(title=tit,pub=pu)

需要使用item物件完成資料封裝並傳輸

#items.py書寫書類
class BookItem(scrapy.Item):
		#define the fields for your item here like:
		title = scrapy.Field()
		pub=scrapy.Field()
		pass

pipeline 管道儲存資料

# 在setting檔案下,解開註釋
ITEM_PIPELINES = {
'booktop.pipelines.BooktopPipeline': 300,
}

資料儲存到txt檔案下

# 開啟管道檔案 BooktopPipeline
class BooktopPipeline:
	def process_item(self, item, spider):
		# 編碼格式設定為utf-8
		file=open('result.txt','a+',encoding='utf-8')
		file.write(item['title']+','+item['pub']+'\n')
		return item
# 執行測試結果result.txt下有資料成功

分析和視覺化

# 在專案中建立 分析檔案 demo1.py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
# 處理中文字型
font = {'family': 'microsoft yahei',
		'weight': 'bold',
		'size': 12}
matplotlib.rc('font',**font)
# 讀取檔案
df=pd.read_csv('result.txt',names=['title','pub'])
# print(df)
# 福爾摩斯探案集 出版社有問題,手動修改
df.loc[8,'pub']='群眾出版社'
# print(df)
# 按出版社不同分類彙總書數量,取出前5名
result=df['pub'].value_counts().head()
print(result)
plt.pie(result,labels=result.index,autopct='%3.1f%%')
plt.show()

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯絡我們以作處理
想要獲取更多Python學習資料可以加
QQ:2955637827私聊
或加Q群630390733
大家一起來學習討論吧!