使用Python requests获取cardmarket.com页面与浏览器返回内容不一致问题
解决cardmarket.com卡牌价格爬取的Cloudflare验证问题
问题根源
cardmarket网站启用了Cloudflare反爬机制,你用requests/urllib3发起的纯HTTP请求缺少浏览器的JS执行环境和Cookie上下文,直接触发人机验证,所以返回的是验证页面而非目标卡牌价格页面。
两种可行解决办法
1. 用Playwright模拟真实浏览器
Playwright可以启动真正的浏览器(如Chrome),自动处理JS渲染、Cookie等浏览器环境要素,轻松绕过Cloudflare验证。
先安装依赖:
pip install playwright playwright install chromium
替换后的代码:
from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup as bs card = 'sol+ring' url = f'https://www.cardmarket.com/en/Magic/Products/Search?idCategory=0&idExpansion=0&searchString=%5B{card}%5D&exactMatch=on&onlyAvailable=on&idRarity=0&sortBy=price_asc&perSite=1' with sync_playwright() as p: # headless=False可显示浏览器窗口,改成True可后台运行 browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto(url) # 等待价格元素加载完成再获取页面内容 page.wait_for_selector('.article-price') html = page.content() browser.close() soup = bs(html, 'html.parser') # 提取最低价格示例 lowest_price = soup.find(class_='article-price').text.strip() print(f"卡牌最低售价: {lowest_price}")
2. 用cfscrape专门破解Cloudflare验证
cfscrape是针对Cloudflare反爬的专用库,需要配合Node.js环境(用于执行Cloudflare的验证JS)。
先安装依赖:
pip install cfscrape # 需前往Node.js官网下载安装Node.js
替换后的代码:
import cfscrape from bs4 import BeautifulSoup as bs card = 'sol+ring' url = f'https://www.cardmarket.com/en/Magic/Products/Search?idCategory=0&idExpansion=0&searchString=%5B{card}%5D&exactMatch=on&onlyAvailable=on&idRarity=0&sortBy=price_asc&perSite=1' # 创建带Cloudflare破解能力的爬虫对象 scraper = cfscrape.create_scraper() html = scraper.get(url).text soup = bs(html, 'html.parser') print(soup.prettify())
注意事项
- 不要频繁发起请求,建议添加
time.sleep(2)这类间隔,避免被网站封禁IP。 - 严格遵守网站服务条款与
robots.txt规则,避免违规爬取。
内容的提问来源于stack exchange,提问作者bob0815
相关产品推荐
相关产品推荐

