You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python抓取越南药品库多页面数据?请求无响应排查

问题排查与修复方案

核心问题:错误将HTML页面当作JSON接口请求

目标网址https://drugbank.vn/danh-sach-thuoc是前端渲染的HTML页面,并非返回JSON数据的API接口。直接调用r.json()会触发解析错误,这是请求无响应(或报错)的主要原因。

具体排查与修复步骤

1. 修正请求目标与数据解析方式

该网站的药品数据通过前端异步加载,实际数据接口需从浏览器开发者工具的Network面板抓取(例如观察到的接口可能类似https://drugbank.vn/api/drugs,需自行验证)。若暂时找不到API,可改用BeautifulSoup解析HTML页面的表格数据。

2. 添加请求头绕过反爬拦截

网站会拦截无浏览器标识的请求,需在请求中添加Headers:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}
r = requests.get(url, params=params, headers=headers)

3. 修正循环范围

你的注释说明要循环5页,但代码写了range(40000),这会发起4万次请求,大概率被网站封禁IP,改为:

for page in range(1, 6):  # 循环1-5页,注意验证网站页码是否从0或1开始
    params['page'] = page

4. 添加异常处理避免程序崩溃

单个请求失败会导致整个程序终止,需增加异常捕获:

try:
    r = requests.get(url, params=params, headers=headers)
    r.raise_for_status()  # 检查请求状态码是否为200
    # 根据实际接口类型选择解析方式:HTML用BeautifulSoup,API用r.json()
except requests.exceptions.RequestException as e:
    print(f"第{page}页请求失败: {e}")
    continue

5. 补充Excel保存代码

你仅定义了文件名,未执行保存操作,需添加:

df.to_excel(excel_file, index=False)

修复后的示例代码(HTML解析版本)

若暂时找不到API,可使用BeautifulSoup解析页面表格:

import requests
import pandas as pd
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}

url = 'https://drugbank.vn/danh-sach-thuoc'
data_list = []

for page in range(1, 6):
    params = {
        'size': 20,
        'sort': 'id,desc',
        'page': page
    }
    try:
        r = requests.get(url, params=params, headers=headers)
        r.raise_for_status()
        soup = BeautifulSoup(r.text, 'html.parser')
        # 根据页面实际结构调整表格行选择器
        rows = soup.select('table tbody tr')
        for row in rows:
            cols = row.find_all('td')
            row_data = [col.get_text(strip=True) for col in cols]
            data_list.append(row_data)
    except Exception as e:
        print(f"第{page}页抓取失败: {e}")
        continue

# 根据页面实际列名调整DataFrame表头
df = pd.DataFrame(data_list, columns=['ID', '药品名称', '规格', '生产厂家', '其他信息'])
df.to_excel('Linhngo3.xlsx', index=False)

内容的提问来源于stack exchange,提问作者Linh Tuấn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:22:37