Невозможно проанализировать результаты веб-страницы с помощью модуля запросов

Я создал скрипт для очистки названий продуктов с этой веб-страницы с ​​помощью модуля запросов. Когда я запускаю сценарий, я вижу код состояния 200, но сценарий не дает никаких результатов. Как я могу получить результаты с веб-страницы с помощью модуля запросов?

from bs4 import BeautifulSoup
import requests

link = "https://branddb.wipo.int/en/advancedsearch/results?sort=score%20desc&strategy=concept&rows=30&asStructure=%7B%22_id%22:%2262a3%22,%22boolean%22:%22AND%22,%22bricks%22:%5B%7B%22_id%22:%2262a4%22,%22key%22:%22type%22,%22value%22:%5B%22AO%22,%22EMBLEM%22,%22GI%22,%22INN%22,%22TRADEMARK%22%5D%7D%5D%7D&_=1722527941041&fg=_void_&start=0"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
    'Accept-Encoding': 'gzip, deflate, br, zstd',
    'Accept-Language': 'en-US,en;q=0.9',
    'referer': 'https://branddb.wipo.int/',
    'origin': 'https://branddb.wipo.int',
}
res = requests.get(link,headers=headers)
print(res.status_code)
soup = BeautifulSoup(res.text,"lxml")
for item in soup.select("span.brandName"):
    print(item.get_text())

Взгляните на исходный код страницы, а не через проверку в браузере.

Diptangsu Goswami 01.08.2024 18:32

Я предполагаю, что это потому, что вы используете requests, который не может обрабатывать JavaScript.

John Gordon 04.08.2024 02:46
Почему в 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
2
116
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, содержимое динамическое. Вместо этого используйте селен. Если селен и веб-менеджер не установлены, установите их.

pip3 install selenium
pip3 install webdriver-manager

Код:

from selenium import webdriver as wb
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import time

# Set up Selenium with ChromeDriver
sr = Service(ChromeDriverManager().install())
dr = wb.Chrome(service=sr)


link = "https://branddb.wipo.int/en/advancedsearch/results?sort=score%20desc&strategy=concept&rows=30&asStructure=%7B%22_id%22:%2262a3%22,%22boolean%22:%22AND%22,%22bricks%22:%5B%7B%22_id%22:%2262a4%22,%22key%22:%22type%22,%22value%22:%5B%22AO%22,%22EMBLEM%22,%22GI%22,%22INN%22,%22TRADEMARK%22%5D%7D%5D%7D&_=1722527941041&fg=_void_&start=0"

# Fetch the content from the link
dr.get(link)

# Wait for the dynamic content to load 
time.sleep(5)

# Get the page source after the dynamic content has loaded
html_content = dr.page_source

# Close the browser
dr.quit()

# Parse the HTML with BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')
brand_names = soup.select('.brandName')

for brand in brand_names:
    print(brand.get_text())
    

Выход:

SFLOORING
MultiMice
MADELEINE PRESS
exia
Ответ принят как подходящий

Страница загружается динамически, вы можете использовать инструмент автоматизации браузера, такой как Selenium или драматург, для визуализации страницы или лучше:

Вы можете очистить API, который возвращает зашифрованные ответы Base64 AES. Чтобы расшифровать AES, вам необходимо установить криптографическую библиотеку, например PyCryptodome:

pip install pycryptodome

С помощью API вы можете получить до 360 записей за один запрос:

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64
import requests
import json


def decrypt(base64_input):
    key = "8?)i_~Nk6qv0IX;2"
    cipher = AES.new(key.encode('utf-8'), AES.MODE_ECB)

    decoded_input =  base64.b64decode(base64_input)  
    decrypted_bytes = cipher.decrypt(decoded_input)
    plaintext = unpad(decrypted_bytes, AES.block_size).decode('utf-8')

    return plaintext


payload = {
    "sort": "score desc",
    "strategy": "concept",
    "rows": 360,
    "start": 0,
    "fg": "_void_",
    "asStructure": json.dumps({
        "boolean": "AND",
        "bricks": [
            {"key": "type", "value": ["AO", "EMBLEM", "GI", "INN","TRADEMARK"]}
        ]
    })
}

url = 'https://api.branddb.wipo.int/search'
response = requests.post(url, json=payload)

decrypted_response = decrypt(response.text)
docs = json.loads(decrypted_response)['response']['docs']

print(docs)

Это отличное решение. Однако у меня есть один вопрос по этому поводу. Не могли бы вы сказать мне, где вы нашли этот ключ, 8?)i_~Nk6qv0IX;2? Спасибо.

SMTH 04.08.2024 20:20

@SMTH в исходном коде, в частности этот файл. На сайте используется CryptoJS, выполнив поиск и используя отладчик, я смог найти ключ.

GTK 04.08.2024 20:26

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