如何从HTML数据列表生成多个pandas DataFrame?多页网页表格爬取问题
问题解决方案
你当前代码存在两个核心问题:
- 函数内使用
global df全局变量,每次调用Scraper都会覆盖全局df,导致只能保留最后一次运行结果 - Scraper函数没有返回值,无法单独保存每个页面对应的DataFrame
修正后完整代码
import io import urllib3 import pandas as pd import requests from requests_kerberos import OPTIONAL, HTTPKerberosAuth # 如果你已有自定义的requests_retry_session可以保留,没有的话用这个通用重试逻辑即可 def requests_retry_session(retries=3, backoff_factor=0.3, status_forcelist=(500, 502, 504), session=None): session = session or requests.Session() retry = urllib3.util.retry.Retry( total=retries, read=retries, connect=retries, backoff_factor=backoff_factor, status_forcelist=status_forcelist, ) adapter = requests.adapters.HTTPAdapter(max_retries=retry) session.mount('http://', adapter) session.mount('https://', adapter) return session a = get_mwinit_cookie() pageCount = 6 urlsList = [] # 原代码此处URL缺少字符串引号,已修正 urls = "https://example-url.com/ABCD/customer.currentPage={}&end" for x in range(1, pageCount): urlsList.append(urls.format(x)) def Scraper(url): urllib3.disable_warnings() with requests_retry_session() as req: resp = req.get(url, timeout=30, verify=False, allow_redirects=True, auth=HTTPKerberosAuth(mutual_authentication=OPTIONAL), cookies=a) data = pd.read_html(resp.text, flavor=None, header=0, index_col=0) df = pd.concat(data, sort=False) # 移除全局变量定义,直接返回处理好的DataFrame return df # 存储方案1:用列表存储,按索引对应页面,df_list[0]对应第1页数据,df_list[1]对应第2页,以此类推 df_list = [] for url in urlsList: page_df = Scraper(url) df_list.append(page_df) # 可选:打印每个页面的表内容校验 print(page_df) # 存储方案2:用字典存储,直接按页码取数,df_dict[2]就是第2页的DataFrame df_dict = {} for page_num in range(1, pageCount): df_dict[page_num] = Scraper(urls.format(page_num))
补充说明
如果需要把所有页面的数据合并为一个总表,在循环结束后添加以下代码即可:
total_df = pd.concat(df_list, ignore_index=True)
内容的提问来源于stack exchange,提问作者Jean123
相关产品推荐
相关产品推荐

