Проблема, пытаясь собрать информацию о ценах от newegg в Python - PullRequest
0 голосов
/ 21 апреля 2020

Я пытался использовать Beautifulsoup, чтобы получить информацию о ценах на Newegg безуспешно. Я попытался использовать приведенный ниже код и пытаюсь заставить его вернуть цену ноутбука, равную 1268.

import requests
from bs4 import BeautifulSoup

data = requests.get('https://www.newegg.com/p/1XV-000E-00331?Description=MUHN2LL%2fA&cm_re=MUHN2LL%2fA-_-1XV-000E-00331-_-Product')
soup = BeautifulSoup(data.content, 'lxml')
price = soup.select_one('[itemprop=price]')['content']
print(price)

Может ли кто-нибудь помочь мне вернуть 1268?

1 Ответ

0 голосов
/ 21 апреля 2020

Желаемая цель загружена с модулями 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...