首頁>技術>

爬蟲–scrapy

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

搭建環境
import scrapyimport numpy as npimport pandas as pdimport 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.pyimport scrapyfrom booktop.items import BookItemclass 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 BookItemdef 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檔案下

# 開啟管道檔案 BooktopPipelineclass 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.pyimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport 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()

私信小編01即可獲取大量Python學習資料

28
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Python十大裝B語法!你會幾種?