import requests
from bs4 import BeautifulSoup
import sqlite3
import openpyxl
from openpyxl.chart import BarChart, Reference

# 爬取皮肤图片
def get_skin_imgs():
    url = 'https://pvp.qq.com/web201605/herolist.shtml'
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'lxml')
    hero_list = soup.find_all('a', class_='herolist__icon')
    skin_imgs = []
    for hero in hero_list:
        hero_url = 'https://pvp.qq.com/web201605/' + hero['href']
        hero_r = requests.get(hero_url)
        hero_soup = BeautifulSoup(hero_r.content, 'lxml')
        hero_name = hero_soup.find('h2').text
        skin_list = hero_soup.find_all('div', class_='pic-pf')
        for skin in skin_list:
            skin_img = skin.find('img')['src']
            skin_name = skin.find('img')['alt']
            skin_imgs.append((hero_name, skin_name, skin_img))
    return skin_imgs

# 将信息保存到sqlite数据库表中
def save_to_sqlite(skin_imgs):
    conn = sqlite3.connect('skin_imgs.db')
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS skin_imgs (hero_name TEXT, skin_name TEXT, skin_img TEXT)')
    c.executemany('INSERT INTO skin_imgs VALUES (?, ?, ?)', skin_imgs)
    conn.commit()
    conn.close()

# 将信息保存到Excel表中
def save_to_excel(skin_imgs):
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = '皮肤图片'
    ws['A1'] = '英雄名字'
    ws['B1'] = '皮肤名字'
    ws['C1'] = '皮肤图片链接'
    for i, skin in enumerate(skin_imgs):
        ws.cell(row=i+2, column=1, value=skin[0])
        ws.cell(row=i+2, column=2, value=skin[1])
        ws.cell(row=i+2, column=3, value=skin[2])
    chart = BarChart()
    chart.title = '皮肤数量统计图'
    chart.y_axis.title = '皮肤数量'
    chart.x_axis.title = '英雄名字'
    data = Reference(ws, min_col=2, min_row=1, max_row=len(skin_imgs)+1)
    cats = Reference(ws, min_col=1, min_row=2, max_row=len(skin_imgs)+1)
    chart.add_data(data, titles_from_data=True)
    chart.set_categories(cats)
    ws.add_chart(chart, 'E2')
    wb.save('skin_imgs.xlsx')

# 生成图表或显示处理后的信息
def generate_chart():
    conn = sqlite3.connect('skin_imgs.db')
    c = conn.cursor()
    c.execute('SELECT hero_name, COUNT(*) FROM skin_imgs GROUP BY hero_name')
    rows = c.fetchall()
    conn.close()
    wb = openpyxl.load_workbook('skin_imgs.xlsx')
    ws = wb.active
    ws2 = wb.create_sheet('皮肤数量统计')
    ws2['A1'] = '英雄名字'
    ws2['B1'] = '皮肤数量'
    for i, row in enumerate(rows):
        ws2.cell(row=i+2, column=1, value=row[0])
        ws2.cell(row=i+2, column=2, value=row[1])
    chart = BarChart()
    chart.title = '皮肤数量统计图'
    chart.y_axis.title = '皮肤数量'
    chart.x_axis.title = '英雄名字'
    data = Reference(ws2, min_col=2, min_row=1, max_row=len(rows)+1)
    cats = Reference(ws2, min_col=1, min_row=2, max_row=len(rows)+1)
    chart.add_data(data, titles_from_data=True)
    chart.set_categories(cats)
    ws2.add_chart(chart, 'D2')
    wb.save('skin_imgs.xlsx')

if __name__ == '__main__':
    skin_imgs = get_skin_imgs()
    save_to_sqlite(skin_imgs)
    save_to_excel(skin_imgs)
    generate_chart()

原文地址: http://www.cveoy.top/t/topic/oQi3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录