代码之家  ›  专栏  ›  技术社区  ›  ryy77

如何从子类别(python、amazon)的所有页面获取所有产品

  •  2
  • ryy77  · 技术社区  · 8 年前

    如何从子类别中的所有页面获取所有产品?我附上了程序。现在我的程序只从第一页开始。我想从所有+400页的子类别中获取所有产品,以便转到下一页提取所有产品,然后转到下一页等。我将感谢任何帮助。

    # selenium imports
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import random
    
    PROXY ="88.157.149.250:8080";
    
    
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--proxy-server=%s' % PROXY)
    # //a[starts-with(@href, 'https://www.amazon.com/')]/@href
    LINKS_XPATH = '//*[contains(@id,"result")]/div/div[3]/div[1]/a'
    browser = webdriver.Chrome(chrome_options=chrome_options)
    browser.get(
        'https://www.amazon.com/s/ref=lp_11444071011_nr_p_8_1/132-3636705-4291947?rh=n%3A3375251%2Cn%3A%213375301%2Cn%3A10971181011%2Cn%3A11444071011%2Cp_8%3A2229059011')
    links = browser.find_elements_by_xpath(LINKS_XPATH)
    for link in links:
        href = link.get_attribute('href')
        print(href)
    3 回复  |  直到 8 年前
        1
  •  2
  •   Andersson    8 年前

    由于您希望获取大量数据,最好使用直接HTTP请求获取,而不是使用Selenium导航到每个页面。。。

    尝试遍历所有页面并按如下方式获取所需数据

    import requests
    from lxml import html
    
    page_counter = 1
    links = []
    
    while True:
        headers = {"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0"}
        url = "https://www.amazon.com/s/ref=sr_pg_{0}?rh=n%3A3375251%2Cn%3A!3375301%2Cn%3A10971181011%2Cn%3A11444071011%2Cp_8%3A2229059011&page={0}&ie=UTF8&qid=1517398836".format(page_counter)
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            source = html.fromstring(response.content)
            links.extend(source.xpath('//*[contains(@id,"result")]/div/div[3]/div[1]/a/@href'))
            page_counter += 1
        else:
            break
    
    print(links)
    

    P、 美国支票 this ticket 能够将代理与一起使用 requests 图书馆

        2
  •  1
  •   Sachhya    8 年前
    # selenium imports
    import random
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    import time
    
    
    def list_all_items():
        # items = browser.find_elements_by_css_selector('.a-size-base.s-inline.s-access-title.a-text-normal')
        print "Start"
        item_list = []
        items = WebDriverWait(browser, 60).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".a-size-base.s-inline.s-access-title.a-text-normal")))
        print "items--->", items
        if items:
            for item in items:
                print item.text, "\n\n"
                item_list.append(item.text)
        #time.sleep(3)
        #next_button = WebDriverWait(browser, 60).until(EC.presence_of_element_located((By.ID, 'pagnNextString')))
        next_button = WebDriverWait(browser, 60).until(EC.element_to_be_clickable((By.ID, "pagnNextString"))) 
        print "next_button-->", next_button
        browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        print "____________SCROLL_DONE___"
        next_button.click()
        print "Click_done"
        list_all_items()
    #     next_button = browser.find_element_by_id('pagnNextString')
    #     next_button.click()
    
    # ifpagnNextString
    # https://www.amazon.com/s/ref=lp_11444071011_nr_p_8_1/132-3636705-4291947?rh=n%3A3375251%2Cn%3A%213375301%2Cn%3A10971181011%2Cn%3A11444071011%2Cp_8%3A2229059011
    
    
    PROXY = "88.157.149.250:8080";
    
    chrome_options = webdriver.ChromeOptions()
    # chrome_options.add_argument('--proxy-server=%s' % PROXY)
    # //a[starts-with(@href, 'https://www.amazon.com/')]/@href
    LINKS_XPATH = '//*[contains(@id,"result")]/div/div[3]/div[1]/a'
    browser = webdriver.Chrome(chrome_options=chrome_options)
    browser.maximize_window()
    browser.get('https://www.amazon.com/s/ref=lp_11444071011_nr_p_8_1/132-3636705-4291947?rh=n%3A3375251%2Cn%3A%213375301%2Cn%3A10971181011%2Cn%3A11444071011%2Cp_8%3A2229059011')
    
    list_all_items()
    

    我制作了一个方法,可以打印所有页面中的项目列表,并递归调用它,在方法的末尾,我单击next按钮。我没有给出休息和退出的条件,我希望你能应付。“list\u all\u items”方法是执行所需操作的逻辑。

    还取消了对我已注释的代理部分的注释。

        3
  •  1
  •   Anand    8 年前

    让我分几个步骤来解决这个问题,这样您就知道这里需要做什么了。

    首先,您需要从一个页面获取所有产品。

    然后,您需要获取所有页面,并在每个页面上重复第一步。

    现在我不懂Python,所以我将尽可能多地以通用的方式来实现这一点。

    首先,需要创建一个值为0的int。 之后,您需要获得页数。为此,请检查:

    numberOfPagesString = browser.find_element_by_xpath('//span[@class='pagnDisabled']').text
    
    numberOfPages = int(numberOfPagesString)
    
    i = 0
    

    然后需要创建一个循环。在循环中,您将在设置值0的地方增加int,最大值为400。

    所以现在,每当int不等于400时,您的循环将单击下一页并获取所有产品,然后执行您希望它执行的操作。这将导致如下结果:

    while i < numberOfPages **Here, as long as the value of i is less than 400, do this loop**
    
    **code to get all products on page here**
    
    **click on next page link**
    browser.find_element_by_id('pagnNextString').click
    
    i++ **here your i will become 1 after first page, 2 after second etc**
    

    总之,您要做的第一件事是确定页面上有多少页。

    然后,您将从浏览器返回的字符串中创建一个int。

    然后创建一个值为0的int,每次迭代循环时,都将使用该int检查是否达到最大页数。

    之后,您将首先从页面中获取所有产品(如果您不这样做,它将跳过第一页)。

    最后,点击下一页按钮。

    为了完成它,你需要用++得到一个增量,所以在每次循环之后,它会增加1。