Python 如何清除网站中的所有页面

Python 如何清除网站中的所有页面,python,selenium,loops,selenium-webdriver,web-scraping,Python,Selenium,Loops,Selenium Webdriver,Web Scraping,我想在这10页中循环浏览,从中找出他们的名字和HREF 下面是我的代码,它只连续刮取第1页10次: def name(): for i in range(1, 11): tag = driver.find_elements_by_xpath('/html/body/div[4]/main/div[9]/div/div/div/div/div/div/div[2]/div[2]/div[3]/div/div[5]/ol/li[3]/div/div/div/div/div/d

我想在这10页中循环浏览,从中找出他们的名字和HREF 下面是我的代码,它只连续刮取第1页10次:

def name():
    for i in range(1, 11):
        tag = driver.find_elements_by_xpath('/html/body/div[4]/main/div[9]/div/div/div/div/div/div/div[2]/div[2]/div[3]/div/div[5]/ol/li[3]/div/div/div/div/div/div[2]/div[1]/div[2]/div/h4')
        for a in tag:
            for name in a.find_elements_by_tag_name('a'):
                links = name.get_attribute("href")
                names = name.get_attribute('text')
                watches_name.append(names)
                watches_link.append(links)
                # print(watches_name)
                # print(watches_link)


name()

我想如果你的代码工作正常,你只需要点击分页按钮。我发现它可以通过css选择器
(“#Caret_Right_Line_Sm”)
找到。尝试将此行添加到函数中:

def name():
    for i in range(1, 11):
        tag = driver.find_elements_by_xpath('/html/body/div[4]/main/div[9]/div/div/div/div/div/div/div[2]/div[2]/div[3]/div/div[5]/ol/li[3]/div/div/div/div/div/div[2]/div[1]/div[2]/div/h4')
        for a in tag:
            for name in a.find_elements_by_tag_name('a'):
                links = name.get_attribute("href")
                names = name.get_attribute('text')
                watches_name.append(names)
                watches_link.append(links)
                # print(watches_name)
                # print(watches_link)
        driver.find_elements_by_css_selector('#Caret_Right_Line_Sm')[1].click()

name()

如果您想从下一页中获取元素,则必须在链接

driver.find_element_by_css_selector('.sku-list-page-next').click()

最小的工作代码和其他更改

我将xpath简化为更简单的东西。我将名称、链接成对保留,因为在CSV文件或数据库中编写,或者过滤和排序更简单

我不得不使用更长的睡眠时间,有时我的浏览器需要更多的时间来更新页面上的元素

from selenium import webdriver
import time

url = 'https://www.bestbuy.com/site/promo/health-fitness-deals'

driver = webdriver.Firefox()
driver.get(url)

time.sleep(2)

# page "Hello! Choose a Country" - selecting Unitet State flag
driver.find_element_by_class_name('us-link').click()

items = []

for page in range(1, 11):

    print('\n[DEBUG] wait 15 seconds to update page\n')
    time.sleep(15)

    print('\n--- page', page, '---\n')

    all_links = driver.find_elements_by_css_selector('#main-results h4 a')
    for a in all_links:
        link = a.get_attribute("href")
        name = a.get_attribute('text')
        items.append( [name, link] )
        print(name)

    print('\n[DEBUG] click next\n')
    driver.find_element_by_css_selector('.sku-list-page-next').click()
    
#print(items)
顺便说一句:

此方法可以使用
而不是True
,以及一些方法来识别是否存在链接
,并在没有
时退出循环。这样,它可以处理任意数量的页面


其他方法

当您手动访问几个页面时,您应该看到第二个页面的url带有
?cp=2
,第三个带有
?cp=3
,等等。因此您可以使用它来加载页面

driver.get(url + '?cp=' + str(page+1) )

最小工作代码

from selenium import webdriver
import time

url = 'https://www.bestbuy.com/site/promo/health-fitness-deals'

driver = webdriver.Firefox()
driver.get(url)

time.sleep(2)

# page "Hello! Choose a Country" - selecting Unitet State flag
driver.find_element_by_class_name('us-link').click()

items = []

for page in range(1, 11):

    print('\n[DEBUG] wait 15 seconds to update page\n')
    time.sleep(15)

    print('\n--- page', page, '---\n')

    all_links = driver.find_elements_by_css_selector('#main-results h4 a')
    for a in all_links:
        link = a.get_attribute("href")
        name = a.get_attribute('text')
        items.append( [name, link] )
        print(name)

    print('\n[DEBUG] load next url\n')
    driver.get(url + '?cp=' + str(page+1) )
    
#print(items)
此方法还可以使用
while True
和变量
page
来获取任意数量的页面


编辑:

带有
而为True的版本

from selenium import webdriver
import time

url = 'https://www.bestbuy.com/site/promo/health-fitness-deals'

driver = webdriver.Firefox()
driver.get(url)

time.sleep(2)

# page "Hello! Choose a Country" - selecting Unitet State flag
driver.find_element_by_class_name('us-link').click()

items = []

page = 1

while True:

    print('\n[DEBUG] wait 15 seconds to update page\n')
    time.sleep(15)

    print('\n--- page', page, '---\n')

    all_links = driver.find_elements_by_css_selector('#main-results h4 a')
    for a in all_links:
        link = a.get_attribute("href")
        name = a.get_attribute('text')
        items.append( [name, link] )
        print(name)

    page += 1

    print('\n[DEBUG] load next url\n')
    driver.get(url + '?cp=' + str(page) )

    if driver.title == 'Best Buy: Page Not Found':
        print('\n[DEBUG] exit loop\n')
        break
    
#print(items)


什么与现有代码不兼容?你遇到了什么问题?它刮到了第一页而不是其他9页我想我的第一个for循环是错误的,但我已经试着纠正了它,但它不起作用什么元素是
/html/body/div[4]/main/div[9]/div/div/div/div/div/div[2]/div[3]/div/div/div[5]/ol/li[3]/div/div/div/div/div/div/div[2]/div[1]/div[2]/div/h4
xpath定位器需要找到?名称和hrefwell,我之前已经尝试过回答您了。此代码有问题,它甚至无法从整个第一页获取数据。只从一个单一的产品就可以了。这里根本没有试图打开下一页。
from selenium import webdriver
import time

url = 'https://www.bestbuy.com/site/promo/health-fitness-deals'

driver = webdriver.Firefox()
driver.get(url)

time.sleep(2)

# page "Hello! Choose a Country" - selecting Unitet State flag
driver.find_element_by_class_name('us-link').click()

items = []

page = 1

while True:

    print('\n[DEBUG] wait 15 seconds to update page\n')
    time.sleep(15)

    print('\n--- page', page, '---\n')

    all_links = driver.find_elements_by_css_selector('#main-results h4 a')
    for a in all_links:
        link = a.get_attribute("href")
        name = a.get_attribute('text')
        items.append( [name, link] )
        print(name)

    page += 1
    
    print('\n[DEBUG] click next\n')
    item = driver.find_element_by_css_selector('.sku-list-page-next')
    if item.get_attribute("href"):
        item.click()
    else:
        print('\n[DEBUG] exit loop\n')
        break        
    
#print(items)