吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1240|回复: 25
收起左侧

[Python 原创] 【爬虫学习】python采集cp网支持率

[复制链接]
dabiaoge144 发表于 2024-12-4 20:34
本帖最后由 苏紫方璇 于 2024-12-8 15:29 编辑

这是前几天接的某个单子,发出来分享仅供学习
功能:采集网站信息,存到excel

[url=]image.png[/url]

import requests
import pandas as pd
from datetime import datetime, timedelta

def fetch_match_data(date, url, headers):
    params = {
        "matchPage": "1",
        "matchBeginDate": date,
        "matchEndDate": date,
        "leagueId": "",
        "pageSize": "100",
        "pageNo": "1",
        "isFix": "0",
        "pcOrWap": "1"
    }
    response = requests.get(url, headers=headers, params=params)
    if response.status_code == 200:
        return response.json()
    else:
        return None

def parse_match_data(response_json):
    if response_json["errorCode"] == "0" and response_json["value"]["resultCount"] > 0:
        matches = response_json["value"].get("matchResult", [])
        Time1 = [match["matchDate"] for match in matches if "matchDate" in match]
        mathstr = [match["matchNumStr"] for match in matches if "matchNumStr" in match]
        TimeId = [match["matchId"] for match in matches if "matchId" in match]
        LeagueName = [match["leagueNameAbbr"] for match in matches if "leagueNameAbbr" in match]
        Home = [match["homeTeam"] for match in matches if "homeTeam" in match]
        Away = [match["awayTeam"] for match in matches if "awayTeam" in match]
        rang = [match["goalLine"] for match in matches if "goalLine" in match]
        non_empty_indices = [i for i, x in enumerate(rang) if x != '']
        return {
            "Time1": [Time1[i] for i in non_empty_indices],
            "mathstr": [mathstr[i] for i in non_empty_indices],
            "TimeId": [TimeId[i] for i in non_empty_indices],
            "LeagueName": [LeagueName[i] for i in non_empty_indices],
            "Home": [Home[i] for i in non_empty_indices],
            "Away": [Away[i] for i in non_empty_indices],
            "rang": [rang[i] for i in non_empty_indices],
        }
    else:
        print(f"没有比赛或数据错误: {response_json.get('errorMessage', '未知错误')}")
        return None

def fetch_support_rates(match_ids, url2, headers):
    params2 = {
        "matchIds": ",".join(map(str, match_ids)),
        "poolCode": "hhad,had",
        "sportType": "1"
    }
    response = requests.get(url2, headers=headers, params=params2)
    # print(response.text)
    if response.status_code == 200:
        return response.json()
    else:
        return None

def fetch_result_rates(data, url3, headers):
    params = {
        "matchPage": "1",
        "matchBeginDate": data,
        "matchEndDate": data,
        "leagueId": "",
        "pageSize": "100",
        "pageNo": "1",
        "isFix": "0",
        "pcOrWap": "1"
    }
    response = requests.get(url3, headers=headers, params=params)
    if response.status_code == 200:
        return response.json()
    else:
        return None

def combine_data(parsed_match_data, support_data):
    extracted_data = {
        "时间": parsed_match_data["Time1"],
        "TimeId": parsed_match_data["mathstr"],
        "联赛": parsed_match_data["LeagueName"],
        "主队": parsed_match_data["Home"],
        "客队": parsed_match_data["Away"],
        "让球": parsed_match_data["rang"],
        "胜支持率": [],
        "平支持率": [],
        "负支持率": [],
        "让胜支持率": [],
        "让平支持率": [],
        "让负支持率": []
    }
    for match_id, match_details in support_data["value"].items():
        hhad_data = match_details.get("HHAD", {})
        had_data = match_details.get("HAD", {})
        extracted_data["胜支持率"].append(had_data.get("hSupportRate", ""))
        extracted_data["平支持率"].append(had_data.get("dSupportRate", ""))
        extracted_data["负支持率"].append(had_data.get("aSupportRate", ""))
        extracted_data["让胜支持率"].append(hhad_data.get("hSupportRate", ""))
        extracted_data["让平支持率"].append(hhad_data.get("dSupportRate", ""))
        extracted_data["让负支持率"].append(hhad_data.get("aSupportRate", ""))

    # 检查列的长度是否一致
    max_len = max(len(v) for v in extracted_data.values())
    for key, value in extracted_data.items():
        if len(value) < max_len:
            value.extend([None] * (max_len - len(value)))
    keys_to_reverse = ["胜支持率", "平支持率", "负支持率", "让胜支持率", "让平支持率", "让负支持率"]
    # for key in keys_to_reverse:
    #     extracted_data[key] = extracted_data[key][::-1]

    # 创建 DataFrame
    return pd.DataFrame(extracted_data)

def save_to_excel(dataframe, file_path):
    if not dataframe.empty:
        dataframe.to_excel(file_path, index=False)
        print(f"数据已保存在 {file_path}")
    else:
        print("没有数据可保存。")

def fetch_football_data(start_date, end_date, url, url2, headers, excel_path="最新支持率.xlsx"):
    all_data = pd.DataFrame()
    for single_date in (start_date + timedelta(n) for n in range((end_date - start_date).days + 1)):
        date_str = single_date.strftime('%Y-%m-%d')
        print(f"正在爬取 {date_str} 的数据...")
        match_data = fetch_match_data(date_str, url, headers)
        # print(match_data)第一次采集数据

        if match_data:
            parsed_match_data = parse_match_data(match_data)
            if parsed_match_data:
                match_ids = parsed_match_data["TimeId"]
                print(match_ids)
                support_data = fetch_support_rates(match_ids, url2, headers)
                result_data = fetch_result_rates(date_str,url3, headers)
                # print(result_data)
                # print(support_data)
                if support_data:
                    # 合并比赛数据和支持率数据
                    combined_df = combine_data(parsed_match_data, support_data)
                    # print(combined_df)就是表头
                    # 按照 TimeId 排序
                    sorted_indices = sorted(range(len(parsed_match_data["TimeId"])),
                                            key=lambda k: int(parsed_match_data["TimeId"][k]))
                    # 根据排序索引重排相关数据
                    Time1_sorted1 = [parsed_match_data["Time1"][i] for i in sorted_indices]
                    mathstr2 = [parsed_match_data["mathstr"][i] for i in sorted_indices]
                    TimeId_sorted1 = [parsed_match_data["TimeId"][i] for i in sorted_indices]
                    LeagueName_sorted1 = [parsed_match_data["LeagueName"][i] for i in sorted_indices]
                    Home_sorted1 = [parsed_match_data["Home"][i] for i in sorted_indices]
                    Away_sorted1 = [parsed_match_data["Away"][i] for i in sorted_indices]
                    rang_sorted = [parsed_match_data["rang"][i] for i in sorted_indices]
                    # 更新数据框
                    sorted_data = pd.DataFrame({
                        "Time1": Time1_sorted1,
                        "mathstr": mathstr2,
                        "TimeId": TimeId_sorted1,
                        "LeagueName": LeagueName_sorted1,
                        "Home": Home_sorted1,
                        "Away": Away_sorted1,
                        "胜支持率": combined_df["胜支持率"],
                        "平支持率": combined_df["平支持率"],
                        "负支持率": combined_df["负支持率"],
                        "rang": rang_sorted,
                        "让胜支持率": combined_df["让胜支持率"],
                        "让平支持率": combined_df["让平支持率"],
                        "让负支持率": combined_df["让负支持率"]
                    })
                    if result_data:
                        print(result_data)

                    # 合并所有数据
                    all_data = pd.concat([all_data, sorted_data], ignore_index=True)

    save_to_excel(all_data, excel_path)

# Example usage:
if __name__ == '__main__':
    headers = {

    }

    start_date = datetime(2024, 11, 28)
    end_date = datetime(2024, 11, 29)
    url = aHR0cHM6Ly93ZWJhcGkuc3BvcnR0ZXJ5LmNuL2dhdGV3YXkvamMvZm9vdGJhbGwvZ2V0TWF0Y2hSZXN1bHRWMS5xcnk=
    url2 = aHR0cHM6Ly93ZWJhcGkuc3BvcnR0ZXJ5LmNuL2dhdGV3YXkvamMvY29tbW9uL2dldFN1cHBvcnRSYXRlVjEucXJ5
    url3 = aHR0cHM6Ly93ZWJhcGkuc3BvcnR0ZXJ5LmNuL2dhdGV3YXkvamMvZm9vdGJhbGwvZ2V0TWF0Y2hSZXN1bHRWMS5xcnk=
    fetch_football_data(start_date, end_date, url, url2, headers)

网站页面

网站页面

免费评分

参与人数 4吾爱币 +10 热心值 +3 收起 理由
z_8013 + 1 + 1 我很赞同!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
mathildada + 1 用心讨论,共获提升!
ka52 + 1 + 1 谢谢

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

msmvc 发表于 2024-12-5 15:24
看了一下这个网站,webapi的地址带上参数,返回一个json,反序列化json到实体对象就可了吧, 这个过程有其它需要处理的地方吗?
苏紫方璇 发表于 2024-12-4 21:42
代码插入方法请看置顶帖,使用md格式需要加代码标记
rt007 发表于 2024-12-4 22:04
Yhuo 发表于 2024-12-4 23:34

谢谢大佬分享
ka52 发表于 2024-12-4 23:46
好东西值得点赞
cyfwapj 发表于 2024-12-5 00:01
足彩很有帮助
chanhaofan1118 发表于 2024-12-5 01:05

好东西值得点赞
yxf515321 发表于 2024-12-5 07:54
爬虫必备技能,感谢分项
kenkenss 发表于 2024-12-5 08:07
学习之后做个彩票采集
Y431970085 发表于 2024-12-5 08:33
没有看的很懂,但支持
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-7 20:17

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表