Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 12, 2019 11:50:08

anpy
Зарегистрирован: 2019-08-12
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь в разборе кода

Не могу решить проблему. Как спарсить текст из класса «add-discount-text-price j-final-saving tooltipstered» Если я правильно понимаю, то это не статические данные, как бы Вы действовали в данном случае? При выполнении нижеуказанного кода отрабатывает только except:
Пробовал менять User-Agent на мобильный, но ответ тот-же. В средствах разработки Firefox не смог найти нужный запрос для парсинга (цена обновляется не по нажатию, а при загрузке страницы).
Извиняюсь за кривой код, только учусь (замечания приветствуются).

 import requests
from bs4 import BeautifulSoup
import re
def get_html(url):
    user_agent={"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"}
    r= requests.get(url, headers=user_agent)
    return r.text
def get_data(html): #Получение html и его парсинг
    soup= BeautifulSoup(html,"lxml")
    try:
        price= soup.find("span", class_="add-discount-text-price j-final-saving tooltipstered").text #Ищем блок кода сайта где указана цена и забираем текст
        price1=re.findall(r"\d",(price))            # Ищем только цифры (получаем список вида [1,3,6])
        price2=int("".join(price1).strip())         # Преобразуем список в строку, а затем в целое число
    except:
        price= soup.find('div', class_="add-discount-text").find("span", class_="add-discount-text-price j-final-saving").text
        price1=re.findall(r"\d",(price))            
        price2=int("".join(price1).strip())         
    else:
        price2=("Не удалось определить цену")
  
    print (price2)
def main():
    url = 'https://www.wildberries.ru/catalog/6799402/detail.aspx?targetUrl=GP'
    get_data(get_html(url))
if __name__ == '__main__':
    main()

Офлайн

#2 Авг. 12, 2019 12:06:12

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Помощь в разборе кода

anpy
В средствах разработки Firefox не смог найти нужный запрос для парсинга
А вот это разве не оно?



Офлайн

#3 Авг. 12, 2019 12:11:51

anpy
Зарегистрирован: 2019-08-12
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь в разборе кода

Да, похоже оно.
Спасибо

Офлайн

#4 Авг. 12, 2019 15:15:27

anpy
Зарегистрирован: 2019-08-12
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь в разборе кода

Пытаюсь создать POST запрос, но видно что то делаю не так (или всё не так).
Получаю ответ 404

 import requests
import json
url="https://www.wildberries.ru/content/cardpromo"
payload = {
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0",
        "Accept": "*/*",
        "Accept-Language": "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "X-RequestVerificationToken": "CfDJ8Hyt7h5QkHpBl_eWRSZ-2nNaORxuC9Wok6viyAtpSSihJmUBKw_4puPE1petl8o6Mt3hSMe11fKwVcbOpn7wH907v4GwnqcUgoaX-aabvm2TTUvc1l-MhJw",
        "X-Requested-With": "XMLHttpRequest",
        "Pragma": "no-cache",
        "Cache-Control": "no-cache",
        "referrer": "https://www.wildberries.ru/catalog/6799402/detail.aspx?targetUrl=GP",
        "body": "cod1s=6799402&characteristicId=",
        "method": "POST",
        }
r= requests.post(url, json=payload)
print(r)

Отредактировано anpy (Авг. 15, 2019 17:01:33)

Офлайн

#5 Авг. 12, 2019 15:41:26

ZiG
Зарегистрирован: 2018-12-16
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь в разборе кода

А сами на сайт

 https://www.wildberries.ru/content/cardpromo
заходили?

К СОЖАЛЕНИЮ, ЗАПРОШЕННАЯ ВАМИ СТРАНИЦА НЕ СУЩЕСТВУЕТ

Офлайн

#6 Авг. 12, 2019 15:54:46

anpy
Зарегистрирован: 2019-08-12
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь в разборе кода

В средствах разработки Firefox POST запрос на адрес https://www.wildberries.ru/content/cardpromo
ответ 200

Прикреплённый файлы:
attachment Снимок экрана.png (123,9 KБ)

Офлайн

#7 Авг. 12, 2019 16:35:49

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Помощь в разборе кода

вы смешали заголовки и тело запроса.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#8 Авг. 12, 2019 16:37:14

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Помощь в разборе кода

Я посмотрел скриншот и понял что вы вообще не то делаете. Там нет никакого json. Там данные формы



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#9 Авг. 12, 2019 17:56:03

anpy
Зарегистрирован: 2019-08-12
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь в разборе кода

Что то я совсем потерялся.
Если не json, то почему средства разработки показывают тип json?
Как мне выйти на конкретный запрос, который выдаст ответ аналогичный как указано в средствах разработки? Мне нужно спарсить цену 1169 с этой страницы


Отредактировано anpy (Авг. 12, 2019 18:00:35)

Офлайн

#10 Авг. 12, 2019 18:04:33

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Помощь в разборе кода

Вы действительно сильно потерялись. Сейчас вы путаете запрос и ответ. На первом скриншоте Вы показали запрос, он действительно пост, но посылается он как Content-type: application/x-www-form-urlencoded, но в приведенном вами коде вы пытаетесь отправить эти данные как JSON.
На втором Вашем скриншоте вы показываете ответ сервера, тип данных которого вполне может отличаться от таковых в запросе.

anpy
Как мне выйти на конкретный запрос, который выдаст ответ аналогичный как указано в средствах разработки? Мне нужно спарсить цену 1169
1) вам надо сформировать нормальный запрос, более правильным путем было бы использовать requests.Session что бы пройти авторизацию и потом уже слать запрос на адрес который надо, правильно указав данные (в вашем случае в коде надо было не json=payload, а просто data=payload и то при условии что вы сми данные сформируете корректно)
2) полученный ответ интерпретируете как json (response_data = r.json() ) и возьмете нужные данные которые Вам надо



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version