Я создал скрипт для очистки названий продуктов с этой веб-страницы с помощью модуля запросов. Когда я запускаю сценарий, я вижу код состояния 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())
Я предполагаю, что это потому, что вы используете requests
, который не может обрабатывать JavaScript.
Похоже, содержимое динамическое. Вместо этого используйте селен. Если селен и веб-менеджер не установлены, установите их.
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 в исходном коде, в частности этот файл. На сайте используется CryptoJS, выполнив поиск и используя отладчик, я смог найти ключ.
Взгляните на исходный код страницы, а не через проверку в браузере.