首页 > 解决方案 > 请求获取与浏览器不同的数据

问题描述

如果我尝试下载https://www.conrad.ch/de/p/42105-lego-technic-katamaran-2255199.html的代码来解析价格。但是,我在浏览器中得到了完全不同的代码。

from bs4 import BeautifulSoup
import requests

url_front = requests.get("https://www.conrad.ch/de/p/42105-lego-technic-katamaran-2255199.html").text
front = BeautifulSoup(url_front, "lxml")
front.find("div", id="productPrice").text

AttributeError: 'NoneType' object has no attribute 'text'

在浏览器中,我发现: 浏览器

在下载的代码中,我什至找不到“价格”一词。

不知道它是否与 iframes、Javascripts...有关?我不喜欢网络开发,所以我不知道我可以从哪里开始找到错误......

有人可以帮忙吗?

标签: pythonbeautifulsouppython-requests

解决方案


这个页面是通过 JavaScript 使用 XHR 呈现的。好消息是您可以访问与 JavaScript 直接访问相同的 API。

import requests
import json

headers = {
    'Accept': 'application/json',
    'Content-Type': 'application/json;charset=UTF-8'
}
params = (
    ('apikey', '1Ikv5R4JFlk6MYIFlBAMSgH1cbvzWdzk'),
    ('overrideCalculationSchema', 'GROSS'),
)
data = '{"ns:inputArticleItemList":{"#namespaces":{"ns":"http://www.conrad.de/ccp/basit/service/article/priceandavailabilityservice/api"},"articles":[{"articleID":"2255199","insertCode":"62","checkAvailability":true,"calculatePrice":true,"findExclusions":true}]}}'
j = requests.post('https://api.conrad.ch/price-availability/4/CQ_CH_B2C/facade', headers=headers, params=params, data=data).json()
# Uncomment the next line to see the JSON object
# print(json.dumps(j, indent=4))
price_elem = j['priceAndAvailabilityFacadeResponse']['priceAndAvailability']['price']
print(price_elem['price'], price_elem['currency'])

输出

38.95 CHF

推荐阅读