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

使用BeautifulSoup爬取1mg药品数据每页仅返回20条而非30条如何解决

问题原因
  • 你当前代码提取的是页面中第一个<script>标签里的JSON-LD结构化数据,这个标签默认仅存储前20条药品的公开结构化信息,剩余10条数据没有存放在这个标签里,自然只能爬取到20条。
  • 该站点是用Next.js开发的,全量的每页30条数据都存储在id="__NEXT_DATA__"的专用script标签中,只要更换提取的数据源即可拿到完整数据。
修正后的代码
import requests
import json
import io
from bs4 import BeautifulSoup

f = io.open('data.txt', 'a', encoding='utf-8')
# 加请求头伪装浏览器,避免被反爬策略拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
for i in range(1, 842):
    url = f"https://www.1mg.com/drugs-all-medicines?page={i}"
    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.content, 'html.parser')
    # 提取Next.js存储全量页面数据的script标签
    next_data_script = soup.find("script", id="__NEXT_DATA__")
    json_data = json.loads(next_data_script.string)
    # 定位到药品列表的存储路径
    medicine_list = json_data["props"]["pageProps"]["data"]["skus"]
    medicine_name = []
    for med in medicine_list:
        name = med["name"]
        medicine_name.append(name)
        f.write(f"\n{name}")
    print(f"已解析 --> {len(medicine_name)} 条数据,当前页码 --> {i}")
f.close()
额外注意事项
  • 新增的User-Agent请求头可以大幅降低被站点识别为爬虫的概率,避免返回异常数据。
  • 代码中的药品列表路径为当前站点版本的存储路径,如果后续站点迭代更新,你可以重新打印__NEXT_DATA__的内容定位新的药品列表位置。

内容的提问来源于stack exchange,提问作者Divyanshu Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:24:02