selenium爬取艺恩并数据化展示
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
1
数据的清洗,去重
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
1
2
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>