Python爬虫是一种使用Python编程语言实现的自动化获取网页数据的技术。它广泛应用于数据采集、数据分析、网络监测等领域。以下是对Python爬虫的详细介绍:
-
架构和组成:
-
下载器:负责根据指定的URL下载网页内容,常用的库有Requests和urllib。
-
解析器:用于解析下载的网页内容,提取所需的数据。BeautifulSoup和lxml是常用的解析库。
-
存储器:将提取的数据存储到本地或数据库中,以便于后续处理和分析。
-
优势:
-
易于学习和使用:Python语言简洁易懂,入门门槛低,适合初学者。
-
强大的库支持:拥有丰富的第三方库,如Requests、BeautifulSoup和Scrapy,大大提高了开发效率。
-
跨平台性:Python是跨平台的,可以在多种操作系统上运行。
-
社区活跃:Python有着庞大的开发者社区,遇到问题时可以快速找到解决方案。
-
应用场景:
-
数据挖掘:从网站抓取大量数据进行市场分析、用户行为研究等。
-
监控竞品:定期检查竞争对手的网站变化,如价格变动、新产品发布等。
-
内容聚合:自动收集来自不同来源的内容,整合后提供给用户。
-
自动化测试:模拟用户操作,进行网站的自动化测试。
案例:爬取大学排名数据(爬20条)
代码如下:
import requests
from bs4 import BeautifulSoup
import pandas as pd
ulist = []
# 爬取的网站的URL
# 爬取的网站的URL
url = "http://www.gaosan.com/gaokao/241219.html"
response = requests.get(url)
# 编码格式
response.encoding = 'utf-8'
# 编译数据
soup = BeautifulSoup(response.text, 'html.parser')
# 将数据存入定义好的ulist
for tr in soup.find('tbody').children:
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string, tds[4].string, tds[5].string])
# 获取指定数量的大学并打印:
# {:^10}表示将元素居中对齐,宽度为10个字符。
# \t表示制表符,用于分隔不同的列。
# chr(12288)通常用于中文文本的排版,以保持整齐的对齐。
for i in range(21):
u=ulist[i]
print("{:^10}\t{:^20}\t{:^10}\t{:^10}\t{:^10}\t{:^10}".format(u[0],u[1],u[2],u[3],u[4],u[5],chr(12288)))
# 创建一个pandas DataFrame对象
df=pd.DataFrame(ulist[1:21],columns=ulist[0])
# 将数据保存到Excel文件中
df.to_excel('学校排名.xlsx',index=False)
运行成功后打开文件:
简单数据分析
1.以matplotlib库为主:将爬取的大学排名数据进行分析。
import matplotlib.pyplot as plt
import pandas as pd
# 读取Excel文件
df = pd.read_excel('学校排名.xlsx')
# 解决坐标轴刻度负号乱码
plt.rcParams['axes.unicode_minus'] = False
# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Simhei']
# 1.绘制柱状图,展示不同省份的大学数量
# 从df中提取出"所在地区"列的数据,存储在变量provinces中。
provinces = df['所在地区']
# 使用value_counts()函数统计每个省份出现的次数,并将结果存储在变量counts中。
counts = provinces.value_counts()
# 使用plt.bar()函数绘制柱状图,横坐标为省份名称,纵坐标为大学数量。
plt.bar(counts.index, counts.values)
# 使用plt.xlabel()、plt.ylabel()和plt.title()函数设置图表的横轴标签、纵轴标签和标题。
plt.xlabel('所在地区')
plt.ylabel('大学数量')
plt.title('不同省份的大学数量')
# 使用plt.show()函数显示图表。
plt.show()
# 2.绘制饼图,展示办学层次的大学占比
# 从df中提取出"办学层次"列的数据,存储在变量batches中。
batches = df['办学层次']
# 使用value_counts()函数统计每个办学层次出现的次数,并将结果存储在变量counts中。
counts = batches.value_counts()
# 使用plt.pie()函数绘制饼图,参数labels指定标签,参数autopct指定百分比格式。
plt.pie(counts.values, labels=counts.index, autopct='%1.1f%%')
# 使用plt.axis('equal')函数设置饼图为正圆形。
plt.axis('equal')
# 使用plt.title()函数设置图表的标题。
plt.title('办学层次大学占比')
# 使用plt.show()函数显示图表。
plt.show()
# 3.绘制散点图,展示分数线与排名之间的关系
# 从df中提取出"综合得分"和"星级排名"两列的数据,分别存储在变量scores和ranks中。
scores = df['综合得分']
ranks = df['星级排名']
# 使用plt.scatter()函数绘制散点图,横坐标为星级排名,纵坐标为综合得分。
plt.scatter(ranks, scores)
# 使用plt.xlabel()、plt.ylabel()和plt.title()函数设置图表的横轴标签、纵轴标签和标题。
plt.xlabel('星级排名')
plt.ylabel('综合得分')
plt.title('综合得分与星级排名的关系')
# 使用plt.show()函数显示图表。
plt.show()
运行结果:
2.以Pyecharts库为主:将爬取的大学排名数据进行分析。
(1)绘制柱状图,展示不同省份的大学数量
import pandas as pd
from pyecharts.charts import Bar
from pyecharts import options as opts
# 读取Excel文件
file_path = '学校排名.xlsx'
df = pd.read_excel(file_path)
# 统计'所在地区'列中各个地区的出现次数。
department_count = df['所在地区'].value_counts()
# 绘制柱状图
bar = (
Bar()
# 将'所在地区'列中各个地区的名称添加到图表的X轴上。
.add_xaxis(department_count.index.tolist())
# 将'所在地区'列中各个地区的出现次数添加到图表的Y轴上,并将这个数据系列命名为"数量"。
.add_yaxis("数量", department_count.values.tolist())
# 设置图表的全局选项。这里将图表的标题设置为"不同省份的大学数量"。
.set_global_opts(title_opts=opts.TitleOpts(title="不同省份的大学数量统计"))
)
# 生成HTML文件
bar.render('A-不同省份的大学数量.html')
运行之后生成html文件,打开html文件,结果如下:
(2)绘制饼图,展示办学层次的大学占比
import pandas as pd
from pyecharts.charts import Pie
from pyecharts import options as opts
file_path = '学校排名.xlsx'
df = pd.read_excel(file_path)
# 统计各学历人数
education_count = df['办学层次'].value_counts()
# 绘制饼图
pie = (
Pie()
# 将办学层次和对应的数量作为数据添加到饼图中。
# 其中,education_count是一个包含办学层次和对应数量的Series对象
# 通过zip函数将两个列表合并成一个元组列表,再使用list函数将其转换为列表形式。
# 最后,使用add方法将数据添加到饼图中,并设置系列名称为"数量"。
.add("数量", [list(z) for z in zip(education_count.index.tolist(), education_count.values.tolist())])
# 设置饼图的全局配置项。这里设置标题为"办学层次大学占比统计"。
.set_global_opts(title_opts=opts.TitleOpts(title="办学层次大学占比统计"))
# 设置饼图的标签格式。label_opts参数用于设置标签选项,opts.LabelOpts方法用于创建一个标签选项对象,并设置标签格式为"{b}: {c}"。
# 其中{b}表示办学层次,{c}表示数量。这样设置后,饼图中每个扇区的标签将显示为"教育层次:数量"的形式。
# formatter作用: 格式化标签的参数。{b}、{c}代表占位符。
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
# 生成HTML文件
pie.render('A-办学层次大学占比统计.html')
运行之后生成html文件,打开html文件,结果如下:
(3)绘制散点图,展示分数线与排名之间的关系
import pandas as pd
from pyecharts.charts import Scatter
from pyecharts import options as opts
# 读取Excel表格数据
file_path = '学校排名.xlsx'
df = pd.read_excel(file_path)
# 提取’星级排名‘和’综合分数‘数据
rank = df["星级排名"].tolist()
score = df["综合得分"].tolist()
# 创建散点图对象
scatter = Scatter()
# 添加X轴数据
scatter.add_xaxis(rank)
# 添加Y轴数据
scatter.add_yaxis("综合得分", score)
# 设置全局选项
scatter.set_global_opts(
# 设置标题名称
title_opts=opts.TitleOpts(title="综合得分与星级排名关系散点图"),
# 设置X轴名称
xaxis_opts=opts.AxisOpts(name="星级排名"),
# 设置Y轴名称以及纵坐标的大小
yaxis_opts=opts.AxisOpts(name="综合得分",min_=70, max_=100),
)
# 渲染图表
scatter.render("A-综合得分与星级排名关系散点图.html")
运行之后生成html文件,打开html文件,结果如下:
标签:plt,title,Python,爬虫,df,源码,import,counts,opts From: https://blog.csdn.net/xyh2004/article/details/139448116