网页抓取仅提供页面上的前 4 个元素

Posted

技术标签:

【中文标题】网页抓取仅提供页面上的前 4 个元素【英文标题】:web scraping gives only first 4 elements on a page 【发布时间】:2022-01-21 11:24:21 【问题描述】:

我试图用 selenium 废弃此页面上的搜索结果元素:https://shop.bodybuilding.com/search?q=protein+bar&selected_tab=Products,但结果它只给了我前 4 个元素。 我不确定为什么?这是一个javascript页面?以及如何删除此搜索页面上的所有元素? 这是我创建的代码:

import requests
import numpy as np
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Chrome(executable_path='C:/chromedriver')
url = 'https://shop.bodybuilding.com/search?q=protein+bar&selected_tab=Products'
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')
all_items = soup.find_all('div', 'class': 'ProductTile ProductTile--flat Animate AnimateOnHover Animate--fade-in Animate--animated')


for i in range(len(all_items)):
    prices=all_items[i].find('div', 'class': 'Price ProductTile__price').text
    names=all_items[i].find('p', 'class': 'ProductTile__title').text
    images=all_items[i].find('img')['src']
    url=all_items[i].find('a', 'class': 'Anchor ProductTile__image')['href']

    print(images)

    
    

这是此页面上名称的结果,如您所见,它仅抓取前 4 个元素!

BSN Protein Crisp Bars
Optimum Nutrition Protein Wafers
Herbaland Vegan Protein Gummies
Battle Bars Full Battle Rattle (FBR) Protein Bar

价格、图片和网址都一样吗?

【问题讨论】:

【参考方案1】:

如何解决

你必须滚动,所以所有项目都会被加载:

last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    time.sleep(1)

    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

soup = BeautifulSoup(driver.page_source, 'html.parser')
all_items = soup.find_all('div', 'class': 'ProductTile ProductTile--flat Animate AnimateOnHover Animate--fade-in Animate--animated')


for i in all_items:
    prices=i.find('div', 'class': 'Price ProductTile__price').text if i.find('div', 'class': 'Price ProductTile__price') else None
    names=i.find('p', 'class': 'ProductTile__title').text
    images=i.find('img')['src']
    url=i.find('a', 'class': 'Anchor ProductTile__image')['href']

    print(images)

【讨论】:

非常感谢,问题解决了!

以上是关于网页抓取仅提供页面上的前 4 个元素的主要内容,如果未能解决你的问题,请参考以下文章

抓取特定文本(字符串)的网页

请教网页里的特定数据怎么抓取?

如何用Java抓取网页的具体内容

抓取网页并通过单击按钮进行导航

如何抓取HTML页面数据

HTML 页面抓取