likes
comments
collection
share

分享一个Python爬虫入门实例(有源码,学习使用)

作者站长头像
站长
· 阅读数 3

一、爬虫基础知识

Python爬虫是一种使用Python编程语言实现的自动化获取网页数据的技术。它广泛应用于数据采集、数据分析、网络监测等领域。以下是对Python爬虫的详细介绍:

  1. 架构和组成
  • 下载器:负责根据指定的URL下载网页内容,常用的库有Requests和urllib。
  • 解析器:用于解析下载的网页内容,提取所需的数据。BeautifulSoup和lxml是常用的解析库。
  • 存储器:将提取的数据存储到本地或数据库中,以便于后续处理和分析。
  1. 优势
  • 易于学习和使用:Python语言简洁易懂,入门门槛低,适合初学者。
  • 强大的库支持:拥有丰富的第三方库,如Requests、BeautifulSoup和Scrapy,大大提高了开发效率。
  • 跨平台性:Python是跨平台的,可以在多种操作系统上运行。
  • 社区活跃:Python有着庞大的开发者社区,遇到问题时可以快速找到解决方案。
  1. 应用场景
  • 数据挖掘:从网站抓取大量数据进行市场分析、用户行为研究等。
  • 监控竞品:定期检查竞争对手的网站变化,如价格变动、新产品发布等。
  • 内容聚合:自动收集来自不同来源的内容,整合后提供给用户。
  • 自动化测试:模拟用户操作,进行网站的自动化测试。

二、案例:爬取大学排名数据

代码实现:

import requests
from bs4 import BeautifulSoup
import pandas as pd

ulist = []
# 爬取的网站的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)

运行成功后打开文件: 分享一个Python爬虫入门实例(有源码,学习使用)

三、简单数据分析

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()

运行结果:

分享一个Python爬虫入门实例(有源码,学习使用)

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文件,结果如下:

分享一个Python爬虫入门实例(有源码,学习使用)

(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文件,结果如下:

分享一个Python爬虫入门实例(有源码,学习使用)

(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文件,结果如下:

分享一个Python爬虫入门实例(有源码,学习使用)