使用requests模块爬取WIPO品牌数据库网页无结果的求助
问题
我编写了一个脚本,使用requests模块从指定网页爬取产品名称。运行脚本时状态码显示为200,但无法获取任何结果,请问如何使用requests模块抓取该网页的结果?
from bs4 import BeautifulSoup import requests link = "https://branddb.wipo.int/en/advancedsearch/results?sort=score%20desc&strategy=concept&rows=30&asStructure=%7B%22_id%22:%2262a3%22,%22boolean%22:%22AND%22,%22bricks%22:%5B%7B%22_id%22:%2262a4%22,%22key%22:%22type%22,%22value%22:%5B%22AO%22,%22EMBLEM%22,%22GI%22,%22INN%22,%22TRADEMARK%22%5D%7D%5D%7D&_=1722527941041&fg=_void_&start=0" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Accept-Language': 'en-US,en;q=0.9', 'referer': 'https://branddb.wipo.int/', 'origin': 'https://branddb.wipo.int', } res = requests.get(link,headers=headers) print(res.status_code) soup = BeautifulSoup(res.text,"lxml") for item in soup.select("span.brandName"): print(item.get_text())
解决方案
你遇到的问题是因为目标页面采用动态渲染:直接GET请求返回的HTML仅包含页面框架,实际的品牌数据是通过后续AJAX请求加载的,所以用BeautifulSoup解析静态HTML找不到目标内容。
解决步骤
- 定位真实数据接口:
打开浏览器开发者工具(F12),切换到「Network」标签,刷新页面后筛选「XHR/fetch」类型请求,找到加载搜索结果的API接口(通常是类似/en/advancedsearch/results/data的地址)。 - 复制请求参数与Headers:
查看该API请求的详细信息,复制必要的Headers(包括Cookie,部分网站需要会话验证)、请求方式(POST/GET)和请求参数。 - 调整脚本请求API:
直接请求API接口获取JSON格式数据,无需解析HTML,直接从JSON中提取品牌名称。
修改后的示例脚本
import requests # 替换为你在开发者工具中找到的真实API地址 api_url = "https://branddb.wipo.int/en/advancedsearch/results/data" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", 'Accept': 'application/json, text/plain, */*', 'Accept-Language': 'en-US,en;q=0.9', 'referer': 'https://branddb.wipo.int/en/advancedsearch/results?sort=score%20desc&strategy=concept&rows=30&asStructure=%7B%22_id%22:%2262a3%22,%22boolean%22:%22AND%22,%22bricks%22:%5B%7B%22_id%22:%2262a4%22,%22key%22:%22type%22,%22value%22:%5B%22AO%22,%22EMBLEM%22,%22GI%22,%22INN%22,%22TRADEMARK%22%5D%7D%5D%7D&_=1722527941041&fg=_void_&start=0', 'origin': 'https://branddb.wipo.int', 'Content-Type': 'application/json', # 从浏览器开发者工具中复制你的Cookie,添加到这里 'Cookie': '你的Cookie内容' } # 搜索参数,从原页面请求中提取并格式化 payload = { "sort": "score desc", "strategy": "concept", "rows": 30, "asStructure": { "_id": "62a3", "boolean": "AND", "bricks": [ { "_id": "62a4", "key": "type", "value": ["AO", "EMBLEM", "GI", "INN", "TRADEMARK"] } ] }, "start": 0 } # 发起POST请求(根据实际请求方式调整为GET/POST) response = requests.post(api_url, headers=headers, json=payload) print(response.status_code) # 解析JSON数据并提取品牌名称 if response.status_code == 200: data = response.json() # 根据API返回的JSON结构调整提取路径 for result in data.get('results', []): print(result.get('brandName'))
注意事项
- Cookie是关键:部分网站会验证会话,必须带上浏览器中当前有效的Cookie,否则可能返回空数据或403错误。
- 适配请求方式:确认API是POST还是GET请求,参数传递方式对应调整(POST用json参数,GET用params参数)。
- 定期检查接口:网站可能更新API结构或参数,若脚本失效需重新定位接口。
内容的提问来源于stack exchange,提问作者SMTH
相关产品推荐
相关产品推荐

