【问题标题】:Web Scraping issue on page load with infinite scroll无限滚动页面加载时的网页抓取问题
【发布时间】:2019-05-16 14:07:57
【问题描述】:

我必须抓取一个电子商务网站,该网站在首页加载 45 种产品,然后在滚动到页面末尾时加载额外的 45 种产品。

我正在使用 Python 一个 Selenium Web 驱动程序来抓取此页面。

Ajax 似乎会在每次后续重新加载时替换容器,因此在加载所有产品后无法提取所有数据。

附上您的参考代码。请指导我如何刮掉所有产品

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import pandas
from numpy import long

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

driver = webdriver.Chrome()
html=driver.get("https://www.ajio.com/women-jackets-coats/c/830316012")
assert 'Ajio' in driver.title
content = driver.find_elements_by_class_name('item')
totalitems=long(driver.find_element_by_class_name('length').text.strip(' Items Found').replace(',','',10))

loop_count=int(((totalitems-len(content))/len(content)))

print(loop_count)

data=[]
row=['Brand','Description','Offer_Price','Original_Price','Discount']
data.append(row)

for i in range(1,loop_count):
    content = driver.find_elements_by_class_name('item') 
    print(i)
    print(len(content))

    for item in content:
        row=[]
        row.append(item.find_element_by_class_name('brand').text.strip())
        row.append(item.find_element_by_class_name('name').text.strip())
        row.append(item.find_element_by_class_name('price').text.strip().strip('Rs. '))
        try:
            row.append(item.find_element_by_class_name('orginal-price').text.strip('Rs. '))
        except NoSuchElementException as exception:
            row.append(item.find_element_by_class_name('price').text.strip('Rs. '))

        try:
            row.append(item.find_element_by_class_name('discount').text.strip())
        except NoSuchElementException as exception:
            row.append("No Discount")

        data.append(row)
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight-850);")
    try:
        myElem = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CLASS_NAME, 'loader')))
    except TimeoutException:
        print("Loading took too much time!")



df = pandas.DataFrame(data)
df.to_csv(r"C:\Ajio.csv", sep=',',index=False, header=False, mode='w')   #mode='a' for append

【问题讨论】:

    标签: python selenium-webdriver web-scraping


    【解决方案1】:

    听起来您遇到的问题是基于后续重新加载/滚动而抓取的数据不一致。

    一种解决方案是存储一个高于此函数范围的数据结构,以记录您迄今为止看到的项目。当页面重新加载/滚动时,您可以检查每个项目是否已经存在于数据结构中,以及它是否没有将其添加到结构中,直到您可以确保您已经点击了页面上的所有可能项目。

    祝你好运!

    【讨论】:

    • 嗨,即使我在循环中完全滚动后刮掉所有项目,数据似乎也不完全可用。即使我得到重复的记录,我也可以,因为我可以使用 Excel 删除重复的记录。似乎数据正在重新加载到 div 当我向下滚动并在网页上为第一个项目执行 Ctrl+F 时,找不到它。同样,当我在顶部向上滚动时,我在页面顶部时找不到最后一项(产品)。我不是网络开发人员,因此不知道这项技术叫什么。如果有人可以帮助确定正确方向的技术
    • 再次检查,如果我关闭我的网络/互联网,然后如果我向上或向下滚动页面,之前下载的所有数据都会出现在屏幕上,这意味着数据在某个地方在屏幕上填充的页面中。还是来自缓存?仍然没有任何解决方案
    • 我已经设法解决了这个问题。我没有在这里使用 Selenium,而是使用 Requests 来加载返回 JSON 的 API,然后读取 JSON。这解决了我的网络报废的目的。读取 JSON 比使用 Selenium 读取网站要快得多我将页面编号作为参数传递给 JSON API 以加载下一页数据。
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2020-02-18
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    相关资源
    最近更新 更多