Файлы cookie и поля согласия на использование файлов cookie при сканировании веб-страницы с помощью BeautifulSoup и Requests в Python

Я пишу скрипт, который должен сканировать страницы сравнения цен , подобные этой , который должен запускаться каждые x секунд и оповещать себя по электронной почте, когда определенный товар доступен по цене ниже X. К сожалению, я Я не могу извлечь данные, которые мне нужны (в столбцах имени и цены следуют HTML-ссылки), и считаю, что проблема вызвана окном согласия на использование файлов cookie.

Когда я вручную просматривал html страницы, проверяя ее через свой браузер, я увидел, что название и цена перечисленных предметов:

<a href = "inno3d-geforce-rtx-3070-ichill-x3-c30703-08d6x-1710va38-a2408388.html?hloc=at&amp;hloc=de" class = "productlist__link">
<span class = "notrans">
INNO3D GeForce RTX 3070 iCHILL X3, 8GB GDDR6, HDMI, 3x DP (C30703-08D6X-1710VA38)
</span>
</a>
<div class = "productlist__item productlist__description">
<p class = "x"><span class = "notrans">Anschlüsse: 1x HDMI 2.1, 3x DisplayPort 1.4a • Grafik: NVIDIA GeForce RTX 3070 (Desktop), 8GB GDDR6 • Chip: GA104-300-A1 "Ampere", 46SM, 392mm² • Fertigung: 8nm (Samsung) • Chiptakt: 1500MHz, Boost: 1785MHz • Speicher: 8GB GDDR6, 1750MHz, 256bit, ...</span></p>
</div>
</div>

и

<span class = "gh_price"> <span class = "notrans">€ 609,00</span>
</span>
</div>

по названию и цене соответственно. Использование BeautifulSoup.find_all("a", class_"productlist__link") или BeautifulSoup.find_all("span", class_ = "gh_price") может легко извлечь их из приведенных примеров. Обновлено: Для пояснения я использую x=BeautifulSoup(response.text, "lxml") и затем вызываю x.find_all(...), как в следующем коде.

Я сканирую страницу со следующим кодом:

import requests
from bs4 import BeautifulSoup

URL = "https://www.heise.de/preisvergleich/?cat=gra16_512&xf=9810_16+0020314+-+RTX+3070"
params_ = {"hloc":"de", "hloc":"at", "v":"k"}
session = requests.session()
response = session.get(URL, params=params_, cookies=cookies_)
response.raise_for_status()
session.close()
soup=BeautifulSoup(response.text, "lxml")

Но при использовании soup.find_all(...), как и раньше, мой список результатов оказывается пустым. Посмотрев на response.text в браузере, я заметил, что сайт был едва читаемым, за исключением согласия на использование файлов cookie, поэтому я скопировал все файлы cookie, используемые моим браузером, в диктофон с именем cookies_ = {...} и добавил их в запрос (как уже видно в части кода выше ), но ответ по-прежнему был нечитаемым, и форма согласия на использование файлов cookie все еще была на месте, и никакие данные не были извлечены.

Итак, теперь мой вопрос заключается в том, что я делаю неправильно, пытаясь избавиться от поля согласия, и есть ли что-то еще, что я упускаю. Насколько я понимаю, даже с полем согласия список элементов все еще должен быть в response, и мой код все еще должен извлекать его (но не делает), поэтому я предполагаю, что мне также не хватает некоторых других идей.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
491
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Печеньки не нужны, ИМХО. Сайт отвечает полным HTML-кодом с простым запросом. Даже заголовки не нужны.

Вот пример:

import requests
from bs4 import BeautifulSoup
from tabulate import tabulate

url = "https://www.heise.de/preisvergleich/?cat=gra16_512&xf=9810_16+0020314+-+RTX+3070"
soup = BeautifulSoup(requests.get(url).content, "html.parser")
products = [
    f"https://www.heise.de/preisvergleich/{p['href']}" for p
    in soup.find_all("a", class_ = "productlist__link")
]
prices = [
    p.getText(strip=True) for p
    in soup.find_all("span", class_ = "gh_price")
]

print(tabulate(zip(products, prices), headers=["Product URL", "Price"]))

Это выводит:

Product URL                                                                                                                      Price
-------------------------------------------------------------------------------------------------------------------------------  ----------
https://www.heise.de/preisvergleich/gigabyte-geforce-rtx-3070-gaming-oc-8g-gv-n3070gaming-oc-8gd-a2406936.html?hloc=at&hloc=de   € 799,00
https://www.heise.de/preisvergleich/zotac-gaming-geforce-rtx-3070-twin-edge-zt-a30700e-10p-a2363490.html?hloc=at&hloc=de         € 609,00
https://www.heise.de/preisvergleich/gigabyte-aorus-geforce-rtx-3070-master-8g-gv-n3070aorus-m-8gd-a2406973.html?hloc=at&hloc=de  ab€ 889,00
https://www.heise.de/preisvergleich/gigabyte-geforce-rtx-3070-vision-oc-8g-gv-n3070vision-oc-8gd-a2406952.html?hloc=at&hloc=de   € 1095,00
https://www.heise.de/preisvergleich/msi-geforce-rtx-3070-ventus-2x-oc-a2364400.html?hloc=at&hloc=de                              € 1099,00
https://www.heise.de/preisvergleich/palit-geforce-rtx-3070-gamingrock-ne63070019p2-1040g-a2408422.html?hloc=at&hloc=de           € 899,90
https://www.heise.de/preisvergleich/asus-dual-geforce-rtx-3070-oc-a2366124.html?hloc=at&hloc=de                                  ab€ 799,00
https://www.heise.de/preisvergleich/gainward-geforce-rtx-3070-phantom-gs-2201-a2435816.html?hloc=at&hloc=de                      € 769,00
https://www.heise.de/preisvergleich/inno3d-geforce-rtx-3070-twin-x2-oc-n30702-08d6x-1710va32l-a2429903.html?hloc=at&hloc=de      € 699,00

Другие вопросы по теме