Beatifulsoup не возвращает полный HTML-код страницы

1

Я хочу очистить несколько страниц с сайта amazon, например, title, url, aisn, и я столкнулся с проблемой, когда скрипт обрабатывает только 15 продуктов, пока на странице он показывает 50. Я решил распечатать весь html для консоли, и я увидел, что html заканчивается на 15 продуктах без ошибок из скрипта. Вот часть моего скрипта

keyword = "men jeans".replace(' ', '+')

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 GTB5'}
url = "https://www.amazon.com/s/field-keywords={}".format(keyword)

request = requests.session()
req = request.get(url, headers = headers)
sleep(3)
soup = BeautifulSoup(req.content, 'html.parser')
print(soup)
Теги:
request
beautifulsoup

2 ответа

2
Лучший ответ

Это потому, что несколько элементов генерируются динамически. Может быть какое-то лучшее решение, кроме использования селена. Однако в качестве обходного пути вы можете попробовать вместо этого.

from selenium import webdriver
from bs4 import BeautifulSoup

def fetch_item(driver,keyword):
    driver.get(url.format(keyword.replace(" ", "+")))
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    for items in soup.select("[id^='result_']"):
        try:
            name = items.select_one("h2").text
        except AttributeError: name = ""
        print(name)

if __name__ == '__main__':
    url = "https://www.amazon.com/s/field-keywords={}"
    driver = webdriver.Chrome()
    try:
        fetch_item(driver,"men jeans")
    finally:
        driver.quit()

После запуска вышеуказанного скрипта вы должны получить 56 имен или что-то в результате.

  • 0
    я думал о том, что, возможно, продукт загружается через AJAX, но я отключил JavaScript в браузере, чтобы вручную проверять, будет ли он уменьшать количество продукта, и на самом деле он показывал только примерно на 5 меньше, так что в общей сложности 50 продуктов вместо 55
  • 0
    Это потому, что Amazon уже определил вас как бота, и они делают это по-разному. Сделайте передышку и бегите снова, тогда вы должны получить желаемые результаты. Благодарю.
Показать ещё 1 комментарий
0
import requests
from bs4 import BeautifulSoup

for page in range(1, 21):
    keyword = "red car".replace(' ', '+')
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 GTB5'}
    url = "https://www.amazon.com/s/field-keywords=" + keyword + "?page=" + str(page)
    request = requests.session()
    req = request.get(url, headers=headers)
    soup = BeautifulSoup(req.content, 'html.parser')
    results = soup.findAll("li", {"class": "s-result-item"})

    for i in results:
        try:
            print(i.find("h2", {"class": "s-access-title"}).text.replace('[SPONSORED]', ''))

            print(i.find("span", {"class": "sx-price-large"}).text.replace("\n", ' '))

            print('*' * 20)
        except:
            pass

Диапазон страниц Amazon max до 20 здесь, он просматривает страницы

  • 0
    Я попробовал ваш код, и он вернул мне 20 продуктов с одной страницы, но на самом деле доступно больше продуктов
  • 0
    Для меня я показываю 20 продуктов на странице. Вы хотите, чтобы это тоже сканировало страницы?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню