Я пишу скрипт, который должен сканировать страницы сравнения цен , подобные этой , который должен запускаться каждые x секунд и оповещать себя по электронной почте, когда определенный товар доступен по цене ниже X. К сожалению, я Я не могу извлечь данные, которые мне нужны (в столбцах имени и цены следуют HTML-ссылки), и считаю, что проблема вызвана окном согласия на использование файлов cookie.
Когда я вручную просматривал html страницы, проверяя ее через свой браузер, я увидел, что название и цена перечисленных предметов:
<a href = "inno3d-geforce-rtx-3070-ichill-x3-c30703-08d6x-1710va38-a2408388.html?hloc=at&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
, и мой код все еще должен извлекать его (но не делает), поэтому я предполагаю, что мне также не хватает некоторых других идей.
Печеньки не нужны, ИМХО. Сайт отвечает полным 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