抓取网页隐藏表格遇阻:Agenas新冠数据表格仅获表头、JSON接口返回401的解决方法咨询
解决动态表格抓取与HTTP Basic认证401问题
问题拆解
你碰到的两个关键问题其实很好理解:
- 直接爬取页面源码只拿到表头,是因为表格的实际数据是前端通过JavaScript动态加载的——页面初始HTML里的
<tbody id="tab2_body">本来就是空的,数据会在页面加载完成后通过AJAX请求从后端接口拉取填充。 - 访问JSON接口返回401,是因为你没用到正确的HTTP Basic认证方式:把用户名密码塞请求头或者URL里的方法不对,requests有专门处理Basic Auth的参数,不用手动拼接。
解决方案
1. 正确处理Basic认证
对于需要账号密码验证的接口,requests提供了auth参数,直接传入包含用户名和密码的元组即可,不用自己折腾headers或者URL拼接。
2. 获取并填充动态表格数据
先拿到页面的表格结构(如果需要完整HTML格式的表格),再请求JSON接口拿到数据,最后把数据填充到空的tbody里即可。
完整代码示例
import requests from bs4 import BeautifulSoup as bs # 初始化会话,保持请求一致性 s = requests.Session() s.headers.update({ "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" }) # 1. 获取页面的空表格结构(可选,若只需数据可跳过这步) page_url = 'https://www.agenas.gov.it/covid19/web/index.php?r=site%2Ftab2' page_req = s.get(page_url) soup = bs(page_req.content, 'html.parser') table = soup.find('table') tbody = table.find('tbody', id='tab2_body') # 2. 请求JSON接口,用auth参数传入认证信息 json_url = 'https://www.agenas.gov.it/covid19/web/index.php?r=json%2Ftab2' json_req = s.get(json_url, auth=('Agenas', 'tab2-19')) # 处理返回数据 if json_req.status_code == 200: data = json_req.json() # 遍历数据生成表格行 for item in data: tr = soup.new_tag('tr') # 按表头顺序添加单元格 tr.append(soup.new_tag('td', string=item['regione'])) tr.append(soup.new_tag('td', string=str(item['ricoverati_non_critici']))) tr.append(soup.new_tag('td', string=str(item['posti_letto_non_critici']))) tr.append(soup.new_tag('td', string=str(item['ricoverati_terapia_intensiva']))) tr.append(soup.new_tag('td', string=str(item['posti_letto_terapia_intensiva']))) tr.append(soup.new_tag('td', string=str(item['posti_letto_terapia_intensiva_attivabili']))) tbody.append(tr) # 现在table已经是完整带数据的表格了,可打印或保存 print(table.prettify()) else: print(f"请求失败,状态码:{json_req.status_code}")
小提醒
- 一定要设置正确的
User-Agent,避免被服务器识别为爬虫拦截。 - 如果后续接口返回的JSON字段有变化,先打印
data查看最新结构,再调整单元格的生成逻辑。 - 使用
Session能保持请求之间的会话状态,不用重复设置headers和认证信息,更高效。
内容的提问来源于stack exchange,提问作者Panzerotto
相关产品推荐
相关产品推荐

