【问题标题】:How to scrape all the pages in the website如何抓取网站中的所有页面
【发布时间】:2021-05-31 12:04:59
【问题描述】:

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

我想循环浏览这 10 个页面并抓取它们的名称和 href 下面是我的代码,它只连续刮了第一页 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()

【问题讨论】:

  • 现有代码有什么问题?您面临什么问题?
  • 它会刮掉第一页而不是其他 9 页我猜我的第一个 for 循环是错误的,但我已经尝试纠正它但它不起作用
  • /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 xpath 定位器应该找到什么元素?
  • 名称和href
  • 好吧,我之前已经尝试过回答你了。此代码有问题,即使从整个第一页也无法获取数据。只从单品上就可以了。这里根本没有尝试打开下一页。

标签: python selenium loops selenium-webdriver web-scraping


【解决方案1】:

如果你想从下一页获取元素,那么你必须在链接>click()

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

具有其他更改的最少工作代码。

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

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

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)

顺便说一句:

这个方法可以用while True 和一些方法来识别是否有链接> - 并在没有> 时退出循环。这样它就可以处理任意数量的页面。


其他方法。

当您手动访问几个页面时,您应该会看到第二个页面的 URL 为 ?cp=2,第三个页面的 URL 为 ?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 来获取任意数量的页面。


编辑:

带有while 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)

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)

【讨论】:

    【解决方案2】:

    我想如果您的代码工作正常,您只需要单击分页按钮。我发现它可以在 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()
    

    【讨论】:

      猜你喜欢
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 2022-12-01
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      相关资源
      最近更新 更多