При парсинге берется английская версия сайта
Пишу парсер, который должен брать дату окончания скидки, но почему-то берется именно английская версия сайта, хотя accept-language указан в headers. Помогите пожалуйста парсить русские данные!
import requests
from bs4 import BeautifulSoup
import re
def get_data(url):
headers = {
'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/112.0.0.0 Safari/537.36'
}
req = requests.get(url, headers)
soup = BeautifulSoup(req.text, 'lxml')
date = soup.find('p', class_='game_purchase_discount_countdown').text
regex_pattern = r'(\d{1,2})\s+(\w+)'
match = re.search(regex_pattern, date)
if match:
day = match.group(1)
month = match.group(2).capitalize()
print(f"{day} {month}")
get_data("https://store.steampowered.com/app/552500/Warhammer_Vermintide_2/")
Вывод:
25 April
Ответы (1 шт):
@Daniil Loban, зря вы так, конечно… Всё тут очень даже замечательно получается, причём очень просто в отличие от этого вопроса, где курсы грузятся через backend настройки. И Selenium использовать для парсинга — ну такое.
Тут же всё, прям, чудесно.
Повторим минимально код:
import requests
from bs4 import BeautifulSoup as BS
import re
s = requests.Session()
r = s.get('https://store.steampowered.com/app/552500/Warhammer_Vermintide_2/')
soup = BS(r.content, 'lxml')
regex_pattern = r'(\d{1,2})\s+(\w+)'
offer = soup.find('p', class_='game_purchase_discount_countdown').text
date = re.search(regex_pattern, offer)[0]
print(date)
Вывод:
25 April
Предсказуемо.
Как видите, даже не стал заморачиваться с headers. А теперь, посмотрим, что произойдёт при логине на стим и смене языка! Долго копать не пришлось, идём в лисичку и смотрим cookie, там вопиющее название Steam_Language. Забираем его, и добавляем куку, более подробно про их создание говорил здесь.
s.cookies.set('Steam_Language', 'russian', domain='store.steampowered.com')
Получаем страницу заново, парсер, регулярка и‥ получаем 25 апреля, ура!
Альтернатива
Но, как вам правильно подсказали, если совсем не получается, то надо искать альтернативы. Ну, например, перевести:
from deep_translator import GoogleTranslator
translated = GoogleTranslator(source='en', target='ru').translate(date)
print(translated)
Вывод:
25 апреля
B общем то, тут можно закончить ответ, получили то что хотели, мы это получили ещё раньше с куками, но т.к. наш русский язык любимый замечательный и сложный, при переводе может получиться не так всё чудесно, например если убрать 25 или если переводчик не догадается поставить правильный падеж:
translated = GoogleTranslator(source='en', target='ru').translate(date[3:])
print(translated)
Вывод:
апрель
Бах, апрель.
Именительный падеж. На самом деле ситуация довольно популярная при переводе и не только. Что можно сделать?
Использовать pymorphy:
import pymorphy2
morph = pymorphy2.MorphAnalyzer()
morphed = morph.parse(translated)[0].inflect({'gent'}).word
print(morphed)
Вывод:
апреля
Так что, используем куки и умеем в альтернативу ?
UPD
Перед тем как закрыть браузер ещё раз заглянул, какие там cookies есть. Очень интересным также оказался timezoneOffset, рекомендую его тоже добавить, т.к. с датой работаем.