如何用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
相关产品推荐
相关产品推荐

