Желаемая цель загружена с модулями JavaScript
, поэтому bs4
и requests
не смогут визуализировать JS
.
Но вот решение.
Все страницы продукта содержат стабильную строку:
Compare offers from more sellers as low as $1,268.90 plus shipping
Таким образом, мы сделаем это regex
, и вы также можете применить это на любой другой странице.
import requests
import re
params = {
"Description": "MUHN2LL/A",
"cm_re": "MUHN2LL/A-_-1XV-000E-00331-_-Product"
}
def main(url):
r = requests.get(url, params=params)
match = re.search(r'low as.+\$(.+\d)', r.text).group(1)
print(match)
main("https://www.newegg.com/p/1XV-000E-00331")
Вывод:
1,268.90
Есть еще одна уродливая идея, где вы можете анализировать кодированный JSONP
:
что-то вроде следующего:
import requests
from bs4 import BeautifulSoup
import re
params1 = {
"Description": "MUHN2LL/A",
"cm_re": "MUHN2LL/A-_-1XV-000E-00331-_-Product"
}
params2 = {
"FirstCall": "true",
"PageNum": "1",
"TabType": "0",
"FilterBy": "",
"SortBy": "0",
"action": "Biz.Product.MoreBuyingOptions.JsonpCallBack"
}
def main(url):
with requests.Session() as req:
r = req.get(url, params=params1)
soup = BeautifulSoup(r.content, 'html.parser')
params2['ParentItem'] = soup.find(
"input", id="mboParentItemNumber").get("value")
params2['MappingId'] = soup.find(
"input", id="mboMappingId").get("value")
r = req.get(
"https://www.newegg.com/Common/Ajax/LoadMoreBuyingOption.aspx", params=params2)
match = [item.group(1, 2) for item in re.finditer(
r'price-current-label.+?\>(\d.+?)<.+?p>(.+?)<', r.text)][-1]
print(match)
main("https://www.newegg.com/p/1XV-000E-00331")
Вывод:
('1,268', '.90')