如何从子类别(python,亚马逊)中的所有页面获取所有产品
How to get all the products from all pages in the subcategory(python, amazon)
如何获取子类别中所有页面的所有产品?我附上了程序。现在我的程序只从第一页开始。我想从所有 +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)
# 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()
我已经制作了一种方法,该方法将从所有页面打印项目列表并递归调用它,在方法结束时我单击下一步按钮。我没有给出中断和退出条件,我相信你可以管理它。 "list_all_items" 方法是执行所需操作的逻辑。
同时取消我评论过的代理部分。
让我将这个问题分解为几个步骤,以便您了解这里需要做什么。
首先,您需要从一个页面中获取所有产品。
然后,您需要获取所有页面并在每个页面上重复第一步。
现在我不知道 Python,所以我会尽量以通用的方式来做这件事。
首先,您需要创建一个值为 0 的整数。
之后,您需要获取页数。为此,请检查:
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 i 将通过 ++ 获得一个增量,因此在每个循环之后,它增加 1。
因为你想获取大量数据,最好通过直接 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.S。检查 this ticket 以便能够将代理与 requests
库
一起使用
如何获取子类别中所有页面的所有产品?我附上了程序。现在我的程序只从第一页开始。我想从所有 +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)
# 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()
我已经制作了一种方法,该方法将从所有页面打印项目列表并递归调用它,在方法结束时我单击下一步按钮。我没有给出中断和退出条件,我相信你可以管理它。 "list_all_items" 方法是执行所需操作的逻辑。
同时取消我评论过的代理部分。
让我将这个问题分解为几个步骤,以便您了解这里需要做什么。
首先,您需要从一个页面中获取所有产品。
然后,您需要获取所有页面并在每个页面上重复第一步。
现在我不知道 Python,所以我会尽量以通用的方式来做这件事。
首先,您需要创建一个值为 0 的整数。 之后,您需要获取页数。为此,请检查:
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 i 将通过 ++ 获得一个增量,因此在每个循环之后,它增加 1。
因为你想获取大量数据,最好通过直接 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.S。检查 this ticket 以便能够将代理与 requests
库