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

