【问题标题】:next page option selection in amazon.in web page [duplicate]amazon.in 网页中的下一页选项选择 [重复]
【发布时间】:2017-09-20 07:56:13
【问题描述】:

我正在尝试从 Amazon.in 网页收集产品的 ASIN。我有代码可以打开网络驱动程序并搜索产品名称并导航到产品页面的第一页。它能够收集仅第一页的数据,但如何移动到下一页以收集相同的数据。 这是我的代码:

import time
import json
import re
import numpy as np
from bs4 import BeautifulSoup
from selenium import webdriver
import urllib.request
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
from selenium.webdriver.common.keys import Keys
import pandas as pd


temp = []


def init_driver():
    driver = webdriver.Chrome(executable_path = "C:\\Users\\Desktop\\chromedriver")
    driver.wait = WebDriverWait(driver, 10)
    return driver


def get_asin(driver):

    driver.get("https://www.amazon.in")
    print ('Getting the URL')
    HTML = driver.page_source
    search_button = driver.find_element_by_id("twotabsearchtextbox")
    search_button.send_keys("Mobiles")
    select_button = driver.find_element_by_class_name("nav-input")
    select_button.click()
    HTML1=driver.page_source
    soup = BeautifulSoup(HTML1, "html.parser")


    styles = soup.find_all('li')
    #print(styles)
    #print(type(styles))
    ASIN=[]
    for link in styles:
        if link.has_attr('data-asin'):
            ASIN.append(link['data-asin'])

    return(ASIN)
    #print(ASIN)


if __name__ == "__main__":
    driver = init_driver()
    ASIN_NO = get_asin(driver)
    #time.sleep(3)
    #print ('opening search page')
    #for i in range(0,len(ASIN_NO)):
        #scrape(driver,ASIN_NO[i])

    print (ASIN_NO)
    time.sleep(5)

我已经尝试了以下两种显示错误的语法:

select_button = driver.find_element_by_id('pagnNextString')
select_button.click()

日志中的异常:

WebDriverException:消息:未知错误:元素 ... 在点 (778, 606) 处不可点击。 其他元素会收到点击:

select_button = driver.find_element_by_class_name('srSprite pagnNextArrow')
select_button.click()

InvalidSelectorException:消息:无效选择器:复合类 名字不允许

请帮助正确的方法。 提前致谢。

【问题讨论】:

    标签: python-3.x selenium-webdriver web-scraping beautifulsoup amazon


    【解决方案1】:

    要能够点击Next 按钮,您可以使用以下代码:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    next_button = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "pagnNextString")))
    next_button.location_once_scrolled_into_view
    next_button.click()
    

    这应该允许您等到按钮出现在页面上,向下滚动到它并成功单击

    【讨论】:

    • 是的。该代码可以很好地浏览下一页。但我在这里遇到了一个问题。所有的 ASIN 号码都只为第一页提取,但在浏览下一页时,它只被提取到第一页6 个 ASIN 编号并且被停止。您能在这种情况下提供帮助吗?
    • 恕我直言,没有必要使用 BeautifulSoup,因为您可以简单地使用 Selenium 内置方法来解析当前页面。试试styles = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//li[@data-asin]")))
    【解决方案2】:

    我认为您必须最大化窗口,因为元素不可查看,这就是问题元素不可点击的原因

    driver.maximize_window()
    

    将此 xpath 用于下一个按钮(针对 InvalidSelctor 问题)

    .//*[@id='nav-search']/form/div[2]/div/input
    

    我对python没有太多的了解。这是 java 编码在我的系统中运行良好。将其转换为 Python

    WebDriver driver=new FirefoxDriver();
    driver.get("https://www.amazon.in");
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    WebElement search_txt=driver.findElement(By.xpath("//*[@id='twotabsearchtextbox']"));
    search_txt.sendKeys("Mobiles");
    driver.manage().window().maximize();
    driver.findElement(By.xpath(".//*[@id='nav-search']/form/div[2]/div/input")).click();
    WebElement select_btn=driver.findElement(By.xpath("//*[@id='pagnNextString']"));
    select_btn.click();
    

    【讨论】:

    • 这肯定解决不了InvalidSelectorException
    • 第一个问题是 WebDriverException: Message: unknown error: Element ... is not clickable at point (778, 606)。其他元素会收到点击:
    • 哦,是的,对...它也无法解决Element ... is not clickable at point异常:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多