Python爬虫与pyecharts可视化入门

发布时间 2023-11-07 00:10:58作者: 七落安歌

python爬虫与pyecharts数据可视化

一、爬虫介绍

1、爬虫定义

网络爬虫:

又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取网络信息的程序或者脚本,另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

通俗理解:

简单来讲,爬虫就是一个探测机器,它的基本操作就是模拟人的行为去各个网站溜达,点点按钮,查查数据,或者把看到的信息背回来. 就像一只虫子在一幢楼里不知疲倦地爬来爬去.

百度:其实就是利用了这种爬虫技术, 每天放出无数爬虫到各个网站,把他们的信息抓回来,然后化好淡妆排着小队等你来检索。

有了这样的特性, 对于一些自己公司数据量不足的小公司, 这个时候还想做数据分析就可以通过爬虫获取同行业的数据然后进行分析, 进而指导公司的策略指定。

2、爬虫的基本步骤

基本步骤:

  • 起始URL地址
  • 发出请求获取响应数据
  • 对响应数据解析
  • 数据入库

3、requests模块

Python requests 是一个常用的HTTP请求库,可以方便的向网站发送HTTP请求,并获取响应结果。

import requests

x = requests.get('http://127.0.0.1:9000/')

# 返回网页的内容,比如html中内容
print(x.text)

# 获取响应状态码
print(x.status_code)

# 获取响应头
print(x.headers)

# 获取响应内容
print(x.content)

快速入门(request三步走)

get() 方法获取网页数据

# 导入模块
import requests

# 通过requests.get()发送请求
# data保存返回的响应数据(这里的data不是单纯的html,需要通过content获取html代码)
data = requests.get('http://www.baidu.com')

#通过data.content获取html代码
data = data.content.decode('utf-8')

二、爬取照片

image-20231024164346889

我们知道这里是html中的请求链接,如果获取这些链接,那么通过爬虫就可以访问这些链接并获取照片

1、爬取照片的步骤:

  1. 获取index.html代码(通过requests.get(url)获取)
  2. 解析index.html代码获取图片url(分割、遍历、正则匹配)
  3. 通过url获取图片

2、获取index.html代码

# 通过爬虫向index.html发送请求
# requests.get(网址): 向一个网址发送请求,和在浏览器中输入网址是一样的
data = requests.get("http://127.0.0.1:8000/index.html")
# content可以把requests.get()获取的返回值中的html内容获取到
data = data.content.decode("utf-8")

3、解析index.html代码获取图片url

# 获取图片的请求url
def get_pic_url():
    # 通过爬虫向index.html发送请求
    # requests.get(网址): 向一个网址发送请求,和在浏览器中输入网址是一样的
    data = requests.get("http://127.0.0.1:8000/index.html")
    # content可以把requests.get()获取的返回值中的html内容获取到
    data = data.content.decode("utf-8")
    # html每一行都有"\n", 对html进行分割获得一个列表
    data = data.split("\n")
    # 创建一个列表存储所有图片的url地址(也就是图片网址)
    url_list = []
    for url in data:
        # 通过正则解析出所有的图片url
        result = re.match('.*src="(.*)" width.*', url)
        if result is not None:
            # 把解析出来的图片url添加到url_list中
            url_list.append(result.group(1))

    return url_list

4、通过图片url获取图片

# 把爬取到的图片保存到本地
def save_pic(url_list):
    # 通过num给照片起名字 例如:0.jpg 1.jpg 2.jpg
    num = 0
    for url in url_list:
        # 通过requests.get()获取每一张图片
        pic = requests.get(f"http://127.0.0.1:8000{url[1:]}")
        # 保存每一张图片
        with open(f"./source/spyder/{num}.jpg", "wb") as f:
            f.write(pic.content)
            num += 1

完整代码:

import requests
import re


# 定义一个获取网络图片的地址
def get_pic_url():
    # 通过爬虫向index.html发送请求
    # requests.get(url) :向网址发送一个请求,和浏览器的网址是一样的
    data = requests.get('http://127.0.0.1:9000/index.html')
    # content可以把requests.get()返回的html内容获取到 返回的是二进制流数据
    data = data.content.decode('utf-8')
    # html中每一行都有一个\n,对html进行分割获得一个列表
    data = data.split('\n')
    # 创建一个保存图片地址的列表
    image_url = []
    # 遍历并正则匹配
    for row in data:
        # 匹配得到所有图片的地址url
        result = re.match('.*src="(.*)" width', row)
        if result:
            image_url.append(result.group(1))

    # 返回图片的url列表
    return image_url


# 通过图片的url获取图片并保存到本地
def sava_pic(image_url):
    # 定义一个num来储存照片
    num = 0
    for i in image_url:
        # 通过requests.get(url)获取每一张照片
        # print(i)  # ./images/0.jpg
        pic = requests.get('http://127.0.0.1:9000' + i[1:])

        with open(f'source/spyder1/{num}.jpg', 'wb') as f:
            f.write(pic.content)  # content是以字节为单位的内容
        num += 1


if __name__ == '__main__':
    list1 = get_pic_url()
    sava_pic(list1)

三、使用Python爬取GDP数据

1、gdp.html

image-20231024203531662

通过访问 http://127.0.0.1:9000/gdp.html 可以获取2020年世界GDP排名. 在这里我们通过和爬取照片一样的流程步骤获取GDP数据。

2、获取GDP数据

import requests
import re

country_list = []
gdp_list = []


def get_gdp():
    res = requests.get('http://127.0.0.1:9000/gdp.html')
    print(res.content.decode('utf-8'))
    res = res.content.decode('utf-8').split('\n')
    # print(res)
    # <td>&nbsp;&nbsp;<a href=""><font>比利时</font></a></td>
    # 获取国家的名称
    for row in res:
        result = re.match('.*<a href=""><font>(.+)</font></a></td>', row)
        # 如果匹配成功
        if result:
            country_list.append(result.group(1))
    print(country_list)

    # <td class="rank_prev"><font>¥29662.5546亿元</font></td>
    # 获取gdp数据
    for row in res:
        result = re.match('.*<font>¥(.*)亿元</font>', row)
        if result:
            gdp_list.append(result.group(1))
    print(gdp_list)


if __name__ == '__main__':
    get_gdp()

image-20231024203725263

四、多任务爬虫实现

1、为什么使用多任务

在上述案例中,只是爬取了2个非常简单的页面, 这两个页面的数据爬取并不会使用太多的时间, 所以我们也没有太多的考虑效率问题.

但是在真正的工作环境中, 我们爬取的数据可能非常的多, 如果还是使用单任务实现, 这时候就会让我们爬取数据的时间很长, 那么显然使用多任务可以大大提升我们爬取数据的效率

2、多任务实现爬虫

# 根据业务需要从而选择多进程或多线程来实现多任务爬虫
import multiprocessing
import threading


def get_pic():
    pass


def get_gdp():
    pass


if __name__ == '__main__':
    # 创建多线程
    get_pic_thread = threading.Thread(target=get_pic)
    get_gdp_thread = threading.Thread(target=get_gdp)

    # 启动多线程
    get_gdp_thread.start()
    get_pic_thread.start()

五、pyecharts数据可视化

1、pyecharts介绍

概况 :

Echarts 是个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可. 而 Python 是门富有表达力的语言,很适合用于数据处理. 当数据分析遇上数据可视化时pyecharts 诞生了.

特性 :

  1. 简洁的API设计,使用如丝滑般流畅,支持链式调用
  2. 囊括了30+种常见图表,应有尽有
  3. 支持主流Notebook 环境,Jupyter NotebookJupyterLab
  4. 可轻松集成至Flask, Django等主流Web框架
  5. 高度灵活的配置项,可轻松搭配出精美的图表
  6. 详细的文档和示例,帮助开发者更快的上手项目
  7. 多达400+地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持

pyecharts v1版本简介 - pyecharts - A Python Echarts Plotting Library built with love.

2、Faker随机类

from pyecharts.faker import Faker

print(Faker.choose())
print(Faker.choose())

print(Faker.values())
print(Faker.values())

image-20231024223038421

  • 通过以上,我们可以知道Faker是一个随机类,专门用于生成一些测试数据,其返回结果是一个列表

image-20231024223310012

我们也可以通过Faker类来固定选择一组数据

在pychram中可以按住Ctrl点击Faker,查看Faker类

print(Faker.clothes)

3、新版与旧版的pyechart数据可视化对比

"""
pyecharts三个步骤:① 导入模块 ② 创建图形对象 ③ 争对对象添加对应的属性和方法
学pyecharts:一切皆配置!!!
"""
# 导入图表
from pyecharts.charts import Bar
# 导入图表项
from pyecharts import options as opts

# 创建一个图表对象并添加数据
# 新版的链式操作 Bar().add_yaxis().add_xaxis().render()
c = (
    Bar()
    .add_xaxis(['Macbook Pro', 'HuaWei Pro', 'Redmi Pro'])
    .add_yaxis('商家A', [31, 653, 323, 543])
    .add_yaxis('商家B', [56, 325, 63, 653])
    .render('Bar_Bar.html')
)
# 旧版:
# c = Bar()
# c.render()
# c.add_xaxis()
# c.add_yaxis()

4、pyecharts的配置项说明

在pyecharts中,一切皆配置!

pyecharts全局配置项:全局配置项 - pyecharts - A Python Echarts Plotting Library built with love.

全局配置项可通过 set_global_opts 方法设置

image-20231025091357046

全局配置与系列配置说明:pyecharts配置项说明 - 七落安歌 - 博客园 (cnblogs.com)

5、通过pyecharts模块创建饼状图

导入模块

# 导入饼图模块
from pyecharts.charts import Pie
# 导入配置选项模块
import pyecharts.options as opts

初始化饼状图:

Pie()函数: 创建饼图

opts.InitOpts参数: Pie(init_opts=opts.InitOpts(width="1400px", height="800px"))

init_opts: 指定参数名

opts.InitOpts: 配置选项

width="1400px" height="800px" :界面的宽度和高度

# 创建饼图并设置这个界面的长和高 
# px:像素单位
pie = Pie(init_opts=opts.InitOpts(width="1400px", height="800px"))

给饼图添加数据:

add()函数:

参数1: 名称

参数2: 具体数据, 数据类型为>[(a,b),(a,b),(a,b)]>a为数据名称,b为数据大小

参数3: 标签设置 label_opts=opts.LabelOpts(formatter='{b}:{d}%') 符合百分比的形式

# 给饼图添加数据
pie.add(
  "GDP",
  data,
  label_opts=opts.LabelOpts(formatter='{b}:{d}%')
)

给饼图添设置标题:

set_global_opts()函数 :

title_opts=opts.TitleOpts : 设置标题

title="2020年世界GDP排名", subtitle="美元" : 设置主标题和副标题

# 给饼图设置标题
pie.set_global_opts(title_opts=opts.TitleOpts(title="2020年世界GDP排名", subtitle="美元"))

保存数据:

# 保存结果
pie.render()

6、GDP数据饼图可视化

import requests
import re
from pyecharts import options as opts
from pyecharts.charts import Pie

country_list = []
gdp_list = []


def get_gdp():
    res = requests.get('http://127.0.0.1:9000/gdp.html')
    print(res.content.decode('utf-8'))
    res = res.content.decode('utf-8').split('\n')
    # print(res)
    # <td>&nbsp;&nbsp;<a href=""><font>比利时</font></a></td>
    # 获取国家的名称
    for row in res:
        result = re.match('.*<a href=""><font>(.+)</font></a></td>', row)
        # 如果匹配成功
        if result:
            country_list.append(result.group(1))
    print(country_list)

    # <td class="rank_prev"><font>¥29662.5546亿元</font></td>
    # 获取gdp数据
    for row in res:
        result = re.match('.*<font>¥(.*)亿元</font>', row)
        if result:
            gdp_list.append(result.group(1))

    list1 = list(zip(country_list, gdp_list))
    return list1


if __name__ == '__main__':
    data = get_gdp()

    c = (
        Pie()
        .add("", data[:10])
        .set_global_opts(title_opts=opts.TitleOpts(title="前十GDP示例"))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
        .render("GDP.html")
    )

image-20231025194912999