首页 > 解决方案 > 双 for 循环从多个 url 中提取数据

问题描述

我正在尝试从网站获取数据以将它们写入要处理的 excel 文件。我有一个主要的 url 方案,我必须相应地更改“年份”和“参考号”:

http://calcio-seriea.net/presenze/ “年份”/“参考编号”/

我已经尝试编写部分代码,但我有一个问题。首先,我应该保持年份不变,而参考数取18区间的每一个数字。然后年份增加1,参考数字再取18区间的每一个数字。我试着给一个例子:

Y = 1998 RN = [1142:1159];
Y = 1999 RN = [1160:1177];
Y = 2000 RN = [1178:1195];
Y = … RN = …

然后从 2004 年开始,间隔变为 20,所以

Y = 2004 RN = [1250:1269];
Y = 2005 RN = [1270:1289];

到年 = 包括 2019 年。

这是我到目前为止可以制作的代码:

import pandas as pd

year = str(1998)

all_items = []

for i in range(1142, 1159):
    pattern = "http://calcio-seriea.net/presenze/" + year + "/" + str(i) + "/"

    df = pd.read_html(pattern)[6]

    all_items.append(df)

pd.DataFrame(all_items).to_csv(r"C:\Users\glcve\Desktop\data.csv", index = False, header = False)

print("Done!")

提前感谢大家

标签: pythonpandasweb-scraping

解决方案


所缺少的只是pd.concat你的函数中的一个,但是当你一遍又一遍地调用相同的方法时,让我们编写一个函数,这样你就可以保持你的代码干燥。

def create_html_df(base_url, year,range_nums = ()):
    """
    Returns a dataframe from a url/html table
    base_url : the url to target
    year : the target year.
    range_nums = the range of numbers i.e (1,50)

   """
    start, stop = range_nums
    url_pat = [f"{base_url}/{year}/{i}" for i in range(start,stop)]
    dfs = []
    for each_url in url_pat:
        df = pd.read_html(each_url)[6]
        dfs.append(df)

    return pd.concat(dfs)

final_df = create_html_df(base_url = "http://calcio-seriea.net/presenze/",
               year = 1998,
               range_nums = (1142, 1159))

推荐阅读