selenium爬取艺恩并数据化展示

爬取数据部分

导包
from selenium.webdriver import Chrome
from selenium.webdriver.support.select import Select
from time import sleep
from selenium.webdriver.chrome.options import Options
无头和防屏蔽设置(固定代码,一般最后加上)
opt = Options()
opt.add_argument('--headless')
opt.add_argument('--disable gpu')
请求网址并事先创建一个文件
chrome = Chrome(options=opt)
url = 'https://www.endata.com.cn/BoxOffice/BO/Year/index.html'
chrome.get(url)
sleep(1)
f = open('./movies.csv', mode='a',encoding='utf-8')
support库里面的Select模块处理年份问题
select_el = chrome.find_element_by_id('OptionDate')
# 找到切换年份对应的element
select = Select(select_el)
for i in range(len(select.options)):
    select.select_by_index(i)
    # 用索引的方式进行切换页面
    sleep(2)
    tr_list = chrome.find_elements_by_xpath('//table[@class="bo-table img-table"]//tr')[1:]
    for tr in tr_list:
        for td in tr.find_elements_by_xpath('./td'):
            f.write(td.text.strip())
            f.write(',')
        f.write('\n')
    f.write('\n\n')
    print('第%d页打印完毕' % i)

chrome.close()

数据处理部分

导包
import pandas as pd
数据的清洗,去重
data = pd.read_csv('./movies.csv', header=None)
data = data.loc[:, 2:4]
data[5] = data[2].map(lambda i: i.split('/')[0])
# 对数据进行处理,分割后的列表第一个放在第五行中
data[6] = data[2].map(lambda i: i.split('/')[1] if '/' in i else 666)
# 对数据进行处理,先进行判断,分割后的列表第2个放在第六行中
data[7] = data[3].astype(str) + data[4].astype(str)
# 列表数据字符串化,然后进行拼接
data_1 = data.loc[:,[5,7]]
data_2 = data.loc[:, [6,7]]
data_2 = data_2.loc[data_2[6] != 666]
# 筛选数据
data_2 = data_2.rename(columns={6:5})
# print(data_1)
# print(data_2)
data = data_1.append(data_2)
data = data.rename(columns={5:'type',7:'money'})
# 分成两个列表,进行数据筛选拼接,并重命名列表名
# print(data)
data['money'] = data['money'].astype(int)
booking_o = data.groupby('type').mean().round(2)
# 以type这 一样作为基准进行求平均值,保留小数点后两位
booking_o = booking_o.drop(['-'])

booking_o.to_csv('./数据.csv')
# print(booking_o)

可视化展示

导包
from flask import Flask,render_template
import pandas as pd
Flask可视化展示
app = Flask(__name__)

@app.route('/')
def index():
    data = pd.read_csv('./数据.csv')
    data.columns = ['name','value']
    # print(data)
    data = data.loc[:,['value','name']]
    data['value'] = data['value']//1000
    data = data.to_dict(orient='records')
    # 转化成echart所需要的字典形式
    # print(data)
    return render_template('数据.html',data=data)
    # 一定要代码所在文件夹创建一个templates文件夹(名字固定,不可变).
    #  html文件保存templates文件夹中才可被读取到
    

if __name__ == '__main__':
    app.run(debug=True)
HTML界面与echart源代码的结合
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!---引入echarts--->
    <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.0.2/echarts.min.js"></script>
    <div id="main" style="width: 800px;height:600px;blackgroup:pink"></div>
     <script type="text/javascript">
        var myChart = echarts.init(document.getElementById('main'));
        var option = {
                legend: {
                    top: 'bottom'
                },
                toolbox: {
                    show: true,
                    feature: {
                        mark: {show: true},
                        dataView: {show: true, readOnly: false},
                        restore: {show: true},
                        saveAsImage: {show: true}
                    }
                },
                series: [
                    {
                        name: '面积模式',
                        type: 'pie',
                        radius: [50, 250],
                        # 调节半径值与数据值进行适配,改变饼图展示模样
                        center: ['50%', '50%'],
                        roseType: 'area',
                        itemStyle: {
                            borderRadius: 8
                        },
                        data:{{data|tojson}}
                        # 一定要加上 |tojson 把字典转换成字符串才能展示
                    }
                ]
            };
         myChart.setOption(option);
      </script>
      # 使用的饼图链接:https://echarts.apache.org/examples/zh/editor.html?c=pie-custom
</body>
</html>
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值