欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

手把手教你Python抓取數(shù)據(jù)并可視化

 更新時(shí)間:2022年05月07日 10:45:08   作者:清&輕  
很多小伙伴在提到python數(shù)據(jù)可視化的時(shí)候第一反應(yīng)就是matplotlib庫,但實(shí)際上python還有很多很好用的數(shù)據(jù)可視化的庫,下面這篇文章主要給大家介紹了關(guān)于如何利用Python抓取數(shù)據(jù)并可視化的相關(guān)資料,需要的朋友可以參考下

前言

大家好,這次寫作的目的是為了加深對(duì)數(shù)據(jù)可視化pyecharts的認(rèn)識(shí),也想和大家分享一下。如果下面文章中有錯(cuò)誤的地方還請(qǐng)指正,哈哈哈?。。?br />本次主要用到的第三方庫:

  • requests
  • pandas
  • pyecharts

之所以數(shù)據(jù)可視化選用pyecharts,是因?yàn)樗胸S富的精美圖表,地圖,也可輕松集成至 Flask,Django 等主流 Web 框架中,并且在html渲染網(wǎng)頁時(shí)把圖片保存下來(這里好像截屏就可以了,),任君挑選!?。?/strong>

這次的數(shù)據(jù)采集是從招聘網(wǎng)址上抓取到的python招聘崗位信息,嗯……其實(shí)這抓取到的數(shù)據(jù)有點(diǎn)少(只有1200條左右,也沒辦法,崗位太少了…),所以在后面做可視化圖表的時(shí)候會(huì)導(dǎo)致不好看,駭。本來也考慮過用java(數(shù)據(jù)1萬+)的數(shù)據(jù)來做測(cè)試的,但是想到寫的是python,所以也就只能將就用這個(gè)數(shù)據(jù)了,當(dāng)然如果有感興趣的朋友,你們可以用java,前端這些崗位的數(shù)據(jù)來做測(cè)試,下面提供的數(shù)據(jù)抓取方法稍微改一下就可以抓取其它崗位了。

好了,廢話不多說,直接開始吧!

一、數(shù)據(jù)抓取篇

1.簡(jiǎn)單的構(gòu)建反爬措施

這里為大家介紹一個(gè)很好用的網(wǎng)站,可以幫助我們?cè)趯懪老x時(shí)快速構(gòu)建請(qǐng)求頭、cookie這些。但是這個(gè)網(wǎng)站也不知為什么,反正在訪問時(shí)也經(jīng)常訪問不了!額……,介紹下它的使用吧!首先,我們只需要根據(jù)下面圖片上步驟一樣。

完成之后,我們就復(fù)制好了請(qǐng)求頭里面的內(nèi)容了,然后打開網(wǎng)址https://curlconverter.com/進(jìn)入后直接在輸入框里Ctrl+v粘貼即可。然后就會(huì)在下面解析出內(nèi)容,我們直接復(fù)制就完成了,快速,簡(jiǎn)單,哈哈哈。

2.解析數(shù)據(jù)

這里我們請(qǐng)求網(wǎng)址得到的數(shù)據(jù)它并沒有在html元素標(biāo)簽里面,所以就不能用lxml,css選擇器等這些來解析數(shù)據(jù)。這里我們用re正則來解析數(shù)據(jù),得到的數(shù)據(jù)看到起來好像字典類型,但是它并不是,所以我們還需要用json來把它轉(zhuǎn)化成字典類型的數(shù)據(jù)方便我們提取。

這里用json轉(zhuǎn)化為字典類型的數(shù)據(jù)后,不好查看時(shí),可以用pprint來打印查看。

import pprint
pprint.pprint(parse_data_dict)

3.完整代碼

import requests
import re
import json
import csv
import time
from random import random
from fake_useragent import UserAgent
def spider_python(key_word):
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        'Pragma': 'no-cache',
        'Sec-Fetch-Dest': 'document',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'same-origin',
        'Sec-Fetch-User': '?1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': UserAgent().Chrome,
        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
    }
    params = {
        'lang': 'c',
        'postchannel': '0000',
        'workyear': '99',
        'cotype': '99',
        'degreefrom': '99',
        'jobterm': '99',
        'companysize': '99',
        'ord_field': '0',
        'dibiaoid': '0',
        'line': '',
        'welfare': '',
    }

    save_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()).replace(' ', '_').replace(':','_')
    file_path = f'./testDataPython-{save_time}.csv'
    f_csv =  open(file_path, mode='w', encoding='utf-8', newline='')
    fieldnames = ['公司名字', '職位名字', '薪資', '工作地點(diǎn)',
                  '招聘要求', '公司待遇','招聘更新時(shí)間', '招聘發(fā)布時(shí)間',
                  '公司人數(shù)', '公司類型', 'companyind_text', 'job_href', 'company_href']
    dict_write = csv.DictWriter(f_csv, fieldnames=fieldnames)
    dict_write.writeheader()
    page = 0       #頁數(shù)
    error_time = 0 #在判斷 職位名字中是否沒有關(guān)鍵字的次數(shù),這里定義出現(xiàn)200次時(shí),while循環(huán)結(jié)束
                   # (因?yàn)樵谒阉鲘徫幻謺r(shí)(如:搜索python),會(huì)在網(wǎng)站20多頁時(shí)就沒有關(guān)于python的崗位了,但是仍然有其它的崗位出現(xiàn),所以這里就需要if判斷,使其while循環(huán)結(jié)束)
    flag = True
    while flag:
        page += 1
        print(f'第{page}抓取中……')
        try:
            time.sleep(random()*3) #這里隨機(jī)休眠一下,簡(jiǎn)單反爬處理,反正我們用的是單線程爬取,也不差那一點(diǎn)時(shí)間是吧
            url='這里你們自己構(gòu)建url吧,從上面的圖片應(yīng)該能看出,我寫出來的話實(shí)在是不行,過不了審核,難受?。?!'
            ###這里還是要添加cookies的好,我們要偽裝好不是?防止反爬,如果你用上面提供的方法,也就很快的構(gòu)建出cookies。
            response = requests.get(url=url,params=params, headers=headers)
        except:
            print(f'\033[31m第{page}請(qǐng)求異常!033[0m')
            flag = False
        parse_data = re.findall('"engine_jds":(.*?),"jobid_count"',response.text)
        parse_data_dict = json.loads(parse_data[0])
        # import pprint
        # pprint.pprint(parse_data_dict)
        # exit()
        for i in parse_data_dict:
            ###在這里要處理下異常,因?yàn)樵谂廊《囗摃r(shí),可能是網(wǎng)站某些原因會(huì)導(dǎo)致這里的結(jié)構(gòu)變化
            try:
                companyind_text = i['companyind_text']
            except Exception as e:
                print(f'\033[31m異常:{e}033[0m')
                companyind_text = None
            dic = {
                '公司名字': i['company_name'],
                '職位名字': i['job_name'],
                '薪資': i['providesalary_text'],
                '工作地點(diǎn)': i['workarea_text'],
                '招聘要求': ' '.join(i['attribute_text']),
                '公司待遇': i['jobwelf'],
                '招聘更新時(shí)間': i['updatedate'],
                '招聘發(fā)布時(shí)間': i['issuedate'],
                '公司人數(shù)': i['companysize_text'],
                '公司類型': i['companytype_text'],
                'companyind_text': companyind_text,
                'job_href': i['job_href'],
                'company_href': i['company_href'],
            }
            if 'Python' in dic['職位名字'] or 'python' in dic['職位名字']:
                dict_write.writerow(dic)
                print(dic['職位名字'], '——保存完畢!')
            else:
                error_time += 1
            if error_time == 200:
                flag = False
                print('抓取完成!')
    f_csv.close()
if __name__ == '__main__':
    key_word = 'python'
    # key_word = 'java' ##這里不能輸入中文,網(wǎng)址做了url字體加密,簡(jiǎn)單的方法就是直接從網(wǎng)頁url里面復(fù)制下來用(如:前端)
    # key_word = '%25E5%2589%258D%25E7%25AB%25AF' #前端
    spider_python(key_word)

二、數(shù)據(jù)可視化篇

1.數(shù)據(jù)可視化庫選用

本次數(shù)據(jù)可視化選用的是pyecharts第三方庫,它制作圖表是多么的強(qiáng)大與精美?。。∠胍獙?duì)它進(jìn)行一些簡(jiǎn)單地了解話可以前往這篇博文:
http://www.dbjr.com.cn/article/247122.htm

安裝: pip install pyecharts

2.案例實(shí)戰(zhàn)

本次要對(duì)薪資、工作地點(diǎn)、招聘要求里面的經(jīng)驗(yàn)與學(xué)歷進(jìn)行數(shù)據(jù)處理并可視化。

(1).柱狀圖Bar

按住鼠標(biāo)中間滑輪或鼠標(biāo)左鍵可進(jìn)行調(diào)控。

import pandas as pd
from pyecharts import options as opts
python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv')
python_data['工作地點(diǎn)'] = [i.split('-')[0] for i in python_data['工作地點(diǎn)']]
city = python_data['工作地點(diǎn)'].value_counts()
###柱狀圖
from pyecharts.charts import Bar
c = (
    Bar()
    .add_xaxis(city.index.tolist()) #城市列表數(shù)據(jù)項(xiàng)
    .add_yaxis("Python", city.values.tolist())#城市對(duì)應(yīng)的崗位數(shù)量列表數(shù)據(jù)項(xiàng)
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Python招聘崗位所在城市分布情況"),
        datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")],
        xaxis_opts=opts.AxisOpts(name='城市'),  # 設(shè)置x軸名字屬性
        yaxis_opts=opts.AxisOpts(name='崗位數(shù)量'),  # 設(shè)置y軸名字屬性
    )
    .render("bar_datazoom_both.html")
)

(2).地圖Map

省份

這里對(duì)所在省份進(jìn)行可視化。

import pandas as pd
import copy
from pyecharts import options as opts
python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv')
python_data_deepcopy = copy.deepcopy(python_data) #深復(fù)制一份數(shù)據(jù)
python_data['工作地點(diǎn)'] = [i.split('-')[0] for i in python_data['工作地點(diǎn)']]
city = python_data['工作地點(diǎn)'].value_counts()
city_list = [list(ct) for ct in city.items()]
def province_city():
    '''這是從接口里爬取的數(shù)據(jù)(不太準(zhǔn),但是誤差也可以忽略不計(jì)?。?''
    area_data = {}
    with open('./中國(guó)省份_城市.txt', mode='r', encoding='utf-8') as f:
        for line in f:
            line = line.strip().split('_')
            area_data[line[0]] = line[1].split(',')
    province_data = []
    for ct in city_list:
        for k, v in area_data.items():
            for i in v:
                if ct[0] in i:
                    ct[0] = k
                    province_data.append(ct)
    area_data_deepcopy = copy.deepcopy(area_data)
    for k in area_data_deepcopy.keys():
        area_data_deepcopy[k] = 0
    for i in province_data:
        if i[0] in area_data_deepcopy.keys():
            area_data_deepcopy[i[0]] = area_data_deepcopy[i[0]] +i[1]
    province_data = [[k,v]for k,v in area_data_deepcopy.items()]
    best = max(area_data_deepcopy.values())
    return province_data,best
province_data,best = province_city()
#地圖_中國(guó)地圖(帶省份)Map-VisualMap(連續(xù)型)
c2 = (
    Map()
    .add( "Python",province_data, "china")
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Python招聘崗位——全國(guó)分布情況"),
        visualmap_opts=opts.VisualMapOpts(max_=int(best / 2)),
    )
    .render("map_china.html")
)

這是 中國(guó)省份_城市.txt 里面的內(nèi)容,通過[接口]抓取到的中國(guó)地區(qū)信息。

源碼:

import requests
import json
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36",
}
response = requests.get('https://j.i8tq.com/weather2020/search/city.js',headers=header)
result = json.loads(response.text[len('var city_data ='):])
print(result)
each_province_data = {}
f = open('./中國(guó)省份_城市.txt',mode='w',encoding='utf-8')
for k,v in result.items():
    province = k
    if k in ['上海', '北京', '天津', '重慶']:
        city = ','.join(list(v[k].keys()))
    else:
        city = ','.join(list(v.keys()))
    f.write(f'{province}_{city}\n')
    each_province_data[province] = city
f.close()
print(each_province_data)

城市

這里對(duì)所在城市進(jìn)行可視化。

import pandas as pd
import copy
from pyecharts import options as opts
python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv')
python_data_deepcopy = copy.deepcopy(python_data) #深復(fù)制一份數(shù)據(jù)
python_data['工作地點(diǎn)'] = [i.split('-')[0] for i in python_data['工作地點(diǎn)']]
city = python_data['工作地點(diǎn)'].value_counts()
city_list = [list(ct) for ct in city.items()]
###地圖_中國(guó)地圖(帶城市)——Map-VisualMap(分段型)
from pyecharts.charts import Map
c1 = (
    Map(init_opts=opts.InitOpts(width="1244px", height="700px",page_title='Map-中國(guó)地圖(帶城市)', bg_color="#f4f4f4"))
    .add(
        "Python",
        city_list,
        "china-cities", #地圖
        label_opts=opts.LabelOpts(is_show=False),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Python招聘崗位——全國(guó)分布情況"),
        visualmap_opts=opts.VisualMapOpts(max_=city_list[0][1],is_piecewise=True),
    )
    .render("map_china_cities.html")
)

地區(qū)

這里對(duì)上海地區(qū)可視化。

import pandas as pd
import copy
from pyecharts import options as opts
python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv')
python_data_deepcopy = copy.deepcopy(python_data) #深復(fù)制一份數(shù)據(jù)
shanghai_data = []
sh = shanghai_data.append
for i in python_data_deepcopy['工作地點(diǎn)']:
    if '上海' in i:
        if len(i.split('-')) > 1:
            sh(i.split('-')[1])
shanghai_data = pd.Series(shanghai_data).value_counts()
shanghai_data_list = [list(sh) for sh in shanghai_data.items()]
#上海地圖
c3 = (
    Map()
    .add("Python", shanghai_data_list, "上海") ###這個(gè)可以更改地區(qū)(如:成都)這里改了的話,上面的數(shù)據(jù)處理也要做相應(yīng)的更改
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Map-上海地圖"),
        visualmap_opts=opts.VisualMapOpts(max_=shanghai_data_list[0][1])
    )
    .render("map_shanghai.html")
)

(3).餅圖Pie

Pie1

from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv')
require_list = []
rl = require_list.append
for i in python_data['招聘要求']:
    if '經(jīng)驗(yàn)' in i:
        rl(i.split(' ')[1])
    else:
        rl('未知')
python_data['招聘要求'] = require_list
require = python_data['招聘要求'].value_counts()
require_list = [list(ct) for ct in require.items()]
print(require_list)
c = (
    Pie()
    .add(
        "",
        require_list,
        radius=["40%", "55%"],
        label_opts=opts.LabelOpts(
            position="outside",
            formatter="{a|{a}}{abg|}\n{hr|}\n {b|: }{c}  {per|vvxyksv9kd%}  ",
            background_color="#eee",
            border_color="#aaa",
            border_width=1,
            border_radius=4,
            rich={
                "a": {"color": "#999", "lineHeight": 22, "align": "center"},
                "abg": {
                    "backgroundColor": "#e3e3e3",
                    "width": "100%",
                    "align": "right",
                    "height": 22,
                    "borderRadius": [4, 4, 0, 0],
                },
                "hr": {
                    "borderColor": "#aaa",
                    "width": "100%",
                    "borderWidth": 0.5,
                    "height": 0,
                },
                "b": {"fontSize": 16, "lineHeight": 33},
                "per": {
                    "color": "#eee",
                    "backgroundColor": "#334455",
                    "padding": [2, 4],
                    "borderRadius": 2,
                },
            },
        ),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="工作經(jīng)驗(yàn)要求"),
        legend_opts=opts.LegendOpts(padding=20, pos_left=500),
    )
    .render("pie_rich_label.html")
)

Pie2

from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv')
xueli_list = []
xl = xueli_list.append
for i in python_data['招聘要求']:
    if len(i.split(' ')) == 3:
        xl(i.split(' ')[2])
    else:
        xl('未知')
python_data['招聘要求'] = xueli_list
xueli_require = python_data['招聘要求'].value_counts()
xueli_require_list = [list(ct) for ct in xueli_require.items()]
c = (
    Pie()
    .add(
        "",
        xueli_require_list,
        radius=["30%", "55%"],
        rosetype="area",
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="學(xué)歷要求"))
    .render("pie_rosetype.html")
)

(4).折線圖Line

這里對(duì)薪資情況進(jìn)行可視化。

import pandas as pd
import re
python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv')
sal = python_data['薪資']
xin_zi1 = []
xin_zi2 = []
xin_zi3 = []
xin_zi4 = []
xin_zi5 = []
xin_zi6 = []
for s in sal:
    s = str(s)
    if '千' in s:
        xin_zi1.append(s)
    else:
        if re.findall('-(.*?)萬',s):
            s = float(re.findall('-(.*?)萬',s)[0])
            if 1.0<s<=1.5:
                xin_zi2.append(s)
            elif 1.5<s<=2.5:
                xin_zi3.append(s)
            elif 2.5<s<=3.2:
                xin_zi4.append(s)
            elif 3.2<s<=4.0:
                xin_zi5.append(s)
            else:
                xin_zi6.append(s)
xin_zi = [['<10k',len(xin_zi1)],['10~15k',len(xin_zi2)],['15<25k',len(xin_zi3)],
          ['25<32k',len(xin_zi4)],['32<40k',len(xin_zi5)],['>40k',len(xin_zi6),]]
import pyecharts.options as opts
from pyecharts.charts import Line
x, y =[i[0] for i in xin_zi],[i[1] for i in xin_zi]
c2 = (
    Line()
    .add_xaxis(x)
    .add_yaxis(
        "Python",
        y,
        markpoint_opts=opts.MarkPointOpts(
            data=[opts.MarkPointItem(name="max", coord=[x[2], y[2]], value=y[2])] #name='自定義標(biāo)記點(diǎn)'
        ),
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="薪資情況"),
                     xaxis_opts=opts.AxisOpts(name='薪資范圍'),  # 設(shè)置x軸名字屬性
                     yaxis_opts=opts.AxisOpts(name='數(shù)量'),  # 設(shè)置y軸名字屬性
                     )
    .render("line_markpoint_custom.html")
)

(5).組合圖表

最后,將多個(gè)html上的圖表進(jìn)行合并成一個(gè)html圖表。

首先,我們執(zhí)行下面這串格式的代碼(只寫了四個(gè)圖表,自己做相應(yīng)添加即可)

import pandas as pd
from pyecharts.charts import Bar,Map,Pie,Line,Page
from pyecharts import options as opts

python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv')
python_data['工作地點(diǎn)'] = [i.split('-')[0] for i in python_data['工作地點(diǎn)']]
city = python_data['工作地點(diǎn)'].value_counts()
city_list = [list(ct) for ct in city.items()]

###柱狀圖
def bar_datazoom_slider() -> Bar:
    c = (
        Bar()
        .add_xaxis(city.index.tolist()) #城市列表數(shù)據(jù)項(xiàng)
        .add_yaxis("Python", city.values.tolist())#城市對(duì)應(yīng)的崗位數(shù)量列表數(shù)據(jù)項(xiàng)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Python招聘崗位所在城市分布情況"),
            datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")],
            xaxis_opts=opts.AxisOpts(name='城市'),  # 設(shè)置x軸名字屬性
            yaxis_opts=opts.AxisOpts(name='崗位數(shù)量'),  # 設(shè)置y軸名字屬性
        )
    )
    return c
# 地圖_中國(guó)地圖(帶省份)Map-VisualMap(連續(xù)型)
def map_china() -> Map:
    import copy
    area_data = {}
    with open('./中國(guó)省份_城市.txt', mode='r', encoding='utf-8') as f:
        for line in f:
            line = line.strip().split('_')
            area_data[line[0]] = line[1].split(',')
    province_data = []
    for ct in city_list:
        for k, v in area_data.items():
            for i in v:
                if ct[0] in i:
                    ct[0] = k
                    province_data.append(ct)
    area_data_deepcopy = copy.deepcopy(area_data)
    for k in area_data_deepcopy.keys():
        area_data_deepcopy[k] = 0
    for i in province_data:
        if i[0] in area_data_deepcopy.keys():
            area_data_deepcopy[i[0]] = area_data_deepcopy[i[0]] + i[1]
    province_data = [[k, v] for k, v in area_data_deepcopy.items()]
    best = max(area_data_deepcopy.values())
    c = (
        Map()
            .add("Python", province_data, "china")
            .set_global_opts(
            title_opts=opts.TitleOpts(title="Python招聘崗位——全國(guó)分布情況"),
            visualmap_opts=opts.VisualMapOpts(max_=int(best / 2)),
        )
    )
    return c
#餅圖
def pie_rich_label() -> Pie:
    require_list = []
    rl = require_list.append
    for i in python_data['招聘要求']:
        if '經(jīng)驗(yàn)' in i:
            rl(i.split(' ')[1])
        else:
            rl('未知')
    python_data['招聘要求'] = require_list
    require = python_data['招聘要求'].value_counts()
    require_list = [list(ct) for ct in require.items()]
    c = (
        Pie()
            .add(
            "",
            require_list,
            radius=["40%", "55%"],
            label_opts=opts.LabelOpts(
                position="outside",
                formatter="{a|{a}}{abg|}\n{hr|}\n {b|: }{c}  {per|vvxyksv9kd%}  ",
                background_color="#eee",
                border_color="#aaa",
                border_width=1,
                border_radius=4,
                rich={
                    "a": {"color": "#999", "lineHeight": 22, "align": "center"},
                    "abg": {
                        "backgroundColor": "#e3e3e3",
                        "width": "100%",
                        "align": "right",
                        "height": 22,
                        "borderRadius": [4, 4, 0, 0],
                    },
                    "hr": {
                        "borderColor": "#aaa",
                        "width": "100%",
                        "borderWidth": 0.5,
                        "height": 0,
                    },
                    "b": {"fontSize": 16, "lineHeight": 33},
                    "per": {
                        "color": "#eee",
                        "backgroundColor": "#334455",
                        "padding": [2, 4],
                        "borderRadius": 2,
                    },
                },
            ),
        )
            .set_global_opts(
            title_opts=opts.TitleOpts(title="工作經(jīng)驗(yàn)要求"),
            legend_opts=opts.LegendOpts(padding=20, pos_left=500),
        )
    )
    return c
#折線圖
def line_markpoint_custom() -> Line:
    import re
    sal = python_data['薪資']
    xin_zi1 = []
    xin_zi2 = []
    xin_zi3 = []
    xin_zi4 = []
    xin_zi5 = []
    xin_zi6 = []
    for s in sal:
        s = str(s)
        if '千' in s:
            xin_zi1.append(s)
        else:
            if re.findall('-(.*?)萬',s):
                s = float(re.findall('-(.*?)萬',s)[0])
                if 1.0<s<=1.5:
                    xin_zi2.append(s)
                elif 1.5<s<=2.5:
                    xin_zi3.append(s)
                elif 2.5<s<=3.2:
                    xin_zi4.append(s)
                elif 3.2<s<=4.0:
                    xin_zi5.append(s)
                else:
                    xin_zi6.append(s)
    xin_zi = [['<10k',len(xin_zi1)],['10~15k',len(xin_zi2)],['15<25k',len(xin_zi3)],
              ['25<32k',len(xin_zi4)],['32<40k',len(xin_zi5)],['>40k',len(xin_zi6),]]
    x, y =[i[0] for i in xin_zi],[i[1] for i in xin_zi]
    c = (
        Line()
        .add_xaxis(x)
        .add_yaxis(
            "Python",
            y,
            markpoint_opts=opts.MarkPointOpts(
                data=[opts.MarkPointItem(name="MAX", coord=[x[2], y[2]], value=y[2])]
            ),
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="薪資情況"),
                         xaxis_opts=opts.AxisOpts(name='薪資范圍'),  # 設(shè)置x軸名字屬性
                         yaxis_opts=opts.AxisOpts(name='數(shù)量'),  # 設(shè)置y軸名字屬性
                         )
    )
    return c
#合并
def page_draggable_layout():
    page = Page(layout=Page.DraggablePageLayout)
    page.add(
        bar_datazoom_slider(),
        map_china(),
        pie_rich_label(),
        line_markpoint_custom(),
    )
    page.render("page_draggable_layout.html")

if __name__ == "__main__":
    page_draggable_layout()

執(zhí)行完后,會(huì)在當(dāng)前目錄下生成一個(gè)page_draggable_layout.html。

然后我們用瀏覽器打開,就會(huì)看到下面這樣,我們可以隨便拖動(dòng)虛線框來進(jìn)行組合,組合好后點(diǎn)擊Save Config就會(huì)下載一個(gè)chart_config.json,然后在文件中找到它,剪切到py當(dāng)前目錄。

文件放置好后,可以新建一個(gè)py文件來執(zhí)行以下代碼,這樣就會(huì)生成一個(gè)resize_render.html,也就完成了。

from pyecharts.charts import Page
Page.save_resize_html('./page_draggable_layout.html',cfg_file='chart_config.json')

最后,點(diǎn)擊打開resize_render.html,我們合并成功的圖表就是這樣啦!

總結(jié)

到此這篇關(guān)于Python抓取數(shù)據(jù)并可視化的文章就介紹到這了,更多相關(guān)Python抓取數(shù)據(jù)可視化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python3實(shí)現(xiàn)高效的端口掃描

    python3實(shí)現(xiàn)高效的端口掃描

    這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)高效的端口掃描,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Python提取網(wǎng)頁中超鏈接的方法

    Python提取網(wǎng)頁中超鏈接的方法

    很多人在一開始學(xué)習(xí)Python,會(huì)打算用作爬蟲開發(fā)。既然要做爬蟲,首先就要抓取網(wǎng)頁,并且從網(wǎng)頁中提取出超鏈接地址。這篇文章給大家分享一個(gè)簡(jiǎn)單的方法,有需要的可以參考借鑒。
    2016-09-09
  • anaconda python3.8安裝后降級(jí)

    anaconda python3.8安裝后降級(jí)

    想給新的環(huán)境安裝pip install tensorflow,結(jié)果報(bào)錯(cuò)了。網(wǎng)上了解可以降級(jí)為3.6,本文就詳細(xì)的介紹一下,感興趣的小伙伴們可以參考一下
    2021-06-06
  • python tkinter組件擺放方式詳解

    python tkinter組件擺放方式詳解

    這篇文章主要介紹了python tkinter組件擺放方式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 使用 Python 玩轉(zhuǎn) GitHub 的貢獻(xiàn)板(推薦)

    使用 Python 玩轉(zhuǎn) GitHub 的貢獻(xiàn)板(推薦)

    這篇文章主要介紹了使用 Python 玩轉(zhuǎn) GitHub 的貢獻(xiàn)板的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • Python中利用pyqt5制作指針鐘表顯示實(shí)時(shí)時(shí)間(指針時(shí)鐘)

    Python中利用pyqt5制作指針鐘表顯示實(shí)時(shí)時(shí)間(指針時(shí)鐘)

    這篇文章主要介紹了Python中利用pyqt5制作指針鐘表顯示實(shí)時(shí)時(shí)間(動(dòng)態(tài)指針時(shí)鐘),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • python繪制橫豎條形圖的方法

    python繪制橫豎條形圖的方法

    這篇文章主要為大家詳細(xì)介紹了python繪制橫豎條形圖的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • python中count函數(shù)簡(jiǎn)單用法

    python中count函數(shù)簡(jiǎn)單用法

    在本篇文章里小編給大家整理的是一篇關(guān)于python中count函數(shù)簡(jiǎn)單用法以及相關(guān)實(shí)例,需要的朋友們學(xué)習(xí)下。
    2020-01-01
  • 在keras中model.fit_generator()和model.fit()的區(qū)別說明

    在keras中model.fit_generator()和model.fit()的區(qū)別說明

    這篇文章主要介紹了在keras中model.fit_generator()和model.fit()的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python3制作捧腹網(wǎng)段子頁爬蟲

    python3制作捧腹網(wǎng)段子頁爬蟲

    網(wǎng)上的Python教程大都是2.X版本的,python2.X和python3.X相比較改動(dòng)比較大,好多庫的用法不太一樣,我安裝的是python3.X,我們來看看詳細(xì)的例子
    2017-02-02

最新評(píng)論