豆瓣读书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)