首页 > 其他分享 >大数据分析——对游戏“野蛮时代”玩家进行大数据分析

大数据分析——对游戏“野蛮时代”玩家进行大数据分析

时间:2023-06-07 13:22:04浏览次数:36  
标签:数据分析 count 野蛮 pay sum 玩家 case else price

一、选题的背景

  对游戏“野蛮时代”进行数据分析,首先离不开对游戏的了解,不了解游戏很可能会影响自己的分析,从而得出错误的结论。在体验了游戏之余,混迹了微博、贴吧等社群,对游戏的玩法有了一定了解后,对数据集的各种字段代表的含义也有了一定的理解,由此开始对该数据集进行数据分析。本次大数据分析主要分析了一款游戏的用户数据情况,包括付费和非付费用户的比例、每日、每小时新增用户的数量、平均在线时长、付费比率、游戏胜率和游戏场次等多个方面。

  通过对这些数据指标的分析,可以更好地了解用户的需求和行为,从而优化游戏设计和运营策略,提高用户满意度和留存率。

二、数据分析设计方案

  使用了数据库链接工具,了解数据库,通过sql语句查出来符合分析要求的数据通过pandas分析matplotlib和pyecharts画图分析出来可视化结果。

三、数据分析步骤

1、数据源:数据来源于野蛮官网

2、数据清洗过程:

import pandas as pd
from sqlalchemy import create_engine

df = pd.read_csv("tap_fun_test.csv")
df1 = pd.read_csv("tap_fun_train.csv")
list1 = []
df = df[
    ['user_id', 'register_time', 'pvp_battle_count', 'pvp_lanch_count', 'pvp_win_count', 'pve_battle_count',
     'pve_lanch_count', 'pve_win_count', 'avg_online_minutes', 'pay_price', 'pay_count']
]
df1 = df1[
    ['user_id', 'register_time', 'pvp_battle_count', 'pvp_lanch_count', 'pvp_win_count', 'pve_battle_count',
     'pve_lanch_count', 'pve_win_count', 'avg_online_minutes', 'pay_price', 'pay_count']
]
list1.append(df)
list1.append(df1)
data = pd.concat(list1)
engine = create_engine('mysql://root:LAS1234567878@12@localhost:3306/big?charset=utf8')
data.to_sql('age_of_barbarians', con=engine, index=False, if_exists='append')

3、大数据分析过程

import os
import pandas as pd
from sqlalchemy import create_engine
from pyecharts import options as opts
from pyecharts.charts import Pie, Line, Bar, Liquid

engine = create_engine('mysql://root:LAS1234567878@12@localhost/big?charset=utf8')

# PU 占比
sql = """
select sum(case when pay_price > 0 then 1 else 0 end) as `付费用户`,
       sum(case when pay_price > 0 then 0 else 1 end) as `非付费用户`
from age_of_barbarians
"""
data = pd.read_sql(con=engine, sql=sql)
c1 = (
    Pie()
    .add(
        "",
        [list(z) for z in zip(data.columns, data.values[0])],
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} 占比: {d}%"))
    .render("pie_pu.html")
)
os.system("pie_pu.html")

# DNU 柱形图
sql = """
select cast(register_time as date) as day,
       count(1) as dnu
from age_of_barbarians
group by cast(register_time as date)
order by day;
"""
data = pd.read_sql(con=engine, sql=sql)

c2 = (
    Bar()
    .add_xaxis(list(data['day']))
    .add_yaxis("新增用户数", list(data['dnu']))
    .set_global_opts(title_opts=opts.TitleOpts(title="每日新增用户数量"))
    .render("bar_dnu.html")
)
os.system("bar_dnu.html")

# 每小时注册情况
sql = """
select hour(cast(register_time as datetime)) as hour,
       count(1) as dnu
from age_of_barbarians
group by hour(cast(register_time as datetime))
order by hour;
"""
data = pd.read_sql(con=engine, sql=sql)
c3 = (
    Line()
    .add_xaxis(list(data['hour']))
    .add_yaxis("新增用户数", list(data['dnu']))
    .set_global_opts(title_opts=opts.TitleOpts(title="每小时新增用户数量"))
    .render("line_dnu.html")
)
os.system("line_dnu.html")

# 每小时注册情况
sql = """
select avg(avg_online_minutes) as `平均在线时长`,
       sum(case when pay_price > 0 then avg_online_minutes else 0 end) / sum(case when pay_price > 0 then 1 else 0 end) as `付费玩家在线时长`,
       sum(case when pay_price > 0 then 0 else avg_online_minutes end) / sum(case when pay_price > 0 then 0 else 1 end) as `非付费玩家在线时长`
from age_of_barbarians;
"""
data = pd.read_sql(con=engine, sql=sql)
c4 = (
    Bar()
    .add_xaxis(list(data.columns))
    .add_yaxis("平均在线时长(单位:分钟)", list(data.values[0]))
    .set_global_opts(title_opts=opts.TitleOpts(title="平均在线时长"))
    .render("bar_online.html")
)
os.system("bar_online.html")

# 付费比率
sql = """
select sum(case when avg_online_minutes > 0 and pay_price > 0 then 1 else 0 end) / sum(case when avg_online_minutes > 0 then 1 else 0 end) as `rate`
from age_of_barbarians;  
"""
data = pd.read_sql(con=engine, sql=sql)
c5 = (
    Liquid()
    .add("lq", [data['rate'][0], data['rate'][0]])
    .set_global_opts(title_opts=opts.TitleOpts(title="付费比率"))
    .render("liquid_base.html")
)
os.system("liquid_base.html")

# 用户游戏胜率
sql = """
select 'PVP' as `游戏类型`,
       sum(pvp_win_count) / sum(pvp_battle_count) as `平均胜率`,
       sum(case when pay_price > 0 then pvp_win_count else 0 end) / sum(case when pay_price > 0 then pvp_battle_count else 0 end) as `付费用户胜率`,
       sum(case when pay_price = 0 then pvp_win_count else 0 end) / sum(case when pay_price = 0 then pvp_battle_count else 0 end) as `非付费用户胜率`
from age_of_barbarians
union all
select 'PVE' as `游戏类型`,
       sum(pve_win_count) / sum(pve_battle_count) as `平均胜率`,
       sum(case when pay_price > 0 then pve_win_count else 0 end) / sum(case when pay_price > 0 then pve_battle_count else 0 end) as `付费用户胜率`,
       sum(case when pay_price = 0 then pve_win_count else 0 end) / sum(case when pay_price = 0 then pve_battle_count else 0 end) as `非付费用户胜率`
from age_of_barbarians
"""
data = pd.read_sql(con=engine, sql=sql)
c6 = (
    Bar()
    .add_dataset(
        source=[data.columns.tolist()] + data.values.tolist()
    )
    .add_yaxis(series_name="平均胜率", y_axis=[])
    .add_yaxis(series_name="付费用户胜率", y_axis=[])
    .add_yaxis(series_name="非付费用户胜率", y_axis=[])
    .set_global_opts(
        title_opts=opts.TitleOpts(title="游戏胜率"),
        xaxis_opts=opts.AxisOpts(type_="category"),
    )
    .render("dataset_bar_rate.html")
)
os.system("dataset_bar_rate.html")

# 用户游戏场次
sql = """
select 'PVP' as `游戏类型`,
       avg(pvp_battle_count) as `平均场次`,
       sum(case when pay_price > 0 then pvp_battle_count else 0 end) / sum(case when pay_price > 0 then 1 else 0 end) as `付费用户平均场次`,
       sum(case when pay_price = 0 then pvp_battle_count else 0 end) / sum(case when pay_price = 0 then 1 else 0 end) as `非付费用户平均场次`
from age_of_barbarians
union all
select 'PVE' as `游戏类型`,
       avg(pve_battle_count) as `均场次`,
       sum(case when pay_price > 0 then pve_battle_count else 0 end) / sum(case when pay_price > 0 then 1 else 0 end) as `付费用户平均场次`,
       sum(case when pay_price = 0 then pve_battle_count else 0 end) / sum(case when pay_price = 0 then 1 else 0 end) as `非付费用户平均场次`
from age_of_barbarians
"""
data = pd.read_sql(con=engine, sql=sql)
c7 = (
    Bar()
    .add_dataset(
        source=[data.columns.tolist()] + data.values.tolist()
    )
    .add_yaxis(series_name="平均场次", y_axis=[])
    .add_yaxis(series_name="付费用户平均场次", y_axis=[])
    .add_yaxis(series_name="非付费用户平均场次", y_axis=[])
    .set_global_opts(
        title_opts=opts.TitleOpts(title="游戏场次"),
        xaxis_opts=opts.AxisOpts(type_="category"),
    )
    .render("dataset_bar_times.html")
)
os.system("dataset_bar_times.html")

4、数据可视化过程

(1)、解决精度问题、修改字段类型

 

-- 解决精度问题
-- 修改字段类型
alter table age_of_barbarians
    modify register_time timestamp(0);
alter table age_of_barbarians
    modify avg_online_minutes float(10, 2);
alter table age_of_barbarians
    modify pay_price float(10, 2);

 

 

(2)、用户分析

 

-- 1.用户分析

-- 用户总量
select count(1) as total, count(distinct user_id) as users
from age_of_barbarians;

-- PU ( Paying Users):付费用户总量
select sum(case when pay_price > 0 then 1 else 0 end) as `付费用户`,
       sum(case when pay_price > 0 then 0 else 1 end) as `非付费用户`
from age_of_barbarians;

-- DNU(Daily New Users): 每日游戏中的新登入用户数量,即每日新用户数。
select cast(register_time as date) as day,
       count(1)                    as dnu
from age_of_barbarians
group by cast(register_time as date)
order by day;

-- 每小时的新登入用户数量
select hour(cast(register_time as datetime)) as hour,
       count(1)                              as dnu
from age_of_barbarians
group by hour(cast(register_time as datetime))

 

 

(3)、用户活跃度分析

 

# 2.用户活跃度分析
-- 平均在线时长
select avg(avg_online_minutes)                        as `平均在线时长`,
       sum(case when pay_price > 0 then avg_online_minutes else 0 end) /
       sum(case when pay_price > 0 then 1 else 0 end) as `付费用户在线时长`,
       sum(case when pay_price > 0 then 0 else avg_online_minutes end) /
       sum(case when pay_price > 0 then 0 else 1 end) as `非付费用户在线时长`
from age_of_barbarians;

(4)、用户付费情况分析

 

# --3.用户付费情况分析

-- APA(Active Payment Account):活跃付费用户数。
select count(1) as APA
from age_of_barbarians
where pay_price > 0
  and avg_online_minutes > 0;
-- 60987

-- ARPU(Average Revenue Per User) :平均每用户收入。
select sum(pay_price) / sum(case when avg_online_minutes > 0 then 1 else 0 end)
from age_of_barbarians;
-- 0.582407

-- ARPPU (Average Revenue Per Paying User): 平均每付费用户收入。
select sum(pay_price) / sum(case when avg_online_minutes > 0 and pay_price > 0 then 1 else 0 end)
from age_of_barbarians;
-- 29.190265

-- PUR(Pay User Rate):付费比率,可通过 APA/AU 计算得出。
select sum(case when avg_online_minutes > 0 and pay_price > 0 then 1 else 0 end) /
       sum(case when avg_online_minutes > 0 then 1 else 0 end)
from age_of_barbarians;
-- 0.02

-- 付费用户人数,付费总额,付费总次数,平均每人付费,平均每人付费次数,平均每次付费
select count(1)                        as pu,            -- 60988
       sum(pay_price)                  as sum_pay_price, -- 1780226.7
       avg(pay_price)                  as avg_pay_price, -- 29.189786
       sum(pay_count)                  as sum_pay_count, -- 193030
       avg(pay_count)                  as avg_pay_count, -- 3.165
       sum(pay_price) / sum(pay_count) as each_pay_price -- 9.222539
from age_of_barbarians
where pay_price > 0;

 

 (5)、用户习惯分析

# --4.用户习惯分析
#
# --胜率
select 'PVP'                                                         as `游戏类型`,
       sum(pvp_win_count) / sum(pvp_battle_count)                    as `平均胜率`,
       sum(case when pay_price > 0 then pvp_win_count else 0 end) /
       sum(case when pay_price > 0 then pvp_battle_count else 0 end) as `付费用户胜率`,
       sum(case when pay_price = 0 then pvp_win_count else 0 end) /
       sum(case when pay_price = 0 then pvp_battle_count else 0 end) as `非付费用户胜率`
from age_of_barbarians
union all
select 'PVE'                                                         as `游戏类型`,
       sum(pve_win_count) / sum(pve_battle_count)                    as `平均胜率`,
       sum(case when pay_price > 0 then pve_win_count else 0 end) /
       sum(case when pay_price > 0 then pve_battle_count else 0 end) as `付费用户胜率`,
       sum(case when pay_price = 0 then pve_win_count else 0 end) /
       sum(case when pay_price = 0 then pve_battle_count else 0 end) as `非付费用户胜率`
from age_of_barbarians;

# --pvp场次
select 'PVP'                                                                                                          as `游戏类型`,
       avg(pvp_battle_count)                                                                                          as `平均场次`,
       sum(case when pay_price > 0 then pvp_battle_count else 0 end) /
       sum(case when pay_price > 0 then 1 else 0 end)                                                                 as `付费用户平均场次`,
       sum(case when pay_price = 0 then pvp_battle_count else 0 end) /
       sum(case when pay_price = 0 then 1 else 0 end)                                                                 as `非付费用户平均场次`
from age_of_barbarians
union all
select 'PVE'                                                                                                          as `游戏类型`,
       avg(pve_battle_count)                                                                                          as `均场次`,
       sum(case when pay_price > 0 then pve_battle_count else 0 end) /
       sum(case when pay_price > 0 then 1 else 0 end)                                                                 as `付费用户平均场次`,
       sum(case when pay_price = 0 then pve_battle_count else 0 end) /
       sum(case when pay_price = 0 then 1 else 0 end)                                                                 as `非付费用户平均场次`
from age_of_barbarians

 

 

5、完成程序源代码

(1)、数据清洗部分

import pandas as pd

from sqlalchemy import create_engine

 

df = pd.read_csv("tap_fun_test.csv")

df1 = pd.read_csv("tap_fun_train.csv")

list1 = []

df = df[

    ['user_id', 'register_time', 'pvp_battle_count', 'pvp_lanch_count', 'pvp_win_count', 'pve_battle_count',

     'pve_lanch_count', 'pve_win_count', 'avg_online_minutes', 'pay_price', 'pay_count']

]

df1 = df1[

    ['user_id', 'register_time', 'pvp_battle_count', 'pvp_lanch_count', 'pvp_win_count', 'pve_battle_count',

     'pve_lanch_count', 'pve_win_count', 'avg_online_minutes', 'pay_price', 'pay_count']

]

list1.append(df)

list1.append(df1)

data = pd.concat(list1)

engine = create_engine('mysql://root:LAS1234567878@12@localhost:3306/big?charset=utf8')

data.to_sql('age_of_barbarians', con=engine, index=False, if_exists='append')

(2)、分析python部分

import os

import pandas as pd

from sqlalchemy import create_engine

from pyecharts import options as opts

from pyecharts.charts import Pie, Line, Bar, Liquid

 

engine = create_engine('mysql://root:LAS1234567878@12@localhost/big?charset=utf8')

 

# PU 占比

sql = """

select sum(case when pay_price > 0 then 1 else 0 end) as `付费用户`,

       sum(case when pay_price > 0 then 0 else 1 end) as `非付费用户`

from age_of_barbarians

"""

data = pd.read_sql(con=engine, sql=sql)

c1 = (

    Pie()

    .add(

        "",

        [list(z) for z in zip(data.columns, data.values[0])],

    )

    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} 占比: {d}%"))

    .render("pie_pu.html")

)

os.system("pie_pu.html")

 

# DNU 柱形图

sql = """

select cast(register_time as date) as day,

       count(1) as dnu

from age_of_barbarians

group by cast(register_time as date)

order by day;

"""

data = pd.read_sql(con=engine, sql=sql)

 

c2 = (

    Bar()

    .add_xaxis(list(data['day']))

    .add_yaxis("新增用户数", list(data['dnu']))

    .set_global_opts(title_opts=opts.TitleOpts(title="每日新增用户数量"))

    .render("bar_dnu.html")

)

os.system("bar_dnu.html")

 

# 每小时注册情况

sql = """

select hour(cast(register_time as datetime)) as hour,

       count(1) as dnu

from age_of_barbarians

group by hour(cast(register_time as datetime))

order by hour;

"""

data = pd.read_sql(con=engine, sql=sql)

c3 = (

    Line()

    .add_xaxis(list(data['hour']))

    .add_yaxis("新增用户数", list(data['dnu']))

    .set_global_opts(title_opts=opts.TitleOpts(title="每小时新增用户数量"))

    .render("line_dnu.html")

)

os.system("line_dnu.html")

 

# 每小时注册情况

sql = """

select avg(avg_online_minutes) as `平均在线时长`,

       sum(case when pay_price > 0 then avg_online_minutes else 0 end) / sum(case when pay_price > 0 then 1 else 0 end) as `付费玩家在线时长`,

       sum(case when pay_price > 0 then 0 else avg_online_minutes end) / sum(case when pay_price > 0 then 0 else 1 end) as `非付费玩家在线时长`

from age_of_barbarians;

"""

data = pd.read_sql(con=engine, sql=sql)

c4 = (

    Bar()

    .add_xaxis(list(data.columns))

.add_yaxis("平均在线时长(单位:

(3)、分析sql部分(可视化部分)

-- 解决精度问题

-- 修改字段类型

alter table age_of_barbarians

    modify register_time timestamp(0);

alter table age_of_barbarians

    modify avg_online_minutes float(10, 2);

alter table age_of_barbarians

    modify pay_price float(10, 2);

 

-- 1.用户分析

 

-- 用户总量

select count(1) as total, count(distinct user_id) as users

from age_of_barbarians;

 

-- PU ( Paying Users):付费用户总量

select sum(case when pay_price > 0 then 1 else 0 end) as `付费用户`,

       sum(case when pay_price > 0 then 0 else 1 end) as `非付费用户`

from age_of_barbarians;

 

-- DNU(Daily New Users): 每日游戏中的新登入用户数量,即每日新用户数。

select cast(register_time as date) as day,

       count(1)                    as dnu

from age_of_barbarians

group by cast(register_time as date)

order by day;

 

-- 每小时的新登入用户数量

select hour(cast(register_time as datetime)) as hour,

       count(1)                              as dnu

from age_of_barbarians

group by hour(cast(register_time as datetime))

order by hour;

 

 

# 2.用户活跃度分析

-- 平均在线时长

select avg(avg_online_minutes)                        as `平均在线时长`,

       sum(case when pay_price > 0 then avg_online_minutes else 0 end) /

       sum(case when pay_price > 0 then 1 else 0 end) as `付费用户在线时长`,

       sum(case when pay_price > 0 then 0 else avg_online_minutes end) /

       sum(case when pay_price > 0 then 0 else 1 end) as `非付费用户在线时长`

from age_of_barbarians;

 

 

 

# --3.用户付费情况分析

 

-- APA(Active Payment Account):活跃付费用户数。

select count(1) as APA

from age_of_barbarians

where pay_price > 0

  and avg_online_minutes > 0;

-- 60987

 

-- ARPU(Average Revenue Per User) :平均每用户收入。

select sum(pay_price) / sum(case when avg_online_minutes > 0 then 1 else 0 end)

from age_of_barbarians;

-- 0.582407

 

-- ARPPU (Average Revenue Per Paying User): 平均每付费用户收入。

select sum(pay_price) / sum(case when avg_online_minutes > 0 and pay_price > 0 then 1 else 0 end)

from age_of_barbarians;

-- 29.190265

 

-- PUR(Pay User Rate):付费比率,可通过 APA/AU 计算得出。

select sum(case when avg_online_minutes > 0 and pay_price > 0 then 1 else 0 end) /

       sum(case when avg_online_minutes > 0 then 1 else 0 end)

from age_of_

四、总结

 

1、通过对数据的挖掘和对这些数据指标的分析,可以更好地了解用户的需求和行为,从而优化游戏设计和运营策略,提高用户满意度和留存率。

 

2、通过这次的课程设计,加强了我在python高级运用的技能。途中遇到麻烦时还请教了数据库老师,向他答疑解惑,与此同时我也更加清楚和了解如何结合使用sql和python对大数据进行分析。

 

 

 

 

 

标签:数据分析,count,野蛮,pay,sum,玩家,case,else,price
From: https://www.cnblogs.com/joyceLinjj/p/17463042.html

相关文章

  • 大数据分析——对世界杯比赛进行分析及预测
    (一)选题背景:世界杯比赛是全球最大规模的国际足球赛事之一,吸引着数以亿计的观众。对于球迷和体育爱好者来 说,预测比赛结果是一项有趣且具有挑战性的任务。足球比赛结果的预测可以帮助球迷制定投注策略、提供比赛观看的参考以及评估球队和球员的表现。(二)方案设计:从网站中下载相关......
  • 对粮食产量进行大数据分析
    一、选题背景 近年来,我国各个省份的粮食总产量以及增量增速逐渐倍受关注,如何增加粮食产量也成为了人们关注的热点话题。通过互联网上的信息发布网站,我获取并整合了各省粮食产量数据。其中,“中国产业信息网”每年发布的国内新一年的粮食产量信息。网站发布的信息包括近些年的粮......
  • 对人力资源分析案例研究数据集进行数据分析
    一.选题背景近年就业面临着诸多挑战。一方面,经济的不景气和就业市场的不稳定性使得就业难度加大,就业形势越来越严峻。另一方面,高校毕业生的数量不断增加,而就业岗位的数量却没有相应增加,导致竞争激烈,难以找到合适的工作。此外,还有一些特殊的问题,如女性就业歧视、农村学生就业难等,......
  • 大数据分析--南瓜籽品种分类
    大数据分析--南瓜籽品种分类 1.选题背景南瓜籽为南瓜的种子,葫芦科南瓜属植物南瓜CucurbitamoschataDuch.的种子。一端略尖,外表黄白色,边缘稍有棱,表面带有毛茸。除去种皮,可见绿色菲薄的胚乳,具有健脑提神、降压镇痛、驱虫等功效。南瓜籽因其含有足量的蛋白质、脂肪、碳水化合物......
  • 京东数据分析软件工具(京东618销量查询)
    这一期,我们主要分享今年618京东美妆个护类的预售数据,包括面部护肤、香水彩妆、男士面部护肤品类。-面部护肤-今年618,面部护肤品类在京东累计预售量达到130万件,预售额达到13亿元。预售期间,护肤品类均价在1010元左右。期间,约有381个热销品牌和500家热销店铺,是今年预售期间涉及品牌和......
  • 做好这几点,数据分析入门也不难
    是的,数据分析入门并不难,只需要具备一定的数学基础、编程技能和实践经验,再结合一些有效的学习方法和注意事项,就可以快速地掌握数据分析的基本概念和方法。以下是几个做好数据分析入门的关键点:建立数学和统计学基础数据分析离不开数学和统计学的基础知识,因此需要学习线性代数、微......
  • python——pandas数据分析(表格处理)工具实现Apriori算法
    pandas是基于NumPy的一种工具,名字很卡哇伊,来源是由“Paneldata”(面板数据,一个计量经济学名词)两个单词拼成的。pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。主要应用于处理大型数据集。数据处理速度算是最大的特色,剩下的就是个python版的exc......
  • 传奇如何封玩家IP?如何通过关键词过滤玩家消息?
    相信挺多开服的GM多多少少有遇到几个胡搅蛮缠的玩家,不充值要求还多,这种玩家留着也影响开服心情,所以今天就给大家分享一个封玩家IP和关键词的方法要想封玩家的IP,需要先知道那个玩家的IP,打开传奇引擎,找到一个网关,页面如下图,点击查看,在线人物,就可以看到正在玩的玩家信息,找到那个玩家,可......
  • # yyds干货盘点 # #经验分享# #网络爬虫# #数据分析# #Python# #每日打卡# #进阶学习#
    大家好,我是皮皮。一、前言前几天在Python群【洋洋】问了一个Python基础的问题,这里拿出来给大家分享下。二、实现过程这里【kim】给出了代码,如下所示:的确满足了粉丝的需求。很多人应该和我一样,想到的是zip吧。zip完全可以,可是他说要for,所以上面演示的是for循环。那么如果通过zip函数......
  • 电商数据分析--常见的数据采集工具及方法
    电商数据分析--常见的数据采集工具及方法数据采集工具火车采集器:可以做数据抓取,数据清洗、分析、挖掘、可视化等。搜集客:采集数据,所有爬虫需要在自己电脑上跑。八爪鱼:免费版、付费版(云采集)。有固定模板,也可以自定义任务。python爬虫:自行编写代码爬取数据(对python编程有一定的要求......